在Windows应用程序中,如果您有一个向量异常处理程序:
LONG WINAPI VectoredExceptionHandler(PEXCEPTION_POINTERS exception)
{
}
...并像这样添加...
AddVectoredExceptionHandler(1, VectoredExceptionHandler);
如果调用该处理程序,您将获得有关异常的上下文信息,例如异常代码exception->ExceptionRecord->ExceptionCode
和异常信息exception->ExceptionRecord->ExceptionInformation
。如何将此信息转换为字符串类型(如TCHAR),告诉用户发生的确切问题是什么?例如,如果您使用WINAPI方法编写一个小型转储,MiniDumpWriteDump
来编写转储文件,它将在转储文件中显示这样的详细信息:
异常代码:0xC0000005
异常信息:线程试图读取或写入 它没有适当访问权限的虚拟地址。
我可以很容易地转换异常代码,但是如何获得如此详细的异常信息呢? exception->ExceptionRecord->ExceptionInformation
,在我的环境中是ULONG_PTR
(Windows 8.1 x64运行此应用程序,内置在Release / x64平台/多字节字符集中),当我写出{{1}时,它看起来像这样}:tstringstream
答案 0 :(得分:4)
该信息记录为the documentation of the EXCEPTION_RECORD
structure的一部分:
<强>如果ExceptionInformation 强>
描述异常的其他参数数组。 ... 下表描述了定义了数组元素的异常代码。
<强> EXCEPTION_ACCESS_VIOLATION 强>
数组的第一个元素包含一个读写标志,指示导致访问冲突的操作类型。如果 该值为零,该线程试图读取不可访问的 数据。如果此值为1,则线程尝试写入 无法进入的地址。如果此值为8,则线程将导致a 用户模式数据执行保护(DEP)违规。
第二个数组元素指定不可访问数据的虚拟地址。