Анализ Crashdump: CxxUnhandledExceptionFilter

У меня есть минидамп аварии для анализа. Моя программа представляет собой многопоточное приложение Qt5. Я не гуру отладки, но обычно я легко могу найти место, где программа не работает, но в этот раз я не могу. Я открыл файл дампа в Visual Studio 2010, нажал «Отладка только с нативным», и он показывает мне, где проблема: это поток с местоположением «__CxxUnhandledExceptionFilter». Стек вызовов такой:

msvcr100.dll()!_abort()
msvcr100.dll()!terminate()
program.exe!__CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS * pPtrs)
KERNELBASE.dll!_UnhandledExceptionFilter()
ntdll.dll!__RtlUserThreadStart()
ntdll.dll!__RtlUserThreadStart()

Я ожидал увидеть стек с программными функциями и внутренними функциями Qt. Но этот стек вызовов не говорит мне ничего интересного. Итак, пожалуйста, скажите мне, что такое поток «ExceptionFilter» и как я могу найти место, где программа на самом деле не удалась?


person YuriM    schedule 28.03.2014    source источник


Ответы (1)


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

То есть вы не видите строку, в которой произошло исключение.

К сожалению, это означает, что минидамп, скорее всего, не содержит полезной информации.

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

Посмотрите значение pPtrs->ExceptionRecord->ExceptionAddress, которое должно содержать EIP.

Из MSDN:

ExceptionAddress: адрес, по которому произошло исключение.

Чтобы получить трассировку стека в момент возникновения исключения, прочитайте http://support.microsoft.com/kb/313109.

person sashoalm    schedule 28.03.2014
comment
Вау, вы так быстро ответили, спасибо :) Адрес исключения указывает на kernelbase.dll, насколько я вижу, это функция _RaiseException@16. Это ошибка ядра? - person YuriM; 28.03.2014
comment
@YuriM Лол, вряд ли. Вероятно, вы передали некоторые неверные аргументы функции WinApi или код, который вы вызвали, сделал это. Эти функции будут выполнять проверки работоспособности и выдавать исключение, если им не нравятся данные. Вы проверили остальные аргументы? В структуре может быть запись стека вызовов. - person sashoalm; 28.03.2014
comment
Я сделаю это позже на следующей неделе :) - person YuriM; 28.03.2014
comment
Я только что нашел статью о том, как получить трассировку стека — support.microsoft.com/kb/313109 - person sashoalm; 28.03.2014
comment
kb-313109 является решением. Он работает отлично, мне удалось сделать то, что я хотел сделать. - person YuriM; 31.03.2014