我有一个需要分析的w3c进程的转储文件。
根据“!DumpHeap -type HttpRequest”,目前有大约三千个活动连接到服务器。
问题是,是否有可能获得这些连接的请求URL?我真的想避免为每个对象做一个!来找到“url”属性的引用..
答案 0 :(得分:1)
.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}
替换为!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)
(或+10)交换!do poi(poi(${object}+90)+8)
。这将打印包含所有字段的.NET字符串对象。如果您想要纯字符串,请再次执行:
MT Field Offset Type VT Attr Value Name
000007feeeaab318 4000104 c System.Char 1 instance 68 m_firstChar
这次我们没有使用!再做一次,因为我们使用原始位和字节并转储带有du poi(poi(${object}+90)+8)+c
的unicode字符串。然后,所有HttpRequests的总命令为:
.foreach (object {!DumpHeap -type System.Web.HttpRequest -short}) { du poi(poi(${object}+90)+8)+c }
答案 1 :(得分:0)
.foreach命令的某些变体,例如
.foreach(object {!sos.DumpHeap -type System.String -short}){!sos.DumpObj object}