转载:http://www.cnblogs.com/david-qian/archive/2009/01/15/1376225.html
在上一篇的译文中,主要讲解了Tess的Debug系列概况以及Debugger tools的安装和设置。在翻译下一篇文章之前,我打算先和大家讲解下windbg,sos,adplus和tinyget的一些常见命令。了解了这些以后,你将会更加容易的理解以后的文章。
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,它会一直attach在w3wp.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个请求到本地IIS上BuggyBits站点的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 requests,timers以及completion port threads等信息。Timers,work requests以及completion port threads都是CLR的线程种类,在以后的文章中我会详细介绍。
!runaway
它是用来罗列所有正在运行的线程以及它们的CPU占用率。通过这个命令,我们可以很容易的去trouble shooting一些CPU占用率过高的问题。
!threads
它是用来罗列所有正在运行的托管(managed)线程的详细信息,如CLR线程所在的appdomain等等。如果线程的ID显示XXXX,说明这个线程已经结束,等待被回收。
~[id]s
此命令用来切换到某一特定线程。如 ~20s 代表切换到ID为20的线程。
!clrstack
此命令用来显示此线程的managed code 的callstack。我们可以加上-p参数来得到更加详细的信息。
!dumpobject(!do)
通过这个命令,我们可以查看某个特定address的object信息。如果这个address指向一个string,我们就可以看到这个string内存储了什么值。
!dumpstackobjects(!dso)
此命令用来查看被当前线程堆栈引用的所有托管对象。
!dumparray(!da)
当我们查看线程堆栈上的object时,我们可以使用!do命令。但是如果该object是一个array的话,!do只能得到array本身的信息,并非其存储的内容。此时!da就发挥了用场。
!objsize
如果我们想查看一个object的total size的时候,我们需要使用!objsize命令。比如当我们!da一个array时,它显示的size仅仅是包含的type的size,并非实际的size。我们可以使用!objsize address来查看这个array的实际size。
!dumpheap
它是用来查看堆上所有的object。通常我们加上 –stat参数来帮我们做个归类,否则它会罗列出许多繁杂的信息。同时,它还有几个比较常用的参数,如-type,-mt。-type用来列出某一特定类型的所有object,如!dumpheap –type System.String将列出堆上所有的string。-mt是用来列出某一特定MethodTable的所有object。大家知道,每一个引用类型都对应一个MethodTable,假设System.String类型的MethodTable是02c39310,那么我们还可以通过!dumpheap –mt 02c39310来找到堆上所有的string。
这些是一些基本命令的用法,大家需要先有点印象。在后面的文章中,我们会经常遇到这些命令。同时,在后面的文章中,我也会和大家介绍遇到的每一个命令。
Have a nice day!