使用带有SOS的WinDbg分析转储文件:如何获取所有当前正在执行的请求的URL?

时间:2013-11-12 12:15:58

标签: windbg dump sos

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

2 个答案:

答案 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}