原总结debug调试dump转储文件JITprocdumpJIT Debugging
在上一篇介绍 JIT Debugging
的文章 —— 你需要了解的JIT Debugging 中,我们了解到 procdump
设置为 JIT
调试器的时候,在设置的参数中,有一个叫 %p
的参数(需要和 -j
一起使用),指向了 JIT_DEBUG_INFO
。今天简单介绍一下 JIT_DEBUG_INFO
。
JIT_DEBUG_INFO
的定义如下:
typedef struct _JIT_DEBUG_INFO {
DWORD dwSize;
DWORD dwProcessorArchitecture;
DWORD dwThreadID;
DWORD dwReserved0;
ULONG64 lpExceptionAddress;
ULONG64 lpExceptionRecord;
ULONG64 lpContextRecord;
} JIT_DEBUG_INFO, *LPJIT_DEBUG_INFO;
我们可以在 windbg
中,使用 dt JIT_DEBUG_INFO
来查看 JIT_DEBUG_INFO
的数据结构,如下:
0:000> dt JIT_DEBUG_INFO
demo!JIT_DEBUG_INFO
+0x000 dwSize : Uint4B
+0x004 dwProcessorArchitecture : Uint4B
+0x008 dwThreadID : Uint4B
+0x00c dwReserved0 : Uint4B
+0x010 lpExceptionAddress : Uint8B
+0x018 lpExceptionRecord : Uint8B
+0x020 lpContextRecord : Uint8B
如果转储文件保存的时候,已经保存了 JIT_DEBUG_INFO
信息,我们可以直接在 windbg
中执行 .jdinfo address
。
为什么 procdump
要保存 JIT_DEBUG_INFO
呢?我们可以从 .jdinfo
的帮助文档里得到答案!截取如下:
简略翻译一下(感谢 google 翻译
的大力支持):
.jdinfo
命令使用从 Windows Vista
开始引入的 AeDebug
注册表信息。 相关注册表项的更多信息,请参考 Enabling Postmortem Debugging 。 .jdinfo
命令使用系统为 AeDebug
设置的 JIT_DEBUG_INFO
的地址,并设置上下文为崩溃时的上下文。
您可以在 AeDebug
中使用 .jdinfo
命令而不是 -g
将调试器设置为 AeDebug
状态,而无需执行。
这么做是有好处的,因为在通常情况下,当用户态进程发生异常时,将按顺序发生如下事件:
AeDebug
项中的 -g
触发。)上述事件的发生可能会导致一些问题:
如果在 AeDebug
项中使用 -c .jdinfo
而不是 -g
,则目标进程不会执行(注:上面提到的第 4, 5, 6
步不会发生)。 而是使用变量 %p
从 JIT_DEBUG_INFO
结构中获取异常信息。
上述的 1 ~ 6
步,对我们理解整个 JIT Debugging
流程非常有帮助。让我们更加明白,在通过 JIT Debugging
生成转储的时候,保存 JIT_DEBUG_INFO
是非常重要的。
在 windbg
中可以使用 .jdinfo
命令设置上下文为异常发生时的上下文,然后就可以使用 k
系列命令查看异常发生时的调用栈了。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章