я знаю StackWalk64()
API можно использовать для печати стека вызовов в Windows.
Было довольно много дискуссий о том, как это работает на SO.
StackWalk64 в Windows — получить имя символа
StackWalker — Прогулка по стеку
Я заметил StackWalk64()
требует файл символов (файл PDB) для представления, чтобы узнать имена функций. Если файл pdb отсутствует, информация о символе не печатается.
Мои вопросы —
Ответы на ваши вопросы —
1. Правильно ли мое понимание? Я не нахожу это документированным.
Да. Вам нужны символы для печати имен функций. Не нужно иметь частные символы, публичные символы также будут работать (если вы хотите отправить pdbs).
2. Предоставляется ли этот API для целей тестирования / отладки? Как заставить это работать на
производственные системы, где pdb файлов нет?
Этот API в основном предназначен для отладчиков, но его можно использовать во многих инструментах, например Расширенный диспетчер задач, который показывает стек потоков (ProcessExplorer).
Если вам нужны имена функций, тогда требуются символы (по крайней мере, публичные символы).
3. В Linux, если файл символов отсутствует, он искажается, как печатается стек вызовов. По крайней мере, это может быть достигнуто на окнах
То, что вы можете достичь без символов — стек вызовов будет иметь имя по модулю со смещением (от начала модуля), например xyz.dll + 0x62
Если это просто трассировка стека, 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]);