我正在实现错误消息的记录(它包括异常回溯的信息)。我在Reliable way to print exception backtrace in catch handler?问了如何做同样的问题。我决定查看x86
和x64
平台上的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
设置断点以探索回溯并运行调试版本。这是图像:
好像我无法在x64
平台上打印完整的调用堆栈。发生了什么事?我无法理解为什么callstacks变化如此剧烈?我在Windows 10上使用msvc2013。