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

windows程序使用Windbg分析dump

    本文主要就windows下dump的分析做一个总结。

一、前置准备

     WinDbg程序下载,注意使用32位或者64位,一般网站都有哈,找不到的可以评论区留言。

     接下里这个配置非常关键:

     1)、确定机器位数

       a、 如果dump是64位的,可以选择打开32位的任务管理器,生成32位的dump。

              在C:\Windows\SysWOW64目录下找到taskmgr.exe双击打开(不要关闭之前已经打开过的任务管理器),这个时候打开的任务管理器就是32位的了。辨认方式很简单:看taskmgr.exe后面有没有 *32标记,有,那就是32位,没有就是64位。对于win8及以上的操作系统,还可以进行“选择列”操作新增“平台”项,更直观的看到运行的应用程序是32位的还是64位。

       b、或者使用windbg将64位dump转为32位再分析,命令如下:      .load wow64exts      !sw

     2)、设置必要的环境信息

打开WinDbg工具,我们首先需要配置Symbol path,Source path以及Image path

        a、Symbol path

这是pdb文件路径,包括当前dump调试对应的工程pdb文件,以及系统api对应的pdb文件。需要配置为:

SRV*D:\mysymbol*http://msdl.microsoft.com/download/symbols

其中D:\mysymbol为下载系统pdb文件存放在本机的路径。

同时需要加载map文件所在的路径,程序用到的所有的库所在的路径。(map和pdb文件的生成请参考对应的开发工具。特别注意:程序库、pdb、map、程序源文件都要保持是是dump完全一致的程序生成的,否则解析后会不准。)

在view-commond中输入 .reload命令,加载pdb符号

vc6.0产生map方法如下:需要勾选设置中的产生MAP文件勾选框

更详细的可参考:map文件生成

map文件生成2

        b、Source path

这是代码路径,此代码需要和pdb文件版本保持一致。

        c、Image path

            Exe程序路径,一般用于死循环时,在WinDbg中继续调试

二、开始解析

        如果第一步配置无误,直接选择File->Open Crash Dump 后输入 !analyze -v,等待解析就可以看到异常的位置和对应的源码位置。

       如果说必要的某个库没有导入成功,可以查看位置是否正确,重新执行第一步的配置符号信息。

   如果没有解析到对应的代码行数,则需要我们自己去计算地址了,这个后续再更新。本次先贴一下常用的一些命令

内存越界及非法访问:

!analyze -v:自动分析出异常的详细信息

~0s:切换到异常线程

.ecxr :定位当前异常的上下文信息

kb:显示栈回溯信息

.frame  0:将当前堆栈的局部上下文切换到指定栈帧

d命令和dv命令:分析变量值 

内存泄漏:

gflags.exe –i XXX.exe +ust:为可能存在内存泄漏的进程启用用户堆栈跟踪

!heap –s:查看当前进行所有堆的内存分配情况,选择堆内存最大一个堆继续分析

!heap -stat –h xxx:查看堆xxx上各个大小的内存块分分布情况

!heap –flt s xx:查看堆上所有大小为xx的内存块信息,随便选几个内存块进行分析

!heap -p –a xxx:查看指定地址的调用堆栈信息

lsa xxx:进入指定模块的代码

死锁:

分析等待链:分析程序是否处于死锁状态

!locks:查看所有线程占用的锁信息,包含拥有锁的线程,以及有多少个线程在等待这把锁

~*kv:查看所有线程的堆栈信息

!cs xxx:查看锁的具体信息

Dump文件无堆栈

!analyze -v:自动分析出异常的详细信息

~*kv:查看所有线程的堆栈

~56s:切换到崩溃线程,假设为56号线程

kb:显示当前线程的栈回溯信息,同时显示栈上的前三个参数

dd xxx:按四字节读取地址

.exr xxx:查看异常类型

.cxr xxx:解析改地址的上下文内容

kb:查看实际的异常的调用堆栈

.frame 1:将当前上下文切到指针栈帧再结合dv命令分析

句柄泄漏

句柄泄漏的分析和其他问题分析不一样,它是在程序运行中进行分析的,也就是不会生成dump文件,而是将该进程attach到windbg中 attach:将该进程attach到windbg中

!htrace –enable:开启句柄栈回溯跟踪,该命令同时默认产生第一次句柄信息的快照

!htrace –snapshot:查看初始的句柄信息快照

F5:让程序继续运行,当出现句柄泄露时,可以通过break中断进程

!htrace –diff:查看没有进行释放操作的句柄栈回溯信息

lsa xxx:进入指定模块的代码

        总之在解析dump文件时除了运用这些命令外,还得边结合现象、业务逻辑、代码综合分析。

http://www.xdnf.cn/news/11584.html

相关文章:

  • 最小二乘法
  • 手把手教你ssh升级openssh9
  • 【ubuntu】zlib 库下载编译安装
  • 服务端渲染SSR及实现原理
  • 图文详解 RESTful
  • 一文彻底搞懂Raft算法,看这篇就够了!!!
  • openstack基础平台部署
  • MinGw的介绍和使用
  • [ROS 系列学习教程] ROS服务(Service)通信:通信模型、Hello World与拓展
  • Git及TortoiseGit 安装及使用
  • Jumpserver 3.10.1 (离线安装)
  • 硬盘分区的UUID
  • 什么是schema?
  • 内网安全:内网穿透详解
  • JWT认证漏洞总结
  • vue.js基础知识总结
  • Kotlin多线程
  • Zookeeper入门学习
  • Hive本地模式安装(详细)
  • 分享黑客必备工具【SecureCRT】
  • 【JMeter入门】—— JMeter介绍
  • Latex常用语法总结(个人用)+ 写作tips
  • shell脚本基础语法(.sh ./ sh bash source shell)
  • 基于Echarts实现可视化数据大屏政务大数据共享交换平台
  • 【Python自动化测试】详解selenium从入门到实战【一】
  • 入门指南:使用 Visual Studio Code 高效编辑 Markdown
  • FFmpeg
  • NPM进阶知识与用法详解(二)
  • 最全详细解读之什么是Pytorch?
  • Linux介绍、安装、常见命令