WinDbg 的入门经历
WinDbg 是一款非常好用的调试工具,针对于在win上的程序都有很好的调试效果,相信玩逆向工程 .Net 开发的同学都很熟悉
起因
在调试UCOS操作系统在windows上的仿真问题遇到的多线程调度崩溃的情况,使用VS的工程debug用着十分难受,在调试多线程的时候总有些不习惯 ( 或者有懂行的指导一下怎么调试也行 /狗头 )。百度一番确实WinDbg功能十分强大,遂用之。
WinDbg简介
- WinDbg 一般在安装VS 的时候会进一步安装Windows kit ,随之会默认安装WinDbg 64 和 32。一般在
...\Windows Kits\10\Debuggers
下会有两个工具。 - WinDbg 主流的是三个版本 6,10,pre 一般默认安装的是10,10相对6有很大进步,直接鼠标直接超链接很多信息,但是个人很喜欢pre的ui,毕竟也到了2022年了
- WinDbg 功能很强大,指令也很多,主要的调试方式还是指令来操作的,相当于vs直接断点调试更加底层,通过命令可以直接访问单个内存,堆栈信息,线程情况等等
- WinDbg 个人觉得最好的教程还是
张银奎 格蠹汇编
( 大佬的技术一流,文笔也非常好,值得一看的好书 )
使用方式
WinDbg 有很多种使用方式
- 在有VS的工程的情况下直接使用WinDbg来调试
- 在工具 -> 外部工具下 新添加一个工具
- 命令部分添加到你的WinDbg目录,一般来说如果你是32的系统用32的调试器,但是官方的说法是不是很影响,64的适用范围更加广泛。
- 参数部分添加上你的项目地址和目标路径地址,目标路径的地址指向了产生 pdb,exe文件的地址,直接填上就行 如果你适用了其他的dll或者是你的项目有其他的路径 在后面隔开就可以
-srcpath $(ProjectDir) $(TargetPath) - 初始目录一般为目标路径
- 配置好了之后就可以直接点击 工具 -> WinDbg 来使用WinDbg 进行调试
- 默认程序加载的时候是debug状态 可以直接运行循环来监控整个状态
- 抓取 Dump 文件来进行分析
抓取 Dump 有很多种方式 这里简单介绍2个- 使用任务管理器进行抓取
找到你的进程,右键创建转储文件,这里一般抓取的是mini dump 文件 - 使用 Procdump 来抓Dump文件
Procdump 是一个非常强大的抓取工具,可以配置条件触发抓取动作,网上很多安装教程,只要把你下载解压的文件路径添加到你的环境变量中,在cmd中可以成功识别这个同名的命令 他甚至还直接提供了使用教程 真的 我哭死!
- 使用任务管理器进行抓取
调试分析
!help sos指令帮助
!threads 显示所有线程
!threadpool(!tp) 显示程序池信息
!ProcInfo 显示进程信息
!dumpheap 显示托管堆的信息
!dumpheap -stat 检查当前所有托管类型的统计信息
!dumpheap -type Person –stat 在堆中查找指定类型(person)对象,注意大小写敏感
!clrstack 显示调用栈
!clrstack -p 显示调用栈,同时显示参数
!clrstack 只显示托管代码,而kb只显示非托管代码
!dumpobj(!do) 显示一个对象的内容
!dumparray(!da) 显示数组
!DumpStackObjects(!dso) 当前线程对象分配过程
!syncblk 显示同步块
!runaway 显示线程cpu时间
!gcroot 跟踪对象内存引用
!pe 打印异常
!ObjSize 查看对象大小 ObjSize 用于知道对象地址时,查看该对象的大小。
!GCRoot 是一个非常有用的命令,它能够帮助我们发现某对象上目前还存在的有效引用。这也是为什么GC还不回收这个对象的原因。这个信息可以很好的帮助我们分析那些本应该没有引用,但却一直还存在有效引用的对象,由此发现我们代码中潜在的内存泄漏,同时我们也可以观察到哪些对象是目前没有引用了。
~*k 结合~和k命令,来显示所有线程的callstack
.cls 清屏
kb 显示当前线程的callstack