从EXCEPTION_RECORD获取信息

时间:2011-11-04 16:30:40

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

如果我发现SEH的访问违规行为,我该如何获取违规地址? GetExceptionInformation为我提供了包含

LPEXCEPTION_POINTERS
  • ExceptionRecord - 指向EXCEPTION_RECORD结构的指针 包含与机器无关的异常描述。
  • ContextRecord - 指向包含a的CONTEXT结构的指针 处理器特定的异常时处理器状态描述。

如何在不编写转储的情况下获取此信息?

2 个答案:

答案 0 :(得分:2)

EXCEPTION_RECORD结构有一个ExceptionAddress字段。

答案 1 :(得分:2)

内存地址以及操作类型包含在ExceptionRecord structur中的ExceptionInformation字段中。来自MSDN

<强>如果ExceptionInformation
一组描述异常的附加参数。 RaiseException函数可以指定此参数数组。对于大多数异常代码,数组元素是未定义的。下表描述了定义了数组元素的异常代码。

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

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