gpt4 book ai didi

debugging - 如何在 x64 堆栈中找到 native 异常?

转载 作者:行者123 更新时间:2023-12-04 21:21:53 26 4
gpt4 key购买 nike

一段时间以来,我一直在使用 WinDbg 来调试转储文件。
有一个很好的“技巧”适用于 x86 native 程序,您可以扫描堆栈以查找 CONTEXT_ALL标志( 0x1003f )。

在 x64 中 CONTEXT_ALL标志显然不包含 0x1003f ...

现在的问题是,有时当您将 native 代码与托管代码混合使用时,查找异常的常规方法(如 .exc 或 .lastevent)。

这相当于什么 0x1003f 在 x64 中?有这样的常数吗?

编辑:

顺便说一句,如果你想知道,理论上它应该是 10003f 因为定义:

#define CONTEXT_I386    0x00010000
#define CONTEXT_AMD64 0x00100000

#define CONTEXT_CONTROL 0x00000001L // SS:SP, CS:IP, FLAGS, BP
#define CONTEXT_INTEGER 0x00000002L // AX, BX, CX, DX, SI, DI
#define CONTEXT_SEGMENTS 0x00000004L // DS, ES, FS, GS
#define CONTEXT_FLOATING_POINT 0x00000008L // 387 state
#define CONTEXT_DEBUG_REGISTERS 0x00000010L // DB 0-3,6,7
#define CONTEXT_EXTENDED_REGISTERS 0x00000020L // cpu specific extensions
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
#define CONTEXT_ALL (CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS)

#define CONTEXT_I386_FULL CONTEXT_I386 | CONTEXT_FULL
#define CONTEXT_I386_ALL CONTEXT_I386 | CONTEXT_ALL
#define CONTEXT_AMD64_FULL CONTEXT_AMD64 | CONTEXT_FULL
#define CONTEXT_AMD64_ALL CONTEXT_AMD64 | CONTEXT_ALL

但这不是...

最佳答案

我通常使用段寄存器值作为我的键来查找上下文记录(ES 和 DS 具有相同的值并且在 CONTEXT 结构中彼此相邻)。不过,标志技巧也很巧妙。

在测试应用程序中强制出现异常,然后从堆栈中挖掘上下文记录结构,在我的情况下,魔术值看起来是 0x10001f:

0:000> dt ntdll!_context 000df1d0
...
+0x030 ContextFlags : 0x10001f
...
+0x03a SegDs : 0x2b
+0x03c SegEs : 0x2b
...

另请注意 ContextFlags 值不在结构的开头,因此如果您找到该值,则必须从中减去 @@c++(#FIELD_OFFSET(ntdll!_CONTEXT, ContextFlags)) 以获得上下文的基础结构体。

此外,以防万一它不明显,该值来自恰好为 1 的样本量。它在您的环境中可能不正确,当然会发生变化(就像任何特定于实现的东西一样)。

关于debugging - 如何在 x64 堆栈中找到 native 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10468809/

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