小编Ily*_*sky的帖子

Windows 64位VectoredExceptionHandler中的C ++ RTTI,MS Visual Studio 2015

我正在使用小型Windows异常处理引擎,试图从系统中收集最大信息,包括C ++异常RTTI。

在MSVS 2015编译的32位VectoredExceptionHandler中,我可以成功获取指向所引发类型的RTTI的std :: type_info指针。可以轻松找到它((_ThrowInfo*) ExceptionPointers->ExceptionRecord->ExceptionInformation[2])->pCatchableTypeArray->arrayOfCatchableTypes[0](请参阅Raymond Chen的经典文章,来自MS ehdata.h文件的一些定义以及许多其他定义)。此方法基于获取由编译器构建pCatchableTypeArray的MSVC内置_ThrowInfo结构数据的成员。

但是在64位环境中,不_ThrowInfo包含直接RTTI:不幸的pCatchableTypeArray是,它为NULL。在反汇编窗口中,我看到它甚至在调用_CxxThrowExceptionMS主throw处理程序之前为NULL 。我搜索了许多有关MSVC中使用的新的64位异常处理机制的文章,但是没有有关RTTI的信息。但是也许我错过了一些东西。

有什么方法可以获取在64位MSVC环境中工作的矢量异常处理程序中引发的C ++异常的std :: type_info(或简称为类型名称)?

这是转储32位和64位异常信息的输出:

32位(RTTI成功):

VectoredExceptionHandler(): Start

exc->ExceptionCode               = 0xE06D7363
exc->ExceptionAddress            = 0x74E2C54F
exc->NumberParameters            = 3
exc->ExceptionInformation[0]     = 0x19930520 (sig)
exc->ExceptionInformation[1]     = 0x004FFD9C (object)
exc->ExceptionInformation[2]     = 0x003AD85C (throwInfo)
exc->ExceptionInformation[3]     = 0x005B18F8 (module)

throwInfo->attributes            = 0x00000000
throwInfo->pmfnUnwind            = 0x00000000
throwInfo->pForwardCompat        = 0x00000000
throwInfo->pCatchableTypeArray   = 0x003AD870

object    = 0x004FFD9C
throwInfo = 0x003AD85C
module    = 0x00000000 …
Run Code Online (Sandbox Code Playgroud)

c++ exception-handling x86-64 rtti visual-studio

4
推荐指数
1
解决办法
887
查看次数

标签 统计

c++ ×1

exception-handling ×1

rtti ×1

visual-studio ×1

x86-64 ×1