解码抛出的C异常的参数(0xE06D7363)
我有一个崩溃转储文件(我的32位
Windows应用程序在客户计算机上崩溃).异常代码为0xE06D7363.所以,我发现这个
article从MSDN博客关于解码异常参数.但是文章中的食谱对我来说并不奏效:
0:000> .exr -1 ExceptionAddress: 753ad36f (KERNELBASE!RaiseException+0x00000058) ExceptionCode: e06d7363 (C++ EH exception) ExceptionFlags: 00000001 NumberParameters: 3 Parameter[0]: 19930520 Parameter[1]: 0052ccd8 Parameter[2]: 564099d8 0:000> dd 564099d8 l4 564099d8 00000000 00000000 00000000 564099d0 0:000> dd 564099d0 l2 564099d0 00000001 564099b4 0:000> dd 564099b4 l2 564099b4 00000001 56454aec 0:000> da 56454aec+8 56454af4 "????????????????????????????????" 56454b14 "????????????????????????????????" 56454b34 "????????????????????????????????" 56454b54 "????????????????????????????????" 56454b74 "????????????????????????????????" 56454b94 "????????????????????????????????" 56454bb4 "????????????????????????????????" 56454bd4 "????????????????????????????????" 56454bf4 "????????????????????????????????" 56454c14 "????????????????????????????????" 56454c34 "????????????????????????????????" 56454c54 "????????????????????????????????" 我该如何使这个方法工作?或者也可能有其他方法来分析崩溃转储与此异常? 以下是一些来自!analyze -v的信息: PROCESS_NAME: ArcMap.exe MODULE_NAME: arcmap FAULTING_MODULE: 76fa0000 ntdll DEBUG_FLR_IMAGE_TIMESTAMP: 4e793643 ERROR_CODE: (NTSTATUS) 0xe06d7363 - <Unable to get error code text> EXCEPTION_CODE: (NTSTATUS) 0xe06d7363 - <Unable to get error code text> EXCEPTION_PARAMETER1: 19930520 EXCEPTION_PARAMETER2: 0052ccd8 EXCEPTION_PARAMETER3: 564099d8 解决方法
有很多技术细节.我可以给你方向.
第二个异常参数(0052ccd8)是一个指向_s__ThrowInfo结构的指针,它描述了抛出的类型.第三个参数(564099d8)是一个指向抛出对象的指针. 首先让我们讨论抛出的对象类型. _s__ThrowInfo指向一个常量结构(在编译时生成),它驻留在您的可执行文件(EXE或DLL)中,它被映射到进程地址空间中. 如果全局内存包含在您的崩溃转储中 – 那么您可以在那里找到它.否则你可能从可执行文件中推断出它.从您的可执行文件中减去“基础”地址(假设它已被加载到其首选地址),您将在可执行文件中获得此结构的偏移量. 从这个结构解码实际类型是很棘手的.它包括有关可能被转换为(C多态)的类型的信息,加上解析器(destructor),以防万一它们是非平凡的类型(具有非平凡的类型),并且它被抛出by-value. 有关这些结构布局的信息可以找到here: 接下来,抛出的对象.它的地址通常属于堆栈内存(严格来说这不是强制性的,可能会抛出全局或动态分配(堆上)对象,但通常不是这样).如果您的崩溃转储中包含堆栈,您将看到对象布局.再加上你将会(希望)意识到它的意思. 如果您的崩溃转储中没有堆栈内存,则无法恢复该对象. 此外,您的对象可能包含指向其他东西(如字符串或其他对象)的指针,可能不一定在堆栈上分配.很可能你不会意识到这些成员,除非你有全内存转储. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |