windbg工具使用
windbg是微软的工具,可以从百度或微软官网获取。
工具支持:
分析dmp文件.
定位CPU、内存、崩溃等异常问题。
代替VS调试C++程序。
这里主要整理了收集或分析dmp文件的相关命令,方便查阅。
不作为入门教程。
界面堆栈说明
输入kb命令,可得到堆栈信息:
![](https://img-blog.csdnimg.cn/img_convert/c68bcd8f44fda3a51ca972abc9cfd7b9.png)
其中
第1列:当前的栈EBP值。
第2列:当前的栈返回时的返回地址,即调用一个函数执行完后,会返回调用的地方下一条指令执行。
第3-5列:函数参数。
最后列:当前帧的模块!函数+地址偏移
界面左下角的000表示当前处于0号线程的环境内,注意是线程号,而不是线程ID。
每个线程空间有自己的堆栈信息。
常用命令介绍
命令格式
xx:内置命令
.xx:扩展命令
!xx:执行xx命令,命令属于外部dll模块。
!aa.xx:调用外部dll模块aa的xx功能
*注意,命令涉及的地址都是16进制。
创建dmp文件
创建dmp文件命令:
.dump /ma /u x:\xx\xx\a.dmp
命令说明:
.dump: 是命令
/ma:创建full dump,如果/mm则是创建mini dump,
/u: 添加进程ID和日期到dmp文件名。
x:\xx\xx\a.dmp: dmp文件名和保存位置。如果没有路径,则保存到windbg进程目录。
切换32和64模式
分两步:
1、.load wow64exts:加载外部模块wow64exts.dll
2、!sw: 执行模块wow64exts的sw功能进行切换。必须先加载模块wow64exts。
继续执行命令
g: 继续执行程序。
查看地址汇编命令
u addr ln:从地址addr开始反汇编n行,ln是n行,比如l10表示10行,其中l是L。
查看地址附近函数命令
ln addr: 在地址addr前后查找最近的函数名。
查找函数或变量命令
x nn!mm*: 在某个dll模块nn中,查找mm开头的函数名或者变量名。
查看内存命令
da addr: 从地址addr开始,显示32个ansi字符。
db addr: 从地址addr开始,显示32个4字节内存。
dd /c 32 addr: 从地址addr开始,显示32个4字节内容,/c指定内存列数为32。
查看加载模块命令
lm: 查看进程所有模块,exe和dll等。
lm m xx*:查看进程中xx开头的模块。
线程操作命令
~: 列举线程和线程号.
~3s: 切换到3号线程,帧和变量在当前线程中,每个线程有独立的调用堆栈。
帧和变量命令
kbn: 列出调用堆栈,并显示每个堆栈的帧号。
.frame n: 进入帧n中,n是kbn的结果的序号.每一帧表示一个函数内部,涉及堆栈和局部变量、寄存器等。
dv: 查看当前帧有什么变量。
dv /i:查看有什么变量,以及类型,变量值,或者指针的地址。
dt 变量名: 查看变量内容
dt -rn 变量名: 查看变量结构的n层深度,dt -r3 var0
分析CPU时间命令
!runaway: 查看各线程占用cpu时间,通常可分析CPU高问题。
分析崩溃命令
!analyze -v: 分析崩溃
分析c#代码
c#分析加载sos模块,才能解析C#程序的指令集,这里的指令集是微软的.net解释性语言IL (Intermediate Language)。
加载sos模块命令
.load sos
查看所有线程命令
!threads
![](https://img-blog.csdnimg.cn/img_convert/39620ab8665c9c3571bc4fdedebd6bdc.png)
查看当前线程堆栈命令
!clrstack: 当前线程中堆栈的函数调用。
![](https://img-blog.csdnimg.cn/img_convert/70ddca02910c936ad2db461049e14181.png)