Стек вызовов в Windows и Mac OS X / Linux без Символов

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

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

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

1
задан Middleware 9 July 2010 в 07:24
поделиться

1 ответ

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

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

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

2
ответ дан 2 September 2019 в 23:11
поделиться