SetUnhandledExceptionFilter处理程序中无用的堆栈跟踪

时间:2010-08-17 05:08:03

标签: windows exception-handling

我一直在使用SetUnhandledExceptionFilter很长一段时间,我的处理程序遍历堆栈并使用dbghelp.dll将地址转换为文件/行引用。然后它将其写入日志文件并为用户提供具有相同信息的对话框。这个USED工作得很好。然而,这些天我得到了一个完全没用的堆栈:

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 :(得分:0)

根据http://www.eptacom.net/pubblicazioni/pub_eng/except.html,我可以从EXCEPTION_POINTERS'Context'成员中获取异常的EIP和EBP。所以我尝试将EBP传递给我的堆栈walker作为它的初始点,然后它可以正确地遍历应用程序堆栈。只要我把EIP作为堆栈行走的第一点,我就得到了整个东西。

答案 1 :(得分:0)