gpt4 book ai didi

c++ - 解码抛出的 C++ 异常的参数 (0xE06D7363)

转载 作者:可可西里 更新时间:2023-11-01 15:08:03 25 4
gpt4 key购买 nike

我有一个崩溃转储文件(我的 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++ 多态性),加上 d'tor(析构函数),以防它是一个非平凡的类型(具有非平凡的 d'tor)并且它是按值抛出的。类型表可以转换为包含指向描述这些类型的适当结构的指针。除其他外,还有这些类型的文本“编码”。

有关这些结构布局的信息可以在here 中找到:

接下来是抛出的物体。它的地址通常属于堆栈内存(严格来说这不是强制性的,可能会抛出全局或动态分配(堆上)对象。但通常情况并非如此)。如果您的故障转储中包含堆栈 - 您将看到对象布局。结合类型,您会(希望)理解它的含义。

如果您的故障转储中没有包含堆栈内存 - 您将无法恢复该对象。

此外,您的对象可能包含指向其他事物(如字符串或其他对象)的指针的成员,这些事物不一定在堆栈上分配。除非您有完整的内存转储,否则您很可能不会意识到这些成员。

关于c++ - 解码抛出的 C++ 异常的参数 (0xE06D7363),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9095898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com