如何从向量异常处理程序中获取更详细的异常信息?

时间:2014-03-21 01:08:49

标签: c++ winapi exception visual-c++ exception-handling

在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

1 个答案:

答案 0 :(得分:4)

该信息记录为the documentation of the EXCEPTION_RECORD structure的一部分:

  

<强>如果ExceptionInformation

     

描述异常的其他参数数组。 ...   下表描述了定义了数组元素的异常代码。

     

<强> EXCEPTION_ACCESS_VIOLATION

     

数组的第一个元素包含一个读写标志,指示导致访问冲突的操作类型。如果   该值为零,该线程试图读取不可访问的   数据。如果此值为1,则线程尝试写入   无法进入的地址。如果此值为8,则线程将导致a   用户模式数据执行保护(DEP)违规。

     

第二个数组元素指定不可访问数据的虚拟地址。