我正在使用小型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)