0

クラッシュ時にプログラムをダンプしてスタック トレースを保存しようとしました。独自の 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 は同じフレームのみを繰り返します。

何が問題で、どのように修正しますか?

4

1 に答える 1

2

これは私が持っているコードと非常によく似ていて、うまくいきます。私が見ることができる唯一の違いは、コードが ZeroMemory() を使用して STACKFRAME64 構造をクリアしてから、その一部を設定することです-これが必要になる場合があります。

于 2009-02-13T11:24:33.817 に答える