从头开始使用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 790da154 total 2 objects ------------------------------ Heap 1 total 0 objects ------------------------------ Heap 2 0b62e790 total 1 objects ------------------------------ Heap 3 0e6839d0 0e717904 0fb total 3 objects ------------------------------ total 6 objects Statistics: MT Count TotalSize Class Name Total 6 objects |
现在的问题是这样的,为了研究每一个字符串,你需要对每一个地址运行 !dumpobject 这个命令,在这里也许是可以接受的,但如果有25 或100个怎么办呢? 不知道你是否注意到了这一点。如果你 通过 –short 这个参数,那!dumpheap 会给你最少的信息,仅仅是每个对象的地址
|
0:000> !dumpheap -type System.String -min 6500 -short 790da154 0b62e790 0e6839d0 0e717904 0fb ------------------------------ |
现在让我们来用 .foreache 子句吧。
|
0:000> .foreach(myVariable {!dumpheap -type System.String -min 6500 -short}){!do myVariable;.echo *************} Name: System.String MethodTable: EEClass: Size: 9280(0x2440) bytes (C:\WINDOWS\assembly\GAC_32\mscorlib\ String: WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWGRkAiEPDxYCHwEFZFhYWFhYWFhYWFhYWFhYWFhYWFhYWF hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhY WFhYWFhYWFhYWFhkZAInDw8WCh8CBQFFHwMFCjIyLzExLzIwMDcfBAUBVh8FBQFFHwYFASpkZAIpD2QWBGYPZBYEAg ETC... Fields: MT Field Offset 790fdb60 4000096 4 System.Int32 1 instance 790fdb60 4000097 8 System.Int32 1 instance 790fad38 >> Domain:Value 000d5eb8:790d57b4 000fb 79122994 >> Domain:Value 000d5eb8: ************* Name: System.String MethodTable: EEClass: 。。。。。。。 |
由于篇幅的关系,这里仅列出一部分。让我们来分析一下
.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 循环。

浙公网安备 33010602011771号