运行windbg脚本时内存泄漏

时间:2016-08-09 12:28:56

标签: memory-leaks windbg

 .foreach (runtime {!da 00000086c74c3b70 })
{                                                
    .foreach(obj {!dumpobj  poi(poi(${runtime})+0x8)})

    {
         .if(0 == $sicmp("${obj}", "abcdxxxxxxx"))
         {

           .echo *****
           !dumpobj  poi(poi(${runtime})+0x8)
           !dumpobj  poi(${runtime})
           !dumpobj  poi(${runtime}+0x8)                                                     
           .echo *****
          }

    }   
}

我通过windbg运行上面的代码,windbg进程消耗了几乎所有的PC内存(6G),即使上面的脚本运行完毕也不会释放它。顺便说一句,!da 00000086c74c3b70的结果大约是8000行 我的问题是如何释放内存或防止内存泄漏?

1 个答案:

答案 0 :(得分:0)

让我们一步一步走 !da的结果如下
你怎么能在没有过滤的情况下做这件事。

.foreach将传递名称: System.Int32 MethodTable 621ff680 ....
你脚本中的 [0] ,,, [n] [实际地址] ,难怪windbg
尝试从读取Name,System.int32字符串中的废话并试图将它们转储为对象 我会说,即使你有60 gb,如果你这样做也不够。这样花一些时间来阅读文档

0:004> !da 016e1da4
Name:        System.Int32[]
MethodTable: 621ff680
EEClass:     61e3fd78
Size:        300(0x12c) bytes
Array:       Rank 1, Number of elements 72, Type Int32
Element Methodtable: 621ff6bc
[0] 016e1dac
[1] 016e1db0
[2] 016e1db4
[3] 016e1db8

你可能想在16e1dac,db0,db4,db8等上做.foreach?

如果是这样,你的第一行应该模仿这个,即 而不是dd放置l1 你应该使用你的{? poi($ {place})}无论什么 还要确保这里的每个取消引用都可以被解除引用

0:004> .foreach /pS 16 /ps 1 (place { !da 016e1da4 } ) {dd place l1 }
016e1dac  00000003
016e1db0  00000007
016e1db4  0000000b
016e1db8  00000011
016e1dbc  00000017
016e1dc0  0000001d
016e1dc4  00000025

在这个例子中我不能解除任何引用> poi($ {place})因为它是一个Int数组

0:004> .foreach /pS 16 /ps 1 (place { !da -length 5 016e1da4 } ) {? poi(${place})  }
Evaluate expression: 3 = 00000003
Evaluate expression: 7 = 00000007
Evaluate expression: 11 = 0000000b
Evaluate expression: 17 = 00000011
Evaluate expression: 23 = 00000017

你不能做任意事情并期待理智的结果