简 述: 初次在 Win 10 使用 WinDbg 分析 .dmp 文件,定位和分析原因,作为基础入门教程帮助后来者。
[TOC]
本文初发于 “偕臧的小站“,同步转载于此。
关联
附相关目录,随着后续使用更新
背景
此前未曾接触过 WinDbg ,亦未曾分析过 dmp 。现如今上手数月后,回头来写一下此工具在 Win 10 下的基本用法;希望帮助后来者先入个门。大道漫漫兮~,道阻且长;
正文
介绍
『.dmp』 是存储着软件运行崩溃时刻的一些 “场景” 和调试符号的文件;可看作崩溃原因的 “场景再现”。
『WinDbg』 是一款分析 dmp 崩溃文件的开源工具,功能很强,由 Microsoft 出品 官网 。
- WinDbg Preview 可直接在 Microsoft Store 中下载;
- WinDbg 正式版在集成在 windows-sdk 中,可选为仅安装 Windbg;
使用
使用 WinDbg 分析崩溃场景,需要信息。下载版本建议和你的周围同事保持一致,不懂方便请教,毕竟界面略有差异。
.dmp
文件,简中译名 “转储文件”.pdb
符号文件源码 [可选];高阶用法,暂不展开
步骤
暂时记住 WinDbg x86 来调试 x86 应用程序;使用 WinDbg x64 来调试 x64 应用程序;(虽然可以 x64 调试 x86 应用程序,但需要一些命令设置一番)。
命令在底部输入框输入,可依次执行命令如下,也可以直接在界面点击蓝色命令,省略手动输入命令。
开始调试,依次执行命令如下:
!analyze -v // 分析
.ecxr // 查看当前异常的上下文信息、和部分寄存器信息
lmvm "模块名" // 下载对应 .pdb
kb // 显示堆栈崩溃,具体到行
详细例子
File-Symbol File Path
输入符号路径窗口;可以随便输入一个路径,这里我输入 .dmp 的存放路径D:\dmp
。 因若默认为空,后面 WinDbg 加载 .dmp 文件后会长时间无响应, 只有资源管理器杀死重开。
File - Open Crash Dump
选中当前 .dmp 打开
执行如下命令
!analyze -v
开始分析,稍等片刻,有时此过程很慢,标志是左下角会显示 BUSY! 繁忙提示执行
.ecxr
查看的相关信息,查看当前异常的上下文信息、和部分寄存器信息执行后,可以看到崩溃堆栈打印的 dll 模块名为
cloudservice
;执行lmvm cloudservice
获取此 dll 的详细信息,按照时间去 Jenkins 构建上,下载与此时间最近的 .dll 同时生成的cloudservice.pdb
符号文件;将刚找到的
cloudservice.pdb
文件放入刚才的D:\dmp
路径下;重新打开 1 步骤窗口,这次勾选左下角Reload
重新加载。再按上面命令顺序来一遍,依次执行!analyze -v // 分析 .ecxr // 查看寄存器和模块信息 kb // 查看崩溃堆栈
信息如图,定位到了具体行,那么就去 VS 里面修改代码。
总结
若是当前代码的版本恢复到和 WinDbg 提示的 dll 版本一致(可通过 Jenkins 查看编译时间和提交的哈希确定),则基本是准的。若是代码版本领先于 dll 版本,那么也有具体崩溃的函数,崩溃位置也是在提示行数附近偏移一点。
其实在 6 步骤中,还可以点击前面的序号,查看崩溃此函数时,里面的一些局部变量的信息。
附上几个常见崩溃的原因:
- 指针为空,需校验 (90%)
- 存在多线程并发,需要使用原子或锁 (5%)
- 使用 STL 的游标中迭代器失效,遍历过程中删除元素了
- 内存泄漏 / 不足
- …
系列地址
欢迎 star
⭐ 和 fork
🍴 这个系列的 C++ / QT / DTK
学习,附学习由浅入深的目录,这里你可以学到如何亲自编写这类软件的经验,这是一系列完整的教程,并且永久免费!”