Как узнать, что мой callstack неверен? - PullRequest
0 голосов
/ 22 сентября 2009

Как я могу узнать, что стек вызовов, который отображается отладчиком при сбое моей программы, может быть неправильным и вводящим в заблуждение. Например, когда стек вызовов сообщает, что следующие кадры могут отсутствовать или быть неправильными, что это на самом деле означает? Также, что означает номер + после вызова функции в стеке вызовов:

kernel32! LoadLibrary + 0x100 байт

Должен ли этот номер быть важным для меня, и правда ли, что если этот номер большой, стек вызовов может быть неправильным?

Извините, если я спрашиваю что-то тривиальное и очевидное

Спасибо всем

Ответы [ 2 ]

2 голосов
/ 22 сентября 2009

Как правило, вы можете доверять своему стеку вызовов, чтобы быть правильным.

Однако, если вы явно перебрасываете исключения, а не позволяете им пузыриться в стеке вызовов, фактическая ошибка может быть скрыта от трассировки стека.

1 голос
/ 22 сентября 2009

Для начала со 2-го: kernel32!LoadLibrary + 0x100 bytes означает, что вызов был из функции LoadLibrary (смещение: +100 байт); по-видимому, не было никакой символической информации, точно идентифицирующей звонящего. Само по себе это не является причиной повреждения стека вызовов.

Стек вызовов может быть поврежден, если функции перезаписывают значения в стеке (т. Е. Из-за переполнения буфера. Вероятно, это будет выглядеть как '0x41445249' (если бы это было мое имя для перезаписи) в качестве функции вызова. диапазоны памяти программ.

Способ диагностики причины сбоя - установить точки останова для функций, определенных стеком вызовов. Или используйте ваш отладчик для отслеживания (в зависимости от отладчика и системы). Интересно выяснить, какие аргументы были включены в звонки. Обычно указатели - хорошее начало (указатели NULL, неинициализированные указатели). Удачи.

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