从头开始使用WinDbg 第三部分(高级命令)

 

从头开始使用WinDbg 第三部分(高级命令)

 

 

 

 

 

你知道么,你可以使用一些 for eache if 等来构建你的高级命令。下面列出了控制关键词:

.if

.else

.elseif

.foreach

.for

.while

.do

.break

.continue

.catch

.leave

.printf

.block

 

使用这些关键词,你可以给调试器发送很多高级指令,那会让你的工作更加的简单。极大的提升你的工作成果。

..foreach

让我们从一个简单的例子开始,假如你想研究堆上所有大于65000字节或更大的字符串。 要列出它们你只要输入:!dumpheap -type System.String -min 6500

0:000> !dumpheap -type System.String -min 6500

------------------------------

Heap 0

Address       MT     Size

790da154 790f9244     9280    

0264c4d0 790f9244    32788    

total 2 objects

------------------------------

Heap 1

Address       MT     Size

total 0 objects

------------------------------

Heap 2

Address       MT     Size

0b62e790 790f9244    11284    

total 1 objects

------------------------------

Heap 3

Address       MT     Size

0e6839d0 790f9244    32788    

0e717904 790f9244    32788    

0fb2a320 790f9244     6828    

total 3 objects

------------------------------

total 6 objects

Statistics:

      MT    Count    TotalSize Class Name

790f9244        6       125756 System.String

Total 6 objects

现在的问题是这样的,为了研究每一个字符串,你需要对每一个地址运行 !dumpobject 这个命令,在这里也许是可以接受的,但如果有25 100个怎么办呢? 不知道你是否注意到了这一点。如果你 通过 –short 这个参数,那!dumpheap 会给你最少的信息,仅仅是每个对象的地址

0:000> !dumpheap -type System.String -min 6500 -short

790da154

0264c4d0

0b62e790

0e6839d0

0e717904

0fb2a320

------------------------------

现在让我们来用 .foreache 子句吧。

0:000> .foreach(myVariable {!dumpheap -type System.String -min 6500 -short}){!do myVariable;.echo *************}

Name: System.String

MethodTable: 790f9244

EEClass: 790f91a4

Size: 9280(0x2440) bytes

(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)

String:

WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWGRkAiEPDxYCHwEFZFhYWFhYWFhYWFhYWFhYWFhYWFhYWF

hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhY

WFhYWFhYWFhYWFhkZAInDw8WCh8CBQFFHwMFCjIyLzExLzIwMDcfBAUBVh8FBQFFHwYFASpkZAIpD2QWBGYPZBYEAg

ETC...

 

Fields:

      MT    Field   Offset                 Type VT     Attr    Value Name

790fdb60  4000096        4         System.Int32  1 instance     4632 m_arrayLength

790fdb60  4000097        8         System.Int32  1 instance     4631 m_stringLength

790fad38  4000098        c          System.Char  1 instance       3c m_firstChar

790f9244  4000099       10        System.String  0   shared   static Empty

    >> Domain:Value  000d5eb8:790d57b4 000fb4c0:790d57b4 000ca848:790d57b4 1d8334d8:790d57b4 <<

79122994  400009a       14        System.Char[]  0   shared   static WhitespaceChars

    >> Domain:Value  000d5eb8:026203f0 000fb4c0:02624504 000ca848:026745f0 1d8334d8:026dcef4 <<

*************

Name: System.String

MethodTable: 790f9244

EEClass: 790f91a4

。。。。。。。

由于篇幅的关系,这里仅列出一部分。让我们来分析一下

.foreach    (myVariable

{!dumpheap -type System.String -min 6500 -short}

)

{!do myVariable;.echo *************}

 

myVariable 和它的字面意思一样,是变量名,我希望用它来存放由第一个命令子集的输出数据。第二个命令子集是来执行循环的,首先运行!do,然后我使用 .echo 命令来输出一个分割符,这样便于阅读。

还有更多的参数你可以使用。可以查看帮助来得到更多的信息。

 

.shell

我第一次看见我的一个同事使用过这个命令,他是一个调试方面的专家。

0:000> .shell -i - -ci "!iisinfo.clientconns" FIND /c "Request active"

40

.shell: Process exited

它首先运行 !iisinfo.clientonns”,然后用MS Dos FING 命令来计算字符串“Request active”出现的次数。当然你可以再任何输出中来搜索特定的字符串。例如“”shell -i - -ci "!do 0b62e790" FIND /c /i "<table" ”,或其他你需要的东西。

让我们很快的看一下这个结构: -i”是可选的,用来指定输入,这里我们不使用文件,所以我们使用一个连字符(hyphen)。“.shell  –i  ”,使用 “-ci”的意思是把紧跟的命令当作输入。最后我们指定 用怎么样的shell 命令来处理输入:“ FIND /c "Request active" 。事实上,你可以使用任意复杂的命令来代替“!iisinfo.clientconns”,比如说一个 foreach 循环。

posted @ 2008-01-28 14:36  softfair  阅读(902)  评论(0)    收藏  举报