如何在x64堆栈中找到本机异常?

时间:2012-05-06 07:01:39

标签: debugging exception 64-bit windbg

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

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

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

x64中 0x1003f 的等价物是什么?有没有这样的常数?

修改

顺便说一下,如果你想知道,理论上它应该是 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

但它不是......

1 个答案:

答案 0 :(得分:2)

我通常使用我的密钥的段寄存器值来查找上下文记录(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))以获得基数上下文结构。

另外,如果不明显,这个值来自一个样本大小。它可能在您的环境中不正确,它当然可能会发生变化(就像这样的任何具体实现)。