Callstack в Windows и Mac OS X / Linux без символов - PullRequest
1 голос
/ 09 июля 2010

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

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

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

1 Ответ

2 голосов
/ 09 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...