我不情愿地不得不再次处理 Win32 结构化异常。我正在尝试生成一个描述异常的字符串。其中大部分都很简单,但我坚持一些基本的东西:我如何转换异常代码(GetExceptionCode()
的结果,或 ExceptionCode
的成员EXCEPTION_RECORD
) 转换成描述异常的字符串?
我正在寻找可以将例如 0xC0000005 转换为“访问冲突”的东西。它只是调用 FormatMessage()
吗?
最佳答案
结构化异常代码是通过 NTSTATUS 编号定义的。虽然有人来自 MS suggests使用 FormatMessage()将 NTSTATUS 数字转换为字符串,我不会这样做。标记 FORMAT_MESSAGE_FROM_SYSTEM
用于转换 GetLastError() 的结果成一个字符串,所以这里没有意义。将标志 FORMAT_MESSAGE_FROM_HMODULE
与 ntdll.dll
一起使用将导致某些代码的结果不正确。例如,对于 EXCEPTION_ACCESS_VIOLATION
,您将得到 The instruction at 0x
,这不是很有用:)。
当您查看存储在 ntdll.dll
中的字符串时,很明显其中许多应该与 printf() 一起使用。功能,不与FormatMessage() .例如,EXCEPTION_ACCESS_VIOLATION
的字符串是:
0x%08lx 处的指令引用了 0x%08lx 处的内存。内存不能是 %s。
%0
被 FormatMessage() 处理作为转义序列意味着消息终止符,而不是插入。插入是 %1 到 %99。这就是为什么标记 FORMAT_MESSAGE_IGNORE_INSERTS
没有任何区别。
您可能希望从 ntdll.dll
加载字符串并将其传递给 vprintf()但您需要完全按照字符串指定的方式准备参数(例如,对于 EXCEPTION_ACCESS_VIOLATION
,它是 unsigned long
、unsigned long
、char*
)。这种方法有一个主要缺点:ntdll.dll
中参数的数量、顺序或大小的任何更改都可能破坏您的代码。
因此,将字符串硬编码到您自己的代码中会更安全、更容易。我发现在没有与我协调的情况下使用其他人准备的字符串是危险的 :) 而且还有其他功能。这只是故障的另一种可能性。
关于c - 如何将 Win32 异常代码转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7915215/