使用Windbg 调试.Net程序
一直都在使用.net做Windows Forms和WPF方面的开发,最近正在读 CLR via C#,初识.net核心的一些东东。又由看了熊力blog上用Windbg 调试分析WPF的的一些文章。
感觉Windbg这个东西还是不太容易上手的,关键是需要配置好一些东西和知道一些常用的指令。
下面就从安装Windbg开始说起。
使用windbg,首先要到微软网站上下载最先的windbg程序。网址是:http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx。
安装后就可以在开始菜单找到windbg了。
要先调试.net的程序,需要使用一个扩展的dll,它在C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727路径下,文件名是sos.dll。有了它我们才能运行命令(!clrstack),拷贝一份到Windbg.exe所在的目录。
另一个关键就是调试所需的符号文件Symbol File。参考微软官网:
具体链接是:http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx#a
我们需要连接微软的symbol服务器:在Windbg File菜单下,Symbol File Path中加入这一项,
srv*c:/symbolcache*http://msdl.microsoft.com/download/symbols;
另外就是你所编写的程序的符号文件,它应该在debug目录下,扩展名是pdb的文件,把这个路径也加进来。
这样准备工作就做好了。
运行你要调试的.net程序,切换到Windbg,按F6,出现附加进程对话框。在最下面可以找到你刚启动的程序的进程,OK。
如果是第一次用的话,会需要从微软服务器上下载很多.pdb符号文件,好几十M,需要等待一些时间,尤其是如果网速不好的话。
这时,在Windbg界面的最下面会出现一个命令输入行,我们首先将sos.dll扩展加进来。
输入:.load sos.dll
确保符号文件路径已重新加载:输入:.reload
这时我们就都准备好,可以开始调试了!
输入:~,可以查看当前程序的所有线程。回显中最前面的一列是线程的编号,在输入提示符前面的0:001>表示当前的线程是1号线程。使用k命令可以显示当前线程的Stack Backtrace。
要切换到其他的线程,输入~2s,表示切换到线程2。
对于.net的托管线程,我们可以使用命令!threads查看,切换到启动的托管线程STA才能使用!clrstack命令查看。一般要切换到线程0,即输入~0s,再输入!clrstack。
本人也是刚刚开始使用windbg,难免会有很多错误,希望和大家多多交流。