2010-08-17 70 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