【问题标题】:Iterating through !DumpHeap output to read value at memory offset遍历 !DumpHeap 输出以读取内存偏移处的值
【发布时间】:2015-03-22 01:34:26
【问题描述】:

我正在尝试提出一个 WinDbg 命令行表达式,它获取 !DumpHeap 命令的输出,并且对于每个地址,从地址后的偏移量 0x08 读取一个 64 位值。我认为这是可能的(不确定),但到目前为止我所做的每一次尝试都失败了,并出现了一些错误。

我搜索了很多,但大多数 WinDbg 文章都显示了我可以尝试但我尝试失败的简单示例。

我有一个 ASP.NET 工作进程的进程转储。该过程有一些内存增长,但没有明显的违规者,所以我试图列出在内存中多次出现的一些对象。我将 sos.dll 用于托管调试 WinDbg 扩展。

这就是我想要做的事情

.foreach(myaddress {!dumpheap -short -mt 000007fe998adea8})
{r @$t0=poi(myaddress+0x8);!do @$t0;.echo ************* myaddress}

请注意,上述命令必须在一行 - 我在这里只添加了一个换行符以提高可读性。

对于上面的行,WinDbg 打印这个错误:Couldn't resolve error at 'myaddress+0x8);!do @$t0;.echo ************* 00000001003cb870'

我正在尝试遍历 !DumpHeap 返回的所有地址 - 每个地址都应该进入 myaddress 变量。然后,对于每个地址,我尝试将$t0 用户寄存器设置为从myaddress+0x8 读取的值。然后,!do (!DumpObject) 命令会将对象转储到该地址。

如果我只运行(再次,在 WinDbg 中的一行):

.foreach(myaddress {!dumpheap -short -mt 000007fe998adea8})
{!do myaddress;.echo ************* myaddress}

我得到了一个对象转储列表,但这比我需要的高一级。我想更深入地钻取一层并转储我正在迭代的这些顶级对象的特定成员。

这是可能的还是我走错了路?

【问题讨论】:

标签: asp.net memory-leaks clr windbg crash-dumps


【解决方案1】:

经过进一步搜索,我发现我使用了错误的语法。根据questionMSDN,变量名必须用空格包围或必须用${...} 括起来才能起作用。使用${} 附件后,我的脚本开始工作。

为了将来参考,下面是如何运行脚本(在 WinDbg 中保持一行):

.foreach(myaddress {!dumpheap -short -mt 000007fe998adea8})
{r @$t0=poi(${myaddress}+0x8);!do @$t0;.echo ************* myaddress}

【讨论】:

    【解决方案2】:

    是的,您需要在别名周围留出空间

    .foreach ( place { .shell -ci "!DumpHeap -stat" sed 1,3d | awk "{print $1 }" } ) { .foreach (播放 { !DumpHeap -short -mt place } ) { r $t0 = poi( 播放 + 8 ) ; !do @$t0 ; 。回声 ========================================== } }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      相关资源
      最近更新 更多