通过catch(...)从SEH异常中获取有意义的信息?

2023-12-26

早上好!

编辑:这不是重复的,因为它具体涉及 SEH,而不是代码级引发的异常。

我正在使用 SEH 来捕获一些不可靠的库引发的硬件错误。我想从包罗万象的异常中获取更多信息。下面的代码模拟了我正在做的事情。正如你所看到的,我正在使用 boost 的 current_exception_diagnostic_information,但它只是吐出“没有可用的诊断信息”。 - 不是很有帮助。

是否至少可以获得在未捕获异常的情况下本应返回的终止代码? (在本例中为 0xC0000005,访问冲突)

#include "stdafx.h"
#include <future>
#include <iostream>
#include <boost/exception/diagnostic_information.hpp>

int slowTask()
{
    //simulates a dodgy bit of code
    int* a = new int[5]();
    a[9000009] = 3;
    std::cout << a[9000009];
    return 0;
}

int main()
{
    {
        try
        {
            std::future<int> result(std::async(slowTask));
            std::cout<< result.get();
        }
        catch(...)
        {
            std::cout << "Something has gone dreadfully wrong:"
                << boost::current_exception_diagnostic_information()
                << ":That's all I know."
                << std::endl;
        }           
    }

    return 0;
}

Using catch (...)你根本得不到任何信息,无论是关于 C++ 异常还是 SEH。所以全局处理程序不是解决方案。

但是,您可以通过 C++ 异常处理程序获取 SEH 信息(catch),只要您还使用set_se_translator() https://msdn.microsoft.com/en-us/library/5z4bw5h5.aspx。的类型catch应该与翻译器内部构建和抛出的 C++ 异常相匹配。

您编写的函数必须是本机编译的函数(不是使用 /clr 编译的)。它必须采用无符号整数和指向 Win32 的指针_EXCEPTION_POINTERS结构作为参数。参数是调用 Win32 API 的返回值GetExceptionCode and GetExceptionInformation函数,分别。

或者你可以使用__try/__except,这是特定于 SEH 的。只要您没有 SEH,它们就可以在 C++ 内部使用,包括在使用 C++ 异常的程序中__try和C++try在同一函数中(要在同一块中捕获两种类型的异常,请使用辅助函数)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过catch(...)从SEH异常中获取有意义的信息? 的相关文章

随机推荐

  • 通过 ODBC 连接检索的表情符号数据显示为问号

    我从经典 ASP 页面连接到 MySQL 版本 5 5 50 log MySQL数据库设置如下 数据库字符集 utf8mb4 数据库排序规则 utf8mb4 general ci 表和字段 字符集 utf8mb4 排序规则 utf8mb4
  • 更新 mnesia 架构的最简单方法是什么?

    例如 我保存了 id name 在 mnesia 并想要更新到 id name age 我需要打电话吗transform table每次我更改架构时 最简单的方法是删除该表并重新创建它 如果需要保留表中的数据 mnesia transfor
  • 来自字符串“Yellow”的 Java 颜色

    有什么方法可以从字符串中获取颜色 例如 白色 Color color Field field Class forName java awt Color getField Yellow color Color field get null I
  • 动态添加的表单字段在 form.cleaned_data 中被删除

    我在模板中放置了一些客户端 JavaScript 允许用户动态地将字段添加到表单中 我的问题是这些字段被清理了form cleaned data 所以我无法以这种方式访问 它们 所有字段都可以在request POST 所以我可以用它来解决
  • 算法 - 如何通过 2n/3 比较对 0/1 数组进行排序?

    In 算法设计手册 http www algorist com 有这样的消费税 4 26 考虑使用以下方法对 n 个 0 和 1 的序列进行排序的问题 比较 对于两个值 x 和 y 的每次比较 该算法 了解 x y 中哪一个成立 a 给出一
  • 行构造函数有什么用?

    在 PostgreSQL 中 什么是ROW 函数用于 具体有什么区别 SELECT ROW t f1 t f2 42 FROM t where f1属于类型int f2属于类型text and CREATE TYPE myrowtype A
  • 查询DB并返回Json格式结果的通用Java方法

    我正在寻找的东西对我来说似乎很简单 但我的护目镜失败了 我想要一个允许我运行任何查询并获取 json 格式结果的方法 诀窍是我don t希望结果需要 java 对象作为过程的一部分 DTO VO 等 有什么快速 简单 干净的方法可以做到这一
  • 如何在xsd文件中定义xml主键并在xml文件中验证

    建筑物 xsd
  • 在 Android 的警报管理器中使用 Intent Extras 传递值

    我想知道这段代码是否有效 我现在无法尝试 此外 我还有一些疑问需要澄清 Intent intent new Intent context AlarmReceiver class intent putExtra user global get
  • 如何从R中的数据帧创建不同格式的矩阵?

    我的数据框如下 group id user id 1000 26 1236 29 1236 46 3767 26 3767 46 5614 29 5614 45 5614 46 我需要输出如下 User 1 User 2 of common
  • 将图像从 3d 视角重绘为 2d

    我需要用 Pascal Delphi Lazarus 编写的逆透视变换 请参见下图 我想我需要遍历目标像素 然后计算源图像中的相应位置 以避免舍入误差等问题 function redraw 3d to 2d sourcebitmap tbi
  • WPF C# 按钮样式

    有人知道如何在 WPF 中重新创建此按钮样式吗 因为我不知道如何制作不同的隔间 以及两种不同的文本和文本样式 要解决你的问题肯定需要使用Style and Template为了Button 但他到底长什么样呢 决定可能有几个 例如 Butt
  • 在 SQLPlus 中设置查询输出的格式

    我目前正在使用 SQLPlus 每当我查询数据库时 结果都是一团糟 换句话说 它很难读 我想知道是否有人知道如何在 Unix 服务器上运行的 SQLPlus 中格式化查询的输出 列 表等 但是 我正在从 Windows 访问服务器 而且 谁
  • 使用 wicked_pdf gem 和 wkhtmltopdf 在 PDF 上显示图像标题

    我的控制器 def show respond to do format format pdf do render pdf gt show template gt welcome show footer gt right gt Page pa
  • 在迭代期间查找文件中的位置

    我正在尝试使用f tell 在迭代期间的普通文本文件中 with open test txt as f for line in f print f tell 我收到以下错误 Traceback most recent call last F
  • 删除工具栏和选项卡布局之间的空间间隙

    我在一个片段中有一个带有 TabLayout 的 AppBarLayout 该片段位于具有工具栏的 Activity 中 但是toolbar和TabLayout之间出现了一个空格 我不知道它来自哪里 片段包 xml
  • Java 关闭钩子

    我已将以下代码添加到我的程序中 Runtime getRuntime addShutdownHook new Thread new Runnable Override public void run System out println e
  • 如何使用钩子更改子组件的道具?

    我想使用反应钩子更改道具 并且我找到了将 setState 函数作为道具传递给孩子的方法 容器 tsx const Container React FC gt const num setNum useState 0 return
  • Seaborn 条形图中的垂直线代表什么?

    我正在尝试使用 Seaborn 因子图tutorial http stanford edu mwaskom software seaborn tutorial categorical linear models html 以下代码创建一个带
  • 通过catch(...)从SEH异常中获取有意义的信息?

    早上好 编辑 这不是重复的 因为它具体涉及 SEH 而不是代码级引发的异常 我正在使用 SEH 来捕获一些不可靠的库引发的硬件错误 我想从包罗万象的异常中获取更多信息 下面的代码模拟了我正在做的事情 正如你所看到的 我正在使用 boost