我试图使程序转储并在崩溃时保存其堆栈跟踪。我使用_set_se_translator安装了自己的win32 SE处理程序,并尝试使用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仅重复同一帧。

有什么问题,如何解决?

最佳答案

这看起来与我获得的代码非常相似,并且确实有效。我可以看到的唯一区别是我的代码在填充其中的任何部分之前使用ZeroMemory()清除了STACKFRAME64结构-这可能是必需的。

10-08 09:13