У меня есть аварийный мини-дамп для анализа. Моя программа является многопоточным приложением 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» и как я могу найти место, где программа действительно потерпела неудачу?
Вы просматриваете приложение в точке, где необработанное исключение уже было обнаружено фильтром исключений по умолчанию.
То есть вы не видите линию, где произошло исключение.
К сожалению, это означает, что мини-дамп, вероятно, не содержит полезной информации.
Вы можете попробовать осмотреть _EXCEPTION_POINTERS
структуры, он может содержать EIP
инструкции, которая вызвала необработанное исключение.
Смотрите значение pPtrs->ExceptionRecord->ExceptionAddress
, что должно держать EIP
,
Из MSDN:
ExceptionAddress: адрес, где произошло исключение.
Чтобы получить трассировку стека в точке, где произошло исключение, прочитайте http://support.microsoft.com/kb/313109.
Других решений пока нет …