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