2009-02-13 260 views
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只重复相同的帧。

什么问题,以及如何解决?

回答

1

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

+0

是的,这是问题所在。 – Calmarius 2009-02-13 12:53:03