gpt4 book ai didi

c++ - 我可以从 Windows SEH 异常中解码 C++ 异常吗? (如果是这样,怎么做?)

转载 作者:IT老高 更新时间:2023-10-28 22:41:38 25 4
gpt4 key购买 nike

如果出现未处理的 C++ 异常,我想打印:

  1. C++ 异常的消息(what())
  2. 堆栈跟踪。

为了获得堆栈跟踪,我将 SetUnhandledExceptionFilterStackWalker 结合使用图书馆:

struct FooStackWalker : StackWalker
{
virtual void OnCallstackEntry(CallstackEntryType, CallstackEntry &entry) override
{
std::cerr << entry.lineFileName << " (" << entry.lineNumber << "): " << entry.undFullName << std::endl;
}
};

LONG WINAPI UnhandledExceptionHandler(LPEXCEPTION_POINTERS pointers)
{
FooStackWalker walker;
walker.ShowCallstack(::GetCurrentThread(), pointers->ContextRecord);
::TerminateProcess(::GetCurrentProcess(), 1);
}


int main()
{
::SetUnhandledExceptionFilter(UnhandledExceptionHandler);
}

我已经很好地打印了堆栈跟踪,但现在获取 what 很困难。

有什么方法可以将 SEH 异常解码为 C++ 异常,以便在终止之前调用此成员函数?

最佳答案

为什么不使用已经为您提供异常详细信息的 C++ 机制?它不是 SEH 过滤器独有的(尽管它SetUnhandledExceptionFilter 独有的)。您只需要正确嵌套处理程序:

int main()
{
try {
return cppexcept_main();
}
catch (const std::exception& e)
{
//use e.what()
}
}

int cppexcept_main()
{
__try {
return application_main();
}
__except(GrabStackTrace(GetExceptionInformation()), EXCEPTION_CONTINUE_SEARCH) {
/* never reached due to EXCEPTION_CONTINUE_SEARCH */
}
}

关于c++ - 我可以从 Windows SEH 异常中解码 C++ 异常吗? (如果是这样,怎么做?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13148065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com