.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行 我的问题是如何释放内存或防止内存泄漏?
答案 0 :(得分:0)
让我们一步一步走
!da的结果如下
你怎么能在没有过滤的情况下做这件事。
.foreach将传递名称:, System.Int32 , MethodTable , 621ff680 ....
你脚本中的 [0] ,,, [n] , [实际地址] ,难怪windbg
尝试从
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
你不能做任意事情并期待理智的结果