windbg调试C#程序

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

这时我们就都准备好,可以开始调试了!


!clrstack 错误提示

clrstack: No export clrstack found

如果是.Net3.5或更低版本需要“.loadby sos mscorwks”加载sos。

如果是.Net4.0版本需要“.loadby sos clr”。


查看最耗内存的所在
.cls -------------------------------清屏
~ ----------------------------------查看当前程序的所有线程
~0s --------------------------------切换到我们需要调试的原托管线程中
!Threads ---------------------------命令可以查看进程内所有的托管线程,仅仅是托管线程
!dumpheap -stat --------------------统计堆的信息
!dumpheap -type System.String ------查看string类型在堆中的信息.为什是string,是因为在!dumpheap -stat的结果中,发现string占用最内存最多
!gcroot 02029348 -------------------查看内存很高的堆地址, 02029348 是!dumpheap结果中有对string操作的堆最大的Adress
!help gcroot -----------------------查看gcroot的帮助

gcroot会显示System.String 耗用过多的整个调用过程.
HandleTable:
    001613e8 (pinned handle)
    -> 02fc5328 System.Object[]
    -> 02028ab8 MySql.Data.Common.Cache`2[[System.String, mscorlib],[MySql.Data.MySqlClient.MySqlConnectionStringBuilder, MySql.Data]]
    -> 02028acc System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[MySql.Data.MySqlClient.MySqlConnectionStringBuilder, MySql.Data]]
    -> 020407e0 System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[MySql.Data.MySqlClient.MySqlConnectionStringBuilder, MySql.Data]][]
    -> 02028bf4 MySql.Data.MySqlClient.MySqlConnectionStringBuilder
    -> 02028c18 System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Object, mscorlib]]
    -> 02029348 System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[System.Object, mscorlib]][]
根据这个提示,我们找到源码中MySql.Data.Common.Cache类中的调用代码,然后根据实际情况进行改进


你可能感兴趣的:(C#学习随笔)