此篇为阅读vs官方教程后的笔记
WinDbg 入门(用户模式) - Windows drivers |Microsoft学习
1、下载windbg
有旧版和新版之分,本质上是一样的,新版可以直接从应用商店下载,搜索windbg preview,然后下载windbg
2、熟悉界面
3、编写一个除0错误程序
使用vs编写一段如下代码,在计算过程中,做除0操作,这会导致程序崩溃,无法正常打印出结果
在这个程序中,c的值被赋为0,当带入到func函数中的计算y时候,除0计算会导致程序崩溃,无法按期执行打印后面的x和y的值
在编写完成后,右键点击项目生成,然后在文件夹中查看,生成的Project1.exe程序和Project1.pdb文件,其中pdb文件为存储的符号表,需要和exe的生成版本,或者生产时间保持一致
4、使用windbg调试错误程序,在用户模式下(User-Mode)
打开新版windbg,选择运行exe,即点击launch executable
然后在弹出的窗口中选择Project1程序
加载后,程序就会自己运行,并且有代码源文件的情况下,也会直接加载出代码,
接着设置符号表和符号路径
在下面的0:000>位置输入命令
分别输入.symfix和.sympath+你的exe和pdb对应的文件夹目录
.symfix
.sympath+ C:\xxxx
输入后,会有如下提示,表示加载的符号表路径
然后再次输入.reload和bu 你的exe名称!main, 因为main一般是程序执行入口,然后再输入g,“.reload”代表重新加载程序,bu则是给你的exe在main函数位置打上断点,g表示执行程序
.reload
bu Project1!main
g
输入后,可以看到断点已经打在左侧main函数入口处,继续输入g开始执行
此时和vs的调试逻辑一致,按F11进行单步调试即可
5、触发程序崩溃,获取报错信息
当代码执行到第5行的时候,除0计算导致程序崩溃,windbg左侧的command命令行也反馈除报错信息,Integer divide-by-zero.xxxxx(first chance),如果继续执行则会继续报同样的错,xxxx(second chance)
6、分析报错信息
在命令行中输入! analyze -v,分析报错原因,当程序较大的时候,如几MB大小时,分析的时间也会增加,控制台显示BUSY的时候也会更多一些
等待分析结果出来后,可以看到给出了源文件的路径,代码,报错行
7、结语
结合上面的堆栈信息,代码报错位置一般都可以很直观的查看到原因,此时对于复杂的程序,还可以使用相关命令分析崩溃线程
最后调试完毕后,使用qd退出当前运行的程序,对于已经调试到崩溃步骤的程序,如果想重新调试,则需要重新launch exe,使用reload命令则无法重新加载