JIT Debug Info 简介
前言
在上一篇介绍 JIT Debugging 的文章 —— 你需要了解的JIT Debugging 中,我们了解到 procdump 设置为 JIT调试器的时候,在设置的参数中,有一个叫 %p 的参数(需要和 -j 一起使用),指向了 JIT_DEBUG_INFO。今天简单介绍一下 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 状态,而无需执行。
这么做是有好处的,因为在通常情况下,当用户态进程发生异常时,将按顺序发生如下事件:
- 操作系统中断目标进程的执行。
- 启动事后调试器。
- 调试器附加到目标进程。
- 调试器发出 “Go” 命令。(此命令由
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系列命令查看异常发生时的调用栈了。
参考资料
JIT Debug Info 简介的更多相关文章
- [ADB]ADB(Android Debug Bridge)简介及基础(不包含命令)
"Android Debug Bridge (adb) is a versatile command line tool that lets you communicate with an ...
- debug命令简介
debug命令不区分大小,debug的命令都是一个字母,后跟或不跟参数 1.debug [路径\文件] [参数] [参数]--[参数] debug相应程序 2. D(Dump) [地址] [范围] 显 ...
- SpringBoot2.x个性化启动banner设置和debug日志
3.SpringBoot2.x个性化启动banner设置和debug日志 简介:自定义应用启动的趣味性日志图标和查看调试日志 1.启动获取更多信息 java -jar xxx.jar --debug ...
- nodejs的调试debug
目录 简介 开启nodejs的调试 调试的安全性 使用WebStorm进行nodejs调试 使用Chrome devTools进行调试 使用node-inspect来进行调试 其他的debug客户端 ...
- 收集nodejs经典组件:
mysql功能简介:mysql- node.js平台mysql驱动,支持事务.连接池.集群.sql注入检测.多做参数传递写法等特性.主页地址:https://github.com/felixge/no ...
- 使用Node.js完成的第一个项目的实践总结
http://blog.csdn.net/yanghua_kobe/article/details/17199417 项目简介 这是一个资产管理项目,主要的目的就是实现对资产的无纸化管理.通过为每个资 ...
- 利用python itchat给女朋友定时发信息
利用itchat给女朋友定时发信息 涉及到的技术有itchat,redis,mysql,最主要的还是mysql咯,当然咯,这么多东西,我就只介绍我代码需要用到的,其他的,如果需要了解的话,就需要看参考 ...
- [Laravel] 09 - Functional models
Laravel框架下的若干常用功能实现. 文件上传 邮件发送 缓存使用 错误日志 队列应用 文件上传 一.配置文件 功能 配置 [config/filesystems.php] 'disks' =&g ...
- 【SpringBoot】单元测试进阶实战、自定义异常处理、t部署war项目到tomcat9和启动原理讲解
========================4.Springboot2.0单元测试进阶实战和自定义异常处理 ============================== 1.@SpringBoot ...
随机推荐
- 安装完CUDA Toolkit,VS2010调试项目控制台一闪而过
选择菜单栏的调试>>开始执行(不调试),就不一闪而过:
- SPOJ RENT 01背包的活用+二分
这个题目给定N航班的发出时间和结束时间以及价值,要求不冲突时间的最大价值 第一时间想到经典的N方DP,即对航班按发出时间排一下序之后每个i对前面的都扫一遍 时间过不了N有10万,只能想优化了,一开始想 ...
- 干货分享:反思Essay写作指南
在众多Essay写作类型中,有一种较为难写的一种类型——反思写作(Reflective Writing),提前熟悉这类写作风格的要求,并且养成反思性写作的习惯,非常有必要!本文小编就给大家说说什么是反 ...
- SparkStreaming 笔记
简介 SparkStreaming是流式处理框架,是Spark API的扩展,支持可扩展.高吞吐量.容错的准实时数据流处理. 实时数据的来源可以是:Kafka, Flume, Twitter, Zer ...
- Django中出现no such table: django_session
这个错误跟Session的机制有关, 既然要从Web服务器端来记录用户信息, 那么一定要有存放用户session id对应信息的地方才行. 所以,我们需要创建django_session表. Djan ...
- ELK 介绍
章节 ELK 介绍 ELK 安装Elasticsearch ELK 安装Kibana ELK 安装Beat ELK 安装Logstash ELK是什么? ELK是3个开源产品的组合: Elastics ...
- C# Stream篇(六) -- BufferedStream
BufferedStream 目录: 简单介绍一下BufferedStream 如何理解缓冲区? BufferedStream的优势 从BufferedStream 中学习装饰模式 如何理解装饰模式 ...
- 对近期docker学习的总结
Docker 总结 1. 说在前头(Docker命令的格式) docker中的对象分为4个(就目前我所学到的) 镜像 image 容器 container 网络 network 数据卷 volume ...
- tx2--开机启动
TX2上电自动开机 参考:http://121.42.13.250/?p=168 问题描述 Jetson TX2在接通电源后,按下板子上的PWOER BTN开机键(S4)后,便能够正常启动.但这对于一 ...
- 当DIV内出现滚动条,fixed实效怎么办?
sticky 盒位置根据正常流计算(这称为正常流动中的位置),然后相对于该元素在流中的 flow root(BFC)和 containing block(最近的块级祖先元素)定位.在所有情况下( ...