在x86和x64中进行不同的seh过滤

时间:2018-02-26 09:20:59

标签: c++ windows exception seh

我正在实现错误消息的记录(它包括异常回溯的信息)。我在Reliable way to print exception backtrace in catch handler?问了如何做同样的问题。我决定查看x86x64平台上的callstack。堆栈比较的结果让我感到惊讶。这是我的计划:

#include <iostream>
#include <Windows.h>

using namespace std;

struct A
{
};

void foo3()
{
    throw A();
}

void foo2()
{
    foo3(); 
}

void foo1()
{
    foo2();
}

void foo()
{
    try
    {
        foo1();
    }
    catch(...)
    {
        cout << "exception rethrowing" << endl;
        throw;
    }
}
int seh_filter(_EXCEPTION_POINTERS* exception)
{
    cout << "SEH FILTER" << endl;
    return EXCEPTION_EXECUTE_HANDLER;
}

int main(void)
{
    __try
    {
        foo();
    }
    __except(seh_filter(GetExceptionInformation()))
    {
        cout << "SEH catch handler" << endl;
    }
    return 0;
}

我在seh_filter设置断点以探索回溯并运行调试版本。这是图像:

enter image description here 好像我无法在x64平台上打印完整的调用堆栈。发生了什么事?我无法理解为什么callstacks变化如此剧烈?我在Windows 10上使用msvc2013。

0 个答案:

没有答案