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只重複相同的幀。
什麼問題,以及如何解決?
是的,這是問題所在。 – Calmarius 2009-02-13 12:53:03