Yoc*_*mer 5 debugging 64-bit windbg exception
我一直在使用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
Run Code Online (Sandbox Code Playgroud)
但它不是......
我通常使用段寄存器值作为查找上下文记录的关键(ES 和 DS 具有相同的值,并且在 CONTEXT 结构中彼此相邻)。不过,旗帜技巧也很巧妙。
在测试应用程序中强制发生异常,然后从堆栈中挖掘上下文记录结构,在我的例子中,神奇值似乎是 0x10001f:
0:000> dt ntdll!_context 000df1d0
...
+0x030 ContextFlags : 0x10001f
...
+0x03a SegDs : 0x2b
+0x03c SegEs : 0x2b
...
Run Code Online (Sandbox Code Playgroud)
另请注意,ContextFlags 值不在结构的开头,因此如果找到该值,则必须从中减去 @@c++(#FIELD_OFFSET(ntdll!_CONTEXT, ContextFlags)) 才能获取上下文的基础结构。
另外,以防万一,这个值来自恰好为 1 的样本量。它在您的环境中可能不正确,并且当然可能会发生变化(就像任何特定于实现的事情一样)。
| 归档时间: |
|
| 查看次数: |
1156 次 |
| 最近记录: |