【问题标题】:Why does StackWalk64 return always true?为什么 StackWalk64 总是返回 true?
【发布时间】:2009-02-13 09:30:38
【问题描述】:

我试图让我的程序在崩溃时转储并保存它的堆栈跟踪。我用_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 只重复同一帧。

问题是什么,如何解决?

【问题讨论】:

    标签: c++ winapi crash stack-trace


    【解决方案1】:

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

    【讨论】:

    • 您也可以使用STACKFRAME64 sf64 = {0}; 将其归零。
    猜你喜欢
    • 1970-01-01
    • 2020-01-29
    • 2012-04-03
    • 2021-09-11
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多