Возможно ли получить трассировку стека в Windows без наличия файлов PDB? Если да, то как?

я знаю StackWalk64() API можно использовать для печати стека вызовов в Windows.
Было довольно много дискуссий о том, как это работает на SO.

Стек вызова функций в C ++

StackWalk64 в Windows — получить имя символа

StackWalker — Прогулка по стеку

Я заметил StackWalk64() требует файл символов (файл PDB) для представления, чтобы узнать имена функций. Если файл pdb отсутствует, информация о символе не печатается.

Мои вопросы —

  1. Правильно ли мое понимание? Я не нахожу это документированным.
  2. Этот API доступен для тестирования / отладки? Как заставить это работать на
    производственные системы, где pdb файлов нет?
  3. В Linux, если файл символов отсутствует, он искажается, как печатается стек вызовов. По крайней мере, это может быть достигнуто на окнах?

1

Решение

Ответы на ваши вопросы —

1. Правильно ли мое понимание? Я не нахожу это документированным.

Да. Вам нужны символы для печати имен функций. Не нужно иметь частные символы, публичные символы также будут работать (если вы хотите отправить pdbs).

2. Предоставляется ли этот API для целей тестирования / отладки? Как заставить это работать на
производственные системы, где pdb файлов нет?

Этот API в основном предназначен для отладчиков, но его можно использовать во многих инструментах, например Расширенный диспетчер задач, который показывает стек потоков (ProcessExplorer).
Если вам нужны имена функций, тогда требуются символы (по крайней мере, публичные символы).

3. В Linux, если файл символов отсутствует, он искажается, как печатается стек вызовов. По крайней мере, это может быть достигнуто на окнах

То, что вы можете достичь без символов — стек вызовов будет иметь имя по модулю со смещением (от начала модуля), например xyz.dll + 0x62

0

Другие решения

Если это просто трассировка стека, CaptureStackBackTrace () должно быть достаточно для вас.

void *stack[48];
USHORT count = CaptureStackBackTrace(0, 48, stack, NULL);
for(USHORT c = 0; c < count; c++)
printf("addr %02d: %p\n", c, stack[c]);
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector