简 述: 初次在 Win 10 使用 WinDbg 分析 .dmp 文件,定位和分析原因,作为基础入门教程帮助后来者。

[TOC]


本文初发于 “偕臧的小站“,同步转载于此。


关联

附相关目录,随着后续使用更新

  1. WinDbg:入门分析 dmp 文件『一』
  2. WinDbg:调试之附加进程生成 dmp『二』

背景

  此前未曾接触过 WinDbg ,亦未曾分析过 dmp 。现如今上手数月后,回头来写一下此工具在 Win 10 下的基本用法;希望帮助后来者先入个门。大道漫漫兮~,道阻且长;


正文

介绍

『.dmp』 是存储着软件运行崩溃时刻的一些 “场景” 和调试符号的文件;可看作崩溃原因的 “场景再现”。

『WinDbg』 是一款分析 dmp 崩溃文件的开源工具,功能很强,由 Microsoft 出品 官网

  • WinDbg Preview 可直接在 Microsoft Store 中下载;
  • WinDbg 正式版在集成在 windows-sdk 中,可选为仅安装 Windbg;

使用

  使用 WinDbg 分析崩溃场景,需要信息。下载版本建议和你的周围同事保持一致,不懂方便请教,毕竟界面略有差异。

  1. .dmp 文件,简中译名 “转储文件”
  2. .pdb 符号文件
  3. 源码 [可选];高阶用法,暂不展开

步骤

  暂时记住 WinDbg x86 来调试 x86 应用程序;使用 WinDbg x64 来调试 x64 应用程序;(虽然可以 x64 调试 x86 应用程序,但需要一些命令设置一番)。

  命令在底部输入框输入,可依次执行命令如下,也可以直接在界面点击蓝色命令,省略手动输入命令。


  开始调试,依次执行命令如下:

!analyze -v   					// 分析
.ecxr         					// 查看当前异常的上下文信息、和部分寄存器信息
			  lmvm "模块名"  	  // 下载对应 .pdb
kb            					// 显示堆栈崩溃,具体到行

详细例子

  1. File-Symbol File Path 输入符号路径窗口;可以随便输入一个路径,这里我输入 .dmp 的存放路径 D:\dmp因若默认为空,后面 WinDbg 加载 .dmp 文件后会长时间无响应, 只有资源管理器杀死重开。


  2. File - Open Crash Dump 选中当前 .dmp 打开


  3. 执行如下命令 !analyze -v 开始分析,稍等片刻,有时此过程很慢,标志是左下角会显示 BUSY! 繁忙提示

  4. 执行 .ecxr 查看的相关信息,查看当前异常的上下文信息、和部分寄存器信息

  5. 执行后,可以看到崩溃堆栈打印的 dll 模块名为 cloudservice ;执行 lmvm cloudservice 获取此 dll 的详细信息,按照时间去 Jenkins 构建上,下载与此时间最近的 .dll 同时生成的 cloudservice.pdb 符号文件;

  6. 将刚找到的 cloudservice.pdb 文件放入刚才的 D:\dmp 路径下;重新打开 1 步骤窗口,这次勾选左下角 Reload 重新加载。再按上面命令顺序来一遍,依次执行

    !analyze -v   // 分析
    .ecxr         // 查看寄存器和模块信息
    kb            // 查看崩溃堆栈

    信息如图,定位到了具体行,那么就去 VS 里面修改代码。


总结

  若是当前代码的版本恢复到和 WinDbg 提示的 dll 版本一致(可通过 Jenkins 查看编译时间和提交的哈希确定),则基本是准的。若是代码版本领先于 dll 版本,那么也有具体崩溃的函数,崩溃位置也是在提示行数附近偏移一点。

  其实在 6 步骤中,还可以点击前面的序号,查看崩溃此函数时,里面的一些局部变量的信息。


附上几个常见崩溃的原因:

  • 指针为空,需校验 (90%)
  • 存在多线程并发,需要使用原子或锁 (5%)
  • 使用 STL 的游标中迭代器失效,遍历过程中删除元素了
  • 内存泄漏 / 不足

系列地址

QtExamples

欢迎 star ⭐ 和 fork 🍴 这个系列的 C++ / QT / DTK 学习,附学习由浅入深的目录,这里你可以学到如何亲自编写这类软件的经验,这是一系列完整的教程,并且永久免费!”