运行 windbg 脚本时内存泄漏

memory leak when running the windbg script

 .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 行 我的问题是如何释放内存或防止内存泄漏?

一步步来 !da的结果如下
你怎么能在不过滤的情况下做 .foreach

.foreach 将传递 Name: , System.Int32 , MethodTable , 621ff680 ....
[0] , [n] , [实际地址] 在你的脚本中,难怪 windbg
拼命地从 Name , System.int32 strings 中读取废话并尝试将它们转储为对象
我会说,即使你有 60 GB,如果你像这样执行 .foreach 也不够,需要一些时间来阅读文档

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

你不能随心所欲地做事并期待理智的结果