David Qian

If there's a problem, just resolve it yourself
windgb,sos,adplus,tinyget常用命令

在上一篇的译文中,主要讲解了Tessdebug系列概况以及debugger tools的安装和设置。在翻译下一篇文章之前,我打算先和大家讲解下windbgsosadplustinyget的一些常见命令。了解了这些以后,你将会更加容易的理解以后的文章。

ASP.NET Debug系列之一:环境搭配

 

1. adplus

这个脚本工具是和debugger tools一起安装的。可以自动的帮你监视某个程序,并在你设定的条件下生成一个dump文件保存在debugger目录下。使用这些工具时,都需要将命令提示符窗口切到debugger目录。常见的用法如下:

adplus  -hang -pn w3wp.exe    
在生成hang状态下的dump时,adplus都会立即产生dump文件。在输入此命令并按enter后,此命令将立即获取一个w3wp.exe的内存切片。但是此命令会弹出一个确认窗口,如果你觉得这个比较麻烦的话,你可以在最后加上 –quiet 命令来避免窗口的弹出。

adplus -hang -p 1234 –quiet  
相信你很快就能发现,上行命令是使用的process name,而这个命令是使用的process id。同时,它可以直接生成dump,不会弹出确认窗口。

adplus -crash -pn w3wp.exe   
此命令是获取程序crash时的dump。它不同于hang立即得到dump,它会一直attachw3wp.exe程序上,直到w3wp.exe程序crash。其它类似参数的效果都同上。

当然,如果你使用Vista的话,你可以很方便的在任务管理器(task manager)中通过右键 Create dump file获取dump文件。

 

2.  tinyget

这个工具是用来对一个网站进行压力测试的。最常用的命令是:

tinyget -srv:localhost -uri:/BuggyBits/FeaturedProducts.aspx -threads:30 -loop:50  
该命令表示同时启动30个线程发送50个请求到本地IISBuggyBits站点的FeaturedProducts页面。你也可以在命令窗口中使用”tinyget /?”查看更多详细的命令。

 

3.  windbg

Windbg的命令都是一点号(.)来开始的,它不同于叹号开始的命令(!),叹号开始的命令都是sos.dll中的命令。

.load sos
每次打开windbg调试.net程序的dump时,我们首先要输入此命令。它的用途是使得windbg可以支持托管代码(managed code)的调试。

.time  
查看dump文件生成时的时间,其中包括系统当前时间,开机总时间,程序运行总时间,程序运行在内核态总时间以及用户态总时间。

 

4. sos.dll

最强大的功能还要数sos.dll中的命令,它是我们调试.net程序的基础。下面介绍一些基本命令:

!help
它用来查看每个命令的用法。如!help !threads,用来查看!threads 命令的具体用法。如果直接使用!help,它将列出sos的基本信息。

!threadpool
通过这个命令,我们可以很容易的看出在dump文件生成时的确切CPU使用率,同时,我们也可以看到队列中等待的work requeststimers以及completion port threads等信息。Timerswork requests以及completion port threads都是CLR的线程种类,在以后的文章中我会详细介绍。

!runaway
它是用来罗列所有正在运行的线程以及它们的CPU占用率。通过这个命令,我们可以很容易的去trouble shooting一些CPU占用率过高的问题。

!threads
它是用来罗列所有正在运行的托管(managed)线程的详细信息,如CLR线程所在的appdomain等等。如果线程的ID显示XXXX,说明这个线程已经结束,等待被回收。

~[id]s
此命令用来切换到某一特定线程。如 ~20s 代表切换到ID20的线程。

!clrstack
此命令用来显示此线程的managed code callstack。我们可以加上-p参数来得到更加详细的信息。

!dumpobject(!do)
通过这个命令,我们可以查看某个特定addressobject信息。如果这个address指向一个string,我们就可以看到这个string内存储了什么值。

!dumpstackobjects(!dso)  
此命令用来查看被当前线程堆栈引用的所有托管对象。

!dumparray(!da)
当我们查看线程堆栈上的object时,我们可以使用!do命令。但是如果该object是一个array的话,!do只能得到array本身的信息,并非其存储的内容。此时!da就发挥了用场。

!objsize
如果我们想查看一个objecttotal size的时候,我们需要使用!objsize命令。比如当我们!da一个array时,它显示的size仅仅是包含的typesize,并非实际的size。我们可以使用!objsize address来查看这个array的实际size

!dumpheap
它是用来查看堆上所有的object。通常我们加上 –stat参数来帮我们做个归类,否则它会罗列出许多繁杂的信息。同时,它还有几个比较常用的参数,如-type-mt-type用来列出某一特定类型的所有object,如!dumpheap –type System.String将列出堆上所有的string-mt是用来列出某一特定MethodTable的所有object。大家知道,每一个引用类型都对应一个MethodTable,假设System.String类型的MethodTable02c39310,那么我们还可以通过!dumpheap –mt 02c39310来找到堆上所有的string

这些是一些基本命令的用法,大家需要先有点印象。在后面的文章中,我们会经常遇到这些命令。同时,在后面的文章中,我也会和大家介绍遇到的每一个命令。

Have a nice day!

posted on 2009-01-15 12:08  Wencui  阅读(2877)  评论(4编辑  收藏  举报