windbg调试
windbg作为windows平台进行堆栈分析、排查错误的利器,主要用到的功能如下:
1.基础
1.1 分析已有的dmp
针对软件崩溃时自动生成了dmp文件或已有崩溃文件的情况
-
step1:设置符号路径:file->symbol file path;
-
step2: 打开dmp文件
方法1:拖动dmp文件到窗口内; 方法2:file->open crash dump
- step3:开始分析,无论是什么问题,先用如下分析下,查看堆栈信息,而后针对具体情况分析。
!analyze -v
1.2 windbg调试进程
当在测试机没有调试所需的VS环境或者不存在代码时,可以直接通过windbg调试程序
-
step1:启动软件,
-
step2(可选):设定值符号文件的路径,file->symbol file path;
-
step3:附加到待调试的进程:file->attach to process
可以通过进程的名称; 进程ID
快速寻找需要调试的进程
- step4:命令输入框,直接输入g或者按F5,启动调试
2保存dmp文件
2.1 windbg保存dmp文件
在用windbg调试程序时,可以将当前的堆栈信息保存为dmp文件,一则可以收集信息,方便后续分析,二则可以将dmp文件分享给同事或库的提供者进行协同分析。windbg保存dmp文件的命令有三种形式,推荐使用第二种形式
- 方式一:
.dump /m 路径名
生成标准的minidump, 转储文件通常较小,便于在网络上通过邮件或其他方式传输。 这种文件的信息量较 少,只包含系统信息、加载的模块(DLL)信息、 进程信息和线程信息。
示例:.dump /m C:\dumps\myapp.dmp
- 方式二:
.dump /ma 路径名
包括完整的内存内容、句柄、未加载的模块,等等,文件很大,
示例:.dump /ma C:\dumps\myapp.dmp
- 方式三:
.dump /mFhutwd 路径名
带有数据段、非共享的读/写内存页和其他有用的信息的minidump。包含了通过minidump能够得到的最多的信息。是一种折中方案
示例:.dump /mFhutwd C:\dumps\myapp.dmp
2.2任务管理器保存dmp文件
当程序处于无响应状态时,程序必定是存在异常,在找到确切的原因前,不能够贸然强制退出程序,尤其是针对偶现的现象,一旦退出,可能要自己复现成千上百次且无法复现出问题。为了保护好现场,需要将当前的堆栈信息保存下来。切记,一定要保存下来,这是有血的历史教训的。
方法如下:
打开任务管理器 找到当前进程 邮件 创建存储文件
线程
输出线程的命令如下
~ 简洁地显示当前进程的所有线程,
~. 表示当前线程
~# 表示异常或者产生调试事件的线程
~* 表示所有线程
~1 表示一号线程
堆栈
输出堆栈的命令如下
k // 显示当前堆栈
kb // 显示当前堆栈,包括显示传递给堆栈跟踪中每个函数的前三个参数
kp // 显示当前堆栈,显示传递给堆栈回溯中的每个函数的所有参数
~0k // 显示第0个线程的堆栈,主线程
死锁
死锁是非常棘手的问题了.
复习下死锁产生的原因
- 互斥
- 请求并保持
- 不可剥夺
- 循环等待
针对死锁问题,加载dmp文件后,
- 在命令行输入如下命令后,可以查看所有线程占用的锁,根据信息中OwningThread参数可以知道当前获得锁的线程ID,
!locks
- 依据线程ID查找线程编号,假设线程编号为015,
view->process and Threads->根据表格找到对应值
- 输入如下命令,查看线程的堆栈
~nkb //n为获得的编号
命令行操作技巧
- 上下箭头:查找之前的命令
- BACKSPACE, DELETE, INSERT, 和所有箭头编辑命令
- tab键自动补全命令
- esc清楚当前行