运行 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
你不能随心所欲地做事并期待理智的结果
.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
你不能随心所欲地做事并期待理智的结果