JIT Debug Info 简介

原总结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 系列命令查看异常发生时的调用栈了。

参考资料

原文地址:https://www.cnblogs.com/bianchengnan/p/12253564.html

时间: 2024-11-06 07:31:14

JIT Debug Info 简介的相关文章

debug命令简介

debug命令不区分大小,debug的命令都是一个字母,后跟或不跟参数 1.debug [路径\文件] [参数] [参数]--[参数] debug相应程序 2. D(Dump) [地址] [范围] 显示主存单元的内容 3.E(Enter) [地址] [数据表] 用数据表中的数据修改从[地址]出开始主存内容,无数据表则只显示内容 4.F(Fill) 范围 数据表 用数据表中的数据填充指定范围的主存.数据不足,则重复填充 5.R(Register) [寄存器] 不指定寄存器,则显示寄存器状态:指定寄

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

http://blog.csdn.net/yanghua_kobe/article/details/17199417 项目简介 这是一个资产管理项目,主要的目的就是实现对资产的无纸化管理.通过为每个资产生成二维码,来联合移动终端完成对资产的审核等.这个项目既提供了Web端的管理界面也提供移动端(Andorid)的资产审核.派发等相关功能.我们用Node.js构建该项目的Web端以及移动端的Serveice API. 项目主框架:Express 简介 Express 是一个非常流行的Node.js

Visual Studio调试之断点技巧篇补遗

原文链接地址:http://blog.csdn.net/Donjuan/article/details/4649372 讲完Visual Studio调试之断点技巧篇以后,翻翻以前看得一些资料和自己写的一些文章,发现还有几个关于中断程序的技巧在前面的文章里面遗漏了,决定还是在这里总结一下.当然啦,如果你知道这些技巧,忽略这篇文章好了,:) 在程序启动的时候将调试器附加上去 可能有人会对这个问题有一些争议,因为大部分情况下我们只需要在调试器(Debugger)里面直接启动被调试程序(Debugge

收集nodejs经典组件:

mysql功能简介:mysql- node.js平台mysql驱动,支持事务.连接池.集群.sql注入检测.多做参数传递写法等特性.主页地址:https://github.com/felixge/node-mysql eventproxy 功能简介:eventproxy- node.js 异步回调代理.主要用来解决node中深层次回调嵌套的问题,支持很多异步模式:多类型异步.重复异步.持续型异步.主页地址:https://github.com/JacksonTian/eventproxy val

gdb help all 帮助信息

Command class: aliases ni -- Step one instruction rc -- Continue program being debugged but run it in reverse rni -- Step backward one instruction rsi -- Step backward exactly one instruction si -- Step one instruction exactly stepping -- Specify sin

2018最新SpringBoot2.0教程(零基础入门)

一.零基础快速入门SpringBoot2.0 1.SpringBoot2.x课程全套介绍和高手系列知识点 简介:介绍SpringBoot2.x课程大纲章节 java基础,jdk环境,maven基础 2.SpringBoot2.x依赖环境和版本新特性说明 简介:讲解新版本依赖环境和springboot2新特性概述 3.快速创建SpringBoot2.x应用之手工创建web应用 简介:使用Maven手工创建SpringBoot2.x应用 4.快速创建SpringBoot2.x应用之工具类自动创建we

零基础快速入门SpringBoot2.0 教程(二)

一.SpringBoot2.x使用Dev-tool热部署简介:介绍什么是热部署,使用springboot结合dev-tool工具,快速加载启动应用 官方地址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools 核心依赖包: <dependency> <groupId>org.springframework.boot</gro

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

利用itchat给女朋友定时发信息 涉及到的技术有itchat,redis,mysql,最主要的还是mysql咯,当然咯,这么多东西,我就只介绍我代码需要用到的,其他的,如果需要了解的话,就需要看参考资料了哟 实现的功能:1.可以保存微信的消息,包括群聊和好友(文字/视频/语音/图片)2.在群里@自己,可以调用图灵机器人的API进行文字回复(类似于机器人)3.调用定时任务,在指定时间发送消息至某人 需要了解的基础:1.python基础2.mysql基础3.redis基础 实现效果如下: 只需要在

2019刘老师教你用springboot2.x开发整合微信支付的线上教育平台带源码送springboot2.x零基础入门到高级实战教程

第一部分:springboot2.x零基础入门到高级实战教程一.零基础快速入门SpringBoot2.0 1.SpringBoot2.x课程全套介绍和高手系列知识点 简介:介绍SpringBoot2.x课程大纲章节 java基础,jdk环境,maven基础 2.SpringBoot2.x依赖环境和版本新特性说明 简介:讲解新版本依赖环境和springboot2新特性概述 3.快速创建SpringBoot2.x应用之手工创建web应用 简介:使用Maven手工创建SpringBoot2.x应用 4