2010-07-09 4 views
1

В Windows, если нет символов для модуля, участвующего в callstack, скажем, о дампе сбоя, тогда весь вызов под этим модулем в стоп-металле был бы неправильным (не только имена пропущены, но также и последовательность).Callstack для Windows и Mac OS X/Linux без символов

В Linux или Mac OS X, если символы отсутствуют, имена функций не отображаются, но последовательность вызовов по-прежнему остается.

Какая разница в механизме разговора или генерации символов вызывает такую ​​разницу?

ответ

2

В Windows все еще можно получить полный стек вызовов для приложений без символьной информации, если в стек вызовов будут помещены указатели стека кадров. Эти указатели фрейма стека генерируются компилятором Visual Studio при компиляции с помощью отладки, но не при компиляции с оптимизацией (/ Ox). Поэтому, если вы все еще хотите оптимизировать указатели фреймов стека, вам нужно добавить параметр/Oy-compiler (Oy-stand для: не удалять указатели фрейма стека).

Указатели стековых кадров не более, чем просто указывают на следующий стек кадра. Поэтому отладчики и обработчики ошибок могут легко получить стек (смотря на указатели фрейма стека, чтобы следить за стеком, и используя обратные адреса в стеке).

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

Смежные вопросы