我试图让我的程序转储并在崩溃时保存它的堆栈跟踪。我安装了我自己的 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 只重复同一帧。
问题是什么,如何解决?