如何将 Win32 异常代码转换为字符串?

2024-04-12

我很不情愿地再次处理 Win32 结构化异常。我正在尝试生成一个描述异常的字符串。大部分都很简单,但我坚持一些基本的事情:如何转换异常代码(GetExceptionCode(), 或者ExceptionCode的成员EXCEPTION_RECORD) 到描述异常的字符串中?

我正在寻找可以将 0xC0000005 转换为“访问冲突”的东西。是否只是一个电话FormatMessage()?


结构化异常代码是通过 NTSTATUS 编号定义的。尽管 MS 的某人建议here https://support.microsoft.com/en-us/kb/259693(文章已移至here https://www.betaarchive.com/wiki/index.php?title=Microsoft_KB_Archive/259693) using 格式化消息() https://msdn.microsoft.com/en-us/library/ms679351(v=vs.85).aspx要将 NTSTATUS 数字转换为字符串,我不会这样做。旗帜FORMAT_MESSAGE_FROM_SYSTEM用于转换结果获取最后一个错误() https://msdn.microsoft.com/en-us/library/ms679360(v=vs.85).aspx成字符串,所以这里没有意义。使用标志FORMAT_MESSAGE_FROM_HMODULE随着ntdll.dll会导致某些代码产生不正确的结果。例如,对于EXCEPTION_ACCESS_VIOLATION你会得到The instruction at 0x,这不是很有信息:)。

当您查看存储在中的字符串时ntdll.dll很明显,其中许多应该与printf() https://msdn.microsoft.com/en-us/library/56e442dc.aspx函数,不与格式化消息() https://msdn.microsoft.com/en-us/library/ms679351(v=vs.85).aspx。例如,字符串EXCEPTION_ACCESS_VIOLATION is:

The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s.

%0被治疗格式化消息() https://msdn.microsoft.com/en-us/library/ms679351(v=vs.85).aspx作为转义序列,表示消息终止符,而不是插入。插入为 %1 到 %99。这就是为什么标记FORMAT_MESSAGE_IGNORE_INSERTS没有任何区别。

您可能想从以下位置加载字符串ntdll.dll并将其传递给vprintf() https://en.cppreference.com/w/cpp/io/c/vfprintf但您需要完全按照字符串指定的方式准备参数(例如,EXCEPTION_ACCESS_VIOLATION it's unsigned long, unsigned long, char*)。这种方法有一个主要缺点:参数数量、顺序或大小的任何变化ntdll.dll可能会破坏你的代码。

因此,将字符串硬编码到您自己的代码中更安全、更容易。我发现在没有与我协调的情况下使用其他人准备的字符串是危险的:),而且对于其他功能也是如此。这只是故障的另一种可能性。

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

如何将 Win32 异常代码转换为字符串? 的相关文章

