文章目录

  • 关联
  • 背景
  • 正文
  • 介绍
  • 使用
  • 详细例子
  • 总结
  • 系列地址


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



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



关联

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

  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 的游标中迭代器失效,遍历过程中删除元素了
  • 内存泄漏 / 不足