2

我有一个需要分析的 w3c 进程的转储文件。
根据“!DumpHeap -type HttpRequest”,目前有大约三千个到服务器的活动连接。
问题是是否可以获得这些连接的请求 URL?我真的很想避免为每个对象做一个 !do 来查找“url”属性的引用..

4

2 回答 2

3
.foreach (object {!DumpHeap -type System.Web.HttpRequest -short}) { !do ${object} }

这将转储每个 HttpRequest。URL 更深一些。首先,您必须找到_url属性的偏移量:

              MT    Field   Offset                 Type VT     Attr            Value Name
000007feedc1cc70  4000d7d       90           System.Uri  0 instance 00000000025f2020 _url

在这种情况下(64 位),它位于偏移量 0x90。要转储所有 Uri 对象,请将!do ${object}by替换为!do poi(${object}+90). 但这仍然不是 URL,所以让我们看看:

              MT    Field   Offset                 Type VT     Attr            Value Name
000007feeeaa68f0  400161c        8        System.String  0 instance 00000000025f1e18 m_String
000007feeeaa68f0  400161d       10        System.String  0 instance 0000000000000000 m_originalUnicodeString

在偏移量 0x8 处,URI 有一个字符串,而在 0x10 处有另一个字符串。我们再次添加偏移量,因此交换!do poi(${object}+90)!do poi(poi(${object}+90)+8)或+10)。这将打印带有所有字段的 .NET 字符串对象。如果你想要纯字符串,再做一次:

              MT    Field   Offset                 Type VT     Attr            Value Name
000007feeeaab318  4000104        c          System.Char  1 instance               68 m_firstChar

这次我们不再使用 !do 了,因为我们使用的是原始位和字节,并使用 .dump 转储 unicode 字符串du poi(poi(${object}+90)+8)+c。所有 HttpRequests 的总命令是:

.foreach (object {!DumpHeap -type System.Web.HttpRequest -short}) { du poi(poi(${object}+90)+8)+c }
于 2013-12-26T21:46:42.253 回答
0

该命令的一些变体.foreach,例如

.foreach (object {!sos.DumpHeap -type System.String -short}) { !sos.DumpObj object }
于 2013-11-16T03:05:44.477 回答