2009-02-13 255 views
0

我試圖讓我的程序轉儲並在崩潰時保存它的堆棧跟蹤。我安裝了自己的win32 SE處理程序_set_se_translator,並嘗試將堆棧跟蹤轉儲爲StackWalk64,最後拋出一個C++異常(實際上是在捕獲日誌時執行此操作)。爲什麼StackWalk64總是返回true?

的代碼看起來是這樣的:

... 
_set_se_handlers(WIN32EXCEPTION::Win32ExceptionStuff); 
... 

void WIN32EXCEPTION::Win32ExceptionStuff(unsigned int Code, struct _EXCEPTION_POINTERS* Info) // static 
{ 
    STACKFRAME64 sf64; 
    sf64.AddrPC.Offset  = Info->ContextRecord->Eip; 
    sf64.AddrStack.Offset = Info->ContextRecord->Esp; 
    sf64.AddrFrame.Offset = Info->ContextRecord->Ebp; 
    sf64.AddrPC.Mode= sf64.AddrStack.Mode= sf64.AddrFrame.Mode= AddrModeFlat; 
    while (StackWalk64(IMAGE_FILE_MACHINE_I386,GetCurrentProcess(),GetCurrentThread(), 
     &sf64,Info->ContextRecord,0,SymFunctionTableAccess64,SymGetModuleBase64,0)) 
    { 
     //... Do something with the stack frames 
    } 
    throw WIN32EXCEPTION(/*...*/); 
} 

正如我在一些例子中看到的,但有一個問題:StackWalk64總是返回true和while循環變得無窮大。 StackWalk64只重複相同的幀。

什麼問題,以及如何解決?

回答

1

這看起來非常類似於我得到的代碼,而且確實有效。我能看到的唯一區別是我的代碼在填充它的任何部分之前使用ZeroMemory()來清除STACKFRAME64結構 - 這可能是必需的。

+0

是的,這是問題所在。 – Calmarius 2009-02-13 12:53:03