当前位置: 首页 > news >正文

C++调试(肆):WinDBG分析Dump文件汇总

目录

        1.前言

        2.WinDBG中常用的指令

        3.分析异常时要关注的信息

        4.心得


前言

        本篇博客主要针如何使用WinDBG工具调试Dump文件的流程进行一个讲解,具体捕获的Dump文件也是前两节例子中生成的Dump文件。


WinDBG中常用的指令

        关于WinDBG调试时常用的指令主要分为以下几种:
        1.
.excr:切换到发生异常的线程上下文中

.excr

        2.kn:显示堆栈帧编号和函数地址

kn

图1.kn指令

        3.kv:显示堆栈帧编号,调用阅读和参数地址

kv

图2.kv指令

        4.kp:显示参数类型和符号化参数值

kp

图3.kp指令

        5.lm:查看可执行文件信息,如可执行文件时间戳,动态链接库等信息

lm    #输出可执行文件信息
lm vm openCV*    #输出指定文件的信息

        6.reload /f:用于强制加载pdb文件。比如当我们导入pdb文件时,使用lm指令发现路径还是没有找到,则可以使用该指令

reload /f

        7..dump:用于WinDBG捕获到进程异常的时候,指定生成dump文件

.dump /m E:\dmpFile\Wild_Pointer.dmp      #生成​小型转存储文件
.dump /ma E:\dmpFile\Wild_Pointer.dmp     #生成完全转存储文件

        8..cls:清空WinDBG输出的信息

.cls

        9.u:输出指定栈帧的汇编代码

u ntdll!RtlUserThreadStart+0x2c

图4.u指令

        10.r:查看当前线程所有寄存器的值

r

图5.r指令

        11.!analyze -v:自动分析崩溃原因

!analyze -v

分析异常时要关注的信息

        一些还没有使用过WinDBG分析dump文件的同学可能对一个整体流程有点懵,本小节针对这种情况给了一个作者自己分析的流程,具体如下:
        1.导入dump文件后,先根据WinDBG的输出信息分析发送异常的类型

        2.然后使用kn(kp或者kv都可以)指令分析异常崩溃时的堆栈信息

        3.根据异常堆栈信息判断是否存在没有引用的dll或者pdb文件路径

        4.使用lm指令查看没有引用的模块的时间戳

        5.在WinDBG中导入pdb文件和dll文件路径,并且使用.reload /f强制刷新路径,保证WinDBG更新路径信息

        6.重新使用kn指令查看堆栈信息,如果支持文件跳转则直接跳转分析。如果不支持文件跳转,后续再次发送异常崩溃可以生成完全转存储文件,保证捕获更多信息

        7.使用u指令指定反汇编栈帧,根据具体的kn输出的堆栈信息和反汇编的栈帧分析寄存器和汇编代码


心得

        在作者本人的使用过程中,也总结了一些比较重要的心得。

        1.在其他电脑中崩溃后产生的dump文件分析一直链接不到符号表路径,lm输出的模块路径和时间戳和开发电脑的信息不一致,此时可以使用WinDBG绑定进程的方式动态的去生成dmp文件,并且生成的要是完全转存储文件

        2.必要的时候使用u指令反汇编分析栈帧,这样能在分析异常的时候提供更多信息,尤其是调用的第三方库


PS:以上就是这个系列的最后一小节,更多的是要去使用WinDBG搭配dump文件分析,由于作者个人在使用过程中更多涉及到隐私,具体的例子无法更好的体现,读者可以自己多试试,以此形成一个整体的框架,也欢迎各位大牛对该系列的文章进行勘误!!!万分感谢!!!

http://www.lqws.cn/news/203923.html

相关文章:

  • 新能源汽车热管理核心技术解析:冬季续航提升40%的行业方案
  • LangChain面试内容整理-知识点1:LangChain架构与核心理念
  • 征文投稿:如何写一份实用的技术文档?——以软件配置为例
  • python打卡day47
  • 【MATLAB代码】基于MCC(最大相关熵)的EKF,一维滤波,用于解决观测噪声的异常|附完整代码,订阅专栏后可直接查看
  • FreeRTOS任务之深入篇
  • 打印高质量日志的10条军规
  • 【Java学习笔记】Math方法
  • 2023年12月6级第三套第二篇
  • Flask与Celery 项目应用(shared_task使用)
  • CppCon 2015 学习:Intro to the C++ Object Model
  • 使用WPF的Microsoft.Xaml.Behaviors.Wpf中通用 UI 元素事件
  • 【计算机组成原理】计算机硬件的基本组成、详细结构、工作原理
  • 前端杂货铺——TodoList
  • MySql数据库入门到精通——关系数据库标准语言SQL
  • 零基础玩转物联网-串口转以太网模块如何快速实现与TCP服务器通信
  • python版若依框架开发:后端开发规范
  • Android 平台RTSP/RTMP播放器SDK接入说明
  • conda环境配置(一) —— 常用虚拟环境操作命令
  • OneNet + openssl + MTLL
  • QT使用AES加解密,openssl及QCA问题记录
  • 量子计算突破:新型超导芯片重构计算范式
  • 华为OD机试_2025 B卷_人民币转换(Python,100分)(附详细解题思路)
  • 基于深度学习的金枪鱼各类别目标检测含完整数据集
  • Vue3+Element Plus表单验证实战:从零实现用户管理
  • 乐观锁与悲观锁的实现和应用
  • 青少年编程与数学 01-011 系统软件简介 07 iOS操作系统
  • Java编程中常见的条件链与继承陷阱
  • VScode打开后一直显示正在重新激活终端 问题的解决方法
  • Android和硬件通信