【发布时间】:2016-08-09 12:28:56
【问题描述】:
.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 行 我的问题是如何释放内存或防止内存泄漏?
【问题讨论】:
-
.foreach ... !dumpobj似乎没有意义。 `!dumpobj´ 作用于单个对象。你期望循环什么?垃圾场有多大? 6 GB 是否大致等于转储的大小?根据访问的内存,WinDbg 可能会将转储的这些部分读入内存,并且会像在任何其他程序中一样进行处理。 -
dump的大小在1G左右,数组的每个元素都是bucket,有如下布局,
private struct bucket{ public object key; public object val; public int hash_coll;},而key的类型,也就是bucket的字段之一,是类,其中包含一个字符串字段。所以 poi(poi(${runtime})+0x8)} 的结果是 key 字段之一的字符串实例的地址,所以 !dumpobj poi(poi($ {runtime})+0x8) 包含字符串常量本身之外的许多字段,所以我使用 .foreach(obj {!dumpobj poi(poi(${runtime})+0x8)}) 进行过滤。 -
顺便说一句,我参考下面的网址写windbg脚本debuggingtoolbox
-
@Jason WinDbg 泄漏是众所周知的。正如您所发现的,它在输出/解析大量数据的脚本中变得更加明显。据我所知,您对此无能为力。没有手动内存释放命令。不理想,但是当这种情况发生在我身上时,我通常会重新启动调试会话。您可以尝试向 Microsoft 报告它,但我不希望及时修复;我已经看到这个问题很多年了。
-
@dono 从 DrewBliss 到 Andyluhrs 观看 windbgfb@microsoft.com 的人们确实承认并回复,如果您报告重现问题的具体步骤的问题,模糊的不可重现的绝对陈述可能不会引起响应跨度>
标签: memory-leaks windbg