クラッシュ時にプログラムをダンプしてスタック トレースを保存しようとしました。独自の win32 SE ハンドラーをインストール_set_se_translator
し、スタック トレースをダンプしてStackWalk64
、最終的に C++ 例外をスローしようとしました (これは、キャッチされたときに実際にログを記録します)。
コードは次のようになります。
...
_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 は同じフレームのみを繰り返します。
何が問題で、どのように修正しますか?