随机推荐

  • com.google.gwt.user.client.rpc.InknownRemoteServiceException

    我的 GWT 应用程序有问题 我部署在 Jetty 服务器上并运行 但是当我执行服务器调用 GWT 服务器包上的类 时 服务器返回错误消息 消息是 7 0 6 http localhost zbapp zb app A31E1254E17F
  • 抑制 make clean 中的消息(Makefile 无提示删除)

    我想知道如何避免 Makefile 中出现一些回声 clean rm fr o 该规则将打印 gt make clean rm fr o gt 我怎样才能避免这种情况 首先 实际的命令必须位于下一行 或者至少 GNU Make 是这样 它可
  • 在所有存储过程中搜索模式然后打开它进行更改的方法

    如何在所有存储过程中搜索某个模式 然后打开要编辑的存储过程 SQL Server 2005 内部有内置的东西吗 或者是否有任何第三方插件可以进行此搜索 我也在使用 Red Gate 的 SQL Prompt 但我没有注意到该选项 目前我正在
  • Zend_Db:如何从表中获取行数?

    我想知道一个表中有多少行 我使用的数据库是MySQL数据库 我已经有一个 Db Table 类 用于像这样的调用fetchAll 但我不需要表中的任何信息 只需要行数 如何在不调用的情况下获得表中所有行的计数fetchAll count d
  • 重写大型 IN 子句的最高效方法是什么?

    我使用 go 和 gorm 编写了一个 API 它在我们的数据库上运行计算并返回结果 我刚刚达到了参数限制IN使用聚合时的条件 查询示例 SELECT SUM total amount from Table where user id in
  • 使用 While() 结构时 Gridview 不会填充。 C# ASP.Net

    我在使用此网格视图时遇到问题 我正在用查询填充它 但是 如果我使用 while reader Read 结构 它就不会填充甚至不会出现 没有 while 结构 它工作得很好 但是 我需要访问两个特定字段 代码如下 SqlDataReader
  • getLastknownLocation() 在 nexus 上返回 null 值

    我正在开发基于位置的项目 我使用以下代码 我正在为该项目使用 google api 8 lm requestLocationUpdates LocationManager GPS PROVIDER 0 0 this currloc lm g
  • 为什么我们应该总是从函数返回值?

    我不是一个编程高手 但多次听程序员说我们应该始终从函数返回值 我想知道原因 函数不需要返回任何内容 如果您查看 C 函数 您会发现其中许多函数不需要返回任何内容 好吧 不是明确地 void nonReturningFunction cons
  • Python:有限制的非线性优化(Gekko?)

    我希望能够用Python解决以下问题 给定观测数据 x 1 x n 和已知的固定目标 B 和公差 E 求解参数 a0 a1 和 a2 从而最小化 总和 w i 2 其中 w i exp a0 a1x i a2x i 2 具有以下两个限制 s
  • 拆分包含两者的字符串中的数字和字母

    我正在尝试分割以下 或类似 字符串 08 27 2015 07 25 00AM 目前我使用 var parts date split 0 9a zA Z g 这导致 02 27 2012 03 25 00AM 问题在于00AM部分 我也想分
  • 在 Visual Studio 中的项目之间共享预编译头

    我有一个包含许多 Visual C 项目的解决方案 所有项目都使用 PCH 但有些项目打开了特定的编译器开关以满足项目特定的需求 这些项目中的大多数在各自的 stdafx h 中共享相同的标头集 STL boost 等 我想知道是否可以在项
  • 网页抓取、屏幕抓取、数据挖掘技巧? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Python (2.7) 中比较两个相同的对象返回 False

    我在Python中有一个函数叫做object from DB 该定义并不重要 只是它采用 ID 值作为参数 使用sqlite3库从 db 文件中的表中提取匹配值 然后在对象初始化时使用这些值作为参数 使用此函数不会改变数据库 鉴于此 这个示
  • 有向加权图的邻接表

    我使用邻接表来表示有向加权图 并基于以下提供的示例代码this https stackoverflow com questions 58306 graph algorithm to find all connections between
  • 使用 ggplot2 绘制“序列徽标”?

    是否 合理 可能绘制一个序列标志图 http en wikipedia org wiki Sequence logo使用ggplot2 有一个基于 网格 的包可以做到这一点 称为 seqLogo http www bioconductor
  • 使用枚举对结构进行分组

    在 Rust 中 应该如何对相关结构进行分组 以便函数签名可以接受多种不同类型 同时引用方法体内的具体类型 为了简单起见 设计了以下示例 enum Command Increment quantity u32 Decrement quant
  • 使用CreateProcess调用exe文件?

    一直尝试从我的 Visual Studio C 应用程序调用 Truecrypt exe 但是CreateProcess只是不工作 GetLastError shows 127 目的是调用exe不显示命令窗口 请帮忙 我尝试过搜索并阅读Cr
  • 读取 XML 节点的值

    我需要获取 XML 文件中节点的值 我的 XML 文件如下所示
  • 嵌入可编辑的 Google 文档电子表格,无需标题和工具栏

    我需要在网页上嵌入 Google 文档电子表格 但它只需是可编辑的单元格 顶部没有 Google 导航和工具栏 我找不到用于在任何地方嵌入 Google 文档的查询字符串变量的引用 但似乎删除工具栏等的唯一方法是在查询字符串中添加 outp
  • 如何将 Win32 异常代码转换为字符串?

    我很不情愿地再次处理 Win32 结构化异常 我正在尝试生成一个描述异常的字符串 大部分都很简单 但我坚持一些基本的事情 如何转换异常代码 GetExceptionCode 或者ExceptionCode的成员EXCEPTION RECOR