原总结debug调试dump转储文件JITprocdumpJIT Debugging

前言

在上一篇介绍 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 状态,而无需执行。

这么做是有好处的,因为在通常情况下,当用户态进程发生异常时,将按顺序发生如下事件:

  1. 操作系统中断目标进程的执行。
  2. 启动事后调试器。
  3. 调试器附加到目标进程。
  4. 调试器发出 “Go” 命令。(此命令由 AeDebug 项中的 -g 触发。)
  5. 目标进程尝试继续运行,可能会也可能不会遇到相同的异常。
  6. 目标进程遇到异常后,中断到调试器。

上述事件的发生可能会导致一些问题:

  • 异常并非总能重复,可能是因为重新运行时,瞬态条件(注:导致异常的条件)已不复存在了。
  • 可能会发生另一个事件,例如另一个异常。 没有办法知道它与原始事件是否是同一个。
  • 附加调试器到目标进程需要在目标进程中注入新线程。如果目标进程中有线程正在持有程序加载锁,则新注入的线程很可能阻塞。 注入新线程可能会严重干扰整个处理过程。

如果在 AeDebug 项中使用 -c .jdinfo 而不是 -g,则目标进程不会执行(注:上面提到的第 4, 5, 6 步不会发生)。 而是使用变量 %pJIT_DEBUG_INFO 结构中获取异常信息。

总结

  • 上述的 1 ~ 6 步,对我们理解整个 JIT Debugging 流程非常有帮助。让我们更加明白,在通过 JIT Debugging 生成转储的时候,保存 JIT_DEBUG_INFO 是非常重要的。

  • windbg 中可以使用 .jdinfo 命令设置上下文为异常发生时的上下文,然后就可以使用 k 系列命令查看异常发生时的调用栈了。

参考资料

JIT Debug Info 简介的更多相关文章

  1. [ADB]ADB(Android Debug Bridge)简介及基础(不包含命令)

    "Android Debug Bridge (adb) is a versatile command line tool that lets you communicate with an ...

  2. debug命令简介

    debug命令不区分大小,debug的命令都是一个字母,后跟或不跟参数 1.debug [路径\文件] [参数] [参数]--[参数] debug相应程序 2. D(Dump) [地址] [范围] 显 ...

  3. SpringBoot2.x个性化启动banner设置和debug日志

    3.SpringBoot2.x个性化启动banner设置和debug日志 简介:自定义应用启动的趣味性日志图标和查看调试日志 1.启动获取更多信息 java -jar xxx.jar --debug ...

  4. nodejs的调试debug

    目录 简介 开启nodejs的调试 调试的安全性 使用WebStorm进行nodejs调试 使用Chrome devTools进行调试 使用node-inspect来进行调试 其他的debug客户端 ...

  5. 收集nodejs经典组件:

    mysql功能简介:mysql- node.js平台mysql驱动,支持事务.连接池.集群.sql注入检测.多做参数传递写法等特性.主页地址:https://github.com/felixge/no ...

  6. 使用Node.js完成的第一个项目的实践总结

    http://blog.csdn.net/yanghua_kobe/article/details/17199417 项目简介 这是一个资产管理项目,主要的目的就是实现对资产的无纸化管理.通过为每个资 ...

  7. 利用python itchat给女朋友定时发信息

    利用itchat给女朋友定时发信息 涉及到的技术有itchat,redis,mysql,最主要的还是mysql咯,当然咯,这么多东西,我就只介绍我代码需要用到的,其他的,如果需要了解的话,就需要看参考 ...

  8. [Laravel] 09 - Functional models

    Laravel框架下的若干常用功能实现. 文件上传 邮件发送 缓存使用 错误日志 队列应用 文件上传 一.配置文件 功能 配置 [config/filesystems.php] 'disks' =&g ...

  9. 【SpringBoot】单元测试进阶实战、自定义异常处理、t部署war项目到tomcat9和启动原理讲解

    ========================4.Springboot2.0单元测试进阶实战和自定义异常处理 ============================== 1.@SpringBoot ...

随机推荐

  1. (转)深入理解JVM—JVM内存模型

    原文地址:http://www.cnblogs.com/dingyingsi/p/3760447.html 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互 ...

  2. JS确认取消按钮使用

    前几天写程序用到了点击提交之后弹出一个信息框确认提交有取消和确定按钮查阅了资料记录一手 if(window.confirm('你确定要提交吗?提交后将无法更改!')){ //这里填写提交代码 retu ...

  3. Spring 框架介绍

    Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Control – I ...

  4. ACM-Satellite Photographs

    题目描述:Satellite Photographs Farmer John purchased satellite photos of W x H pixels of his farm (1 < ...

  5. python3 --- unittest单元测试框架

    1.unittest结构 1.单元测试的框架 unittest(python自带,无需额外安装)+接口2.文件,命名时,千万不要写成unittest这样的模块名,会报错的3.功能测试 1)写用例 Te ...

  6. UVA - 1605 Building for UN (联合国大楼)

    题意:一个联合国大楼每层都有数量相等大小相同的格子,将其分配给n个国家,使任意两个不同的国家都相邻(同层有公共边或相邻层的同一个格子). 分析:可以设计一个只有两层的大楼,第一层每个国家占一行,第二层 ...

  7. 洛谷 P2516 [HAOI2010]最长公共子序列

    题目传送门 解题思路: 第一问要求最长公共子序列,直接套模板就好了. 第二问要求数量,ans[i][j]表示第一个字符串前i个字符,第二个字符串前j个字符的最长公共子序列的数量 如果f[i][j]是由 ...

  8. my97datepicker实现日期改变立刻触发函数

    <input type="text" class="Wdate" onclick="WdatePicker({onpicking:functio ...

  9. Swift4 - GCD的使用

    Swift4 - GCD的使用 2018年03月30日 17:33:27 Longshihua 阅读数:1165 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...

  10. 利用IIS6提权获得管理员权限

    IIS6也是一个比较古老的提权EXP了,是通过利用WMI的权限来执行命令. 目标机:漏洞巨多的Win2003 下面说一下通过IIS6在已用菜刀连接上的服务器上运用IIS6获得管理员权限的过程. 1.将 ...