gpt4 book ai didi

c++ - 过滤关键/致命异常以与 AddVectoredExceptionHandler 一起使用

转载 作者:行者123 更新时间:2023-11-30 04:51:25 30 4
gpt4 key购买 nike

我正在尝试针对某些情况改进异常诊断(更像是基本的崩溃处理),其中 SetUnhandledExceptionFilter ( https://msdn.microsoft.com/en-us/library/windows/desktop/ms680634(v=vs.85).aspx ) 似乎无助于捕获 fatal error 。这种情况是在关闭时,不同的 atexit 函数和单例析构函数等正在运行(清理)。此外,由于不匹配的 noexcept 声明而导致析构函数终止的情况也值得关注。

使用 AddVectoredExceptionHandler ( https://msdn.microsoft.com/en-us/library/windows/desktop/ms679274(v=vs.85).aspx ) 实际上似乎是一个不错的选择,因为它的功能更像是调试器的“第一次机会异常”,但是它也因此在(方式)太多情况下被调用(还有正常异常、一些信号等)。

  1. 理想情况下会有某种方式来判断异常是否发生
    将被处理或者是否因此调用终止。
  2. 异常代码是另一种过滤方式——使用cppgenereated 抛出异常代码,很明显它应该继续 -我有一种感觉,样板化或试验太多了以及获取“正确”(致命)异常代码进行过滤的错误。

最佳答案

AddVectoredExceptionHandler 添加的 VEH 处理程序将在异常到达基于帧的处理程序之前处理异常。

SetUnhandledExceptionFilter 设置的过滤器将在基于帧的处理程序失败后处理异常。

正常处理(如try...excepttry...catch)和信号处理程序都实现为基于帧的处理程序,信号处理程序作为最后一个基于框架的处理程序。

在解开链之前,没有可靠的方法来区分致命非致命 异常。语言异常(代码 0xE06D7363)、其他软件异常和硬件异常(如代码 0xC0000005 的访问冲突)——都可能是致命的和非致命的。

因此,AddVectoredExceptionHandler 几乎没有用。除了 SetUnhandledExceptionFilter 之外,您还必须处理 set_terminatesignal_set_invalid_parameter_handler 等。

您可以通过设置 SIG_DFL 确保 signal 的处理程序回退到默认值,在这种情况下它将回退到 SetUnhandledExceptionFilter< 设置的处理程序

默认 _set_invalid_parameter_handler 有意不回退到由 SetUnhandledExceptionFilter 设置的处理程序,但是如果您将传递给 _set_invalid_parameter_handler 的函数设置为提高您自己的处理程序SEH 异常,它将回退到 SetUnhandledExceptionFilter 设置的处理程序。

我不记得 set_terminate 和其他的是什么。你需要试验一下。但作为最后的手段,您可能总是引发自己的 SEH 异常,用 __except 捕获它,并传递给 UnhandledExceptionFilter,然后您的 SetUnhandledExceptionFilter 回调将被调用:

__try
{
RaiseException(0xE0000001,0,0,NULL);
}
__except(UnhandledExceptionFilter(GetExceptionInformation()))
{
}

关于c++ - 过滤关键/致命异常以与 AddVectoredExceptionHandler 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54806802/

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