Бесполезная трассировка стека в обработчике SetUnhandledExceptionFilter - PullRequest
1 голос
/ 17 августа 2010

Я давно использую SetUnhandledExceptionFilter, и мой обработчик обходит стек и использует dbghelp.dll для преобразования адресов в ссылки File / Line. Затем он записывает это в файл журнала и выводит диалоговое окно с той же информацией для пользователя. Это используется для работы просто отлично. Однако в эти дни я получаю совершенно бесполезный стек:

1004bbaa: Lgid.dll, C:\Data\Code\Lgi\trunk\src\win32\Lgi\LgiException.cpp:175
10057de0: Lgid.dll, C:\Data\Code\Lgi\trunk\src\win32\Lgi\GApp.cpp:107
7c864191: kernel32.dll, UnhandledExceptionFilter+0x1c7
102158ed: MSVCRTD.dll, winxfltr.c:228
006dc1a7: Scribe.exe, crtexe.c:345
7c817077: kernel32.dll, RegisterWaitForInputIdle+0x49
00000000: Scribe.exe

Где 'Scribe.exe' - мое приложение. Теперь, если я прогоню отладчик из обработчика исключений и создам резервную копию стека на несколько кадров, я в конечном итоге попаду в совершенно другой временный стек, который фактически включает все вызовы, которые привели к сбою. Какую информацию я на самом деле хочу зарегистрировать для пользователя. Это как если бы обработчик исключений выполнялся в отдельном стеке от основного приложения.

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

Ответы [ 2 ]

0 голосов
/ 19 августа 2010
0 голосов
/ 17 августа 2010

Согласно http://www.eptacom.net/pubblicazioni/pub_eng/except.html я могу получить EIP и EBP исключения из члена EXCEPTION_POINTERS 'Context'.Поэтому я попытался передать этот EBP моему стековому проходу в качестве начальной точки, и тогда он мог бы правильно обходить стек приложений.Пока я ставлю EIP в качестве первой точки в стеке, я получаю все это.

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