windbg: .Net 程序员的dump 分析

Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。在 Windows 系统上, dump 文件分为内核 dump 和用户态 dump 两种。前者一般用来分析内核相关的问题,比如驱动程序;后者一般用来分析用户态程序的问题。

WinDBG不是专门用于调试.Net程序的工具,它更偏向于底层,可用于内核和驱动调试。进行普通的.Net程序调试还是使用微软专为.Net开发的调试工具MDBG更方便一些。但是WinDBG能看到更多的底层信息,对于某些特别疑难的问题调试有所帮助,例如内存泄漏等问题。

首先添加设定符号文件路径(Symbol Path),当你使用Visual Studio编译程序时,是否有留意到在bin/Debug文件夹下会有.pdb后缀的文件?这些文件包含有dll程序集的调试符号,pdb文件并不包含有执行代码,只是使调试工具能把代码执行指令翻译为正确的可识别字符。微软提供了包含大量pdb文件的公共服务器,地址如下:http://msdl.microsoft.com/download/symbols。打开windbg程序,选择“File->Symbol File Path…“,把下面的内容复制进去保存。srv*d:\debug\symbols*http://msdl.microsoft.com/download/symbols。

面这行命令 如果你发现出现Unable to verify checksum...或者的消息 那是因为你没有添加.net的sos扩展或者sos的版本没有对应上。.Net1.1时代的SOS扩展已经自带于下载安装的WinDBG中,从.Net2.0以后,SOS扩展已经自带到.Net框架中:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\SOS.dll,为了不至于引起混淆,最好的方法就是使用前面的loadby调试器元命令来让WinDBG自己决定加载什么版本的SOS。

具体的方法可以查看另外一篇文章

实战命令: ~ 查看线程

windbg: .Net 程序员的dump 分析_第1张图片

这表明当前dump里记录的线程数。如果要切换线程,用波浪线+序号+s来切换,如切换到线程2,那么用~2s即可。

lm 查看你加载的模块windbg: .Net 程序员的dump 分析_第2张图片

kb 查看native code调用栈

用~现在只有线程信息,对于每个线程,在被抓的那一刻,在执行什么,我们有命令:kb。

windbg: .Net 程序员的dump 分析_第3张图片

看到clr大家应该很眼熟吧。这里已经可以看到较详细的调试信息了。

!runaway    (查看线程对应 CPU 运行时间)

windbg: .Net 程序员的dump 分析_第4张图片

因为我们的测试程序是测试的是线程阻塞所以我们选一个运行时间为0的,例如415

!dso 查看这个堆栈中的对象

windbg: .Net 程序员的dump 分析_第5张图片

!clrstack 查看这个线程的托管代码调用栈

windbg: .Net 程序员的dump 分析_第6张图片

通过上面我们已经可以看出这个线程一直都是处于阻塞状态。

到这里基本上一个小的测试程序可以告一段落了,当然windbg的功能远远不止如此,这里分享一些资源给大家。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(WindDbg,调试)