2010-08-17 66 views
1

我一直在使用SetUnhandledExceptionFilter很久,我的处理程序走过堆栈并使用dbghelp.dll将地址转换为文件/行引用。然后它将它写入日志文件,并为用户提供具有相同信息的对话框。这用于工作得很好。这些天,但我得到一个完全无用的堆栈:SetUnhandledExceptionFilter处理程序中无用的堆栈跟踪

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”是我的应用程序。现在,如果我将调试器从异常处理程序中移回堆栈,我最终会得到一个完全不同的临时堆栈,其中包含导致崩溃的所有调用。这是我实际想要为用户登录的信息。就好像异常处理程序在与主应用程序分离的堆栈上执行一样。

我需要的是实际应用程序堆栈的堆栈信息,其中包括导致崩溃的所有调用。有没有简单的方法从异常处理程序中获取?

回答

0

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

+0

如何使用RtlCaptureStackBackTrace http://msdn.microsoft.com/en-us/library/bb204633(VS.85).aspx – 2010-08-19 05:58:21