我很不情愿地再次处理 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(使用前将#替换为@)