【问题标题】:how can I find native exceptions in an x64 stack?如何在 x64 堆栈中找到本机异常?
【发布时间】:2012-05-06 07:01:38
【问题描述】:

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

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

现在的问题是,有时当您将本机代码与托管代码混合使用时,发现异常的常规方法(如 .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

但这不是……

【问题讨论】:

    标签: debugging exception 64-bit windbg


    【解决方案1】:

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

    在测试应用程序中强制异常,然后从堆栈中挖掘上下文记录结构,在我的例子中看起来神奇的值是 0x10001f:

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

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

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

    【讨论】:

    • 这似乎可行,但是回到 struct 开头的偏移量是多少?我还不能从中获得我的筹码。
    • 您正在寻找的值大概代表 _CONTEXT 结构的 ContextFlags 字段。当你在堆栈上找到魔术值时,堆栈指针地址指向结构的 ContextFlags 字段的地址。因此,为了获得结构的基础,您需要减去 ContextFlags 字段的偏移量。
    猜你喜欢
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2017-01-31
    • 1970-01-01
    • 2012-10-15
    • 2021-06-19
    • 2011-04-14
    相关资源
    最近更新 更多