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

使用WinDbg和SOS分析转储文件:如何获取当前执行的所有请求的URL?,windbg,dump,sos,Windbg,Dump,Sos,我有一个w3c进程的转储文件需要分析 根据“!DumpHeap-type HttpRequest”,目前有大约3000个到服务器的活动连接。 问题是,是否可以获取这些连接的请求URL?我真的很想避免做一件事!对每个对象执行此操作以查找“url”属性的引用。foreach命令的一些变体,例如 .foreach (object {!sos.DumpHeap -type System.String -short}) { !sos.DumpObj object } 这将转储每个HttpRequest。

我有一个w3c进程的转储文件需要分析
根据“!DumpHeap-type HttpRequest”,目前有大约3000个到服务器的活动连接。

问题是,是否可以获取这些连接的请求URL?我真的很想避免做一件事!对每个对象执行此操作以查找“url”属性的引用。

foreach命令的一些变体,例如

.foreach (object {!sos.DumpHeap -type System.String -short}) { !sos.DumpObj object }
这将转储每个HttpRequest。URL的位置更深一点。首先,您必须找到
\u url
属性的偏移量:

              MT    Field   Offset                 Type VT     Attr            Value Name
000007feedc1cc70  4000d7d       90           System.Uri  0 instance 00000000025f2020 _url
在本例中(64位),它位于偏移量0x90处。要转储所有Uri对象,请替换
!通过
执行${object}
!执行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处有另一个字符串。我们再次添加偏移量,因此交换
!通过
执行poi(${object}+90)
!执行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
这次我们不用了!再做一点,因为我们使用的是原始比特和字节,转储一个带有
dupoi(poi(${object}+90)+8)+c
的unicode字符串。所有HttpRequests的总命令如下:

.foreach (object {!DumpHeap -type System.Web.HttpRequest -short}) { du poi(poi(${object}+90)+8)+c }

非常有用的回答。可惜他打了又跑:/
.foreach (object {!DumpHeap -type System.Web.HttpRequest -short}) { du poi(poi(${object}+90)+8)+c }