【问题标题】:How can you get more detailed exception information from a vectored exception handler?如何从向量异常处理程序中获取更详细的异常信息?
【发布时间】:2014-04-28 04:56:12
【问题描述】:

在 Windows 应用程序中,如果您有向量异常处理程序:

LONG WINAPI VectoredExceptionHandler(PEXCEPTION_POINTERS exception)
{

}

...并像这样添加它...

AddVectoredExceptionHandler(1, VectoredExceptionHandler);

如果调用了处理程序,您将获得有关异常的上下文信息,例如异常代码exception->ExceptionRecord->ExceptionCode 和异常信息exception->ExceptionRecord->ExceptionInformation。您如何将这些信息转换为字符串类型(例如 TCHAR),告诉用户发生的确切问题是什么?例如,如果您要使用 WINAPI 方法编写一个 mini-dump,MiniDumpWriteDump 编写一个转储文件,它会在转储文件中显示如下详细信息:

异常代码:0xC0000005

异常信息:线程试图读取或写入 它没有适当访问权限的虚拟地址。

我可以很容易地转换异常代码,但是您如何获得如此详细的异常信息? exception->ExceptionRecord->ExceptionInformation,在我的环境中是 ULONG_PTR(运行此应用程序的 Windows 8.1 x64 内置于发布/x64 平台/多字节字符集)当我将它写到 tstringstream 时看起来像这样:0000000000A2DF80

【问题讨论】:

  • 您可以通过调用FormatMessage获取异常代码的文字描述。

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


【解决方案1】:

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

异常信息

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

EXCEPTION_ACCESS_VIOLATION

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

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

【讨论】:

  • ExceptionInformation[1] 的文档是否正确?即使我知道正在访问的虚拟地址不是-1,我也总是得到-1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
相关资源
最近更新 更多