我正在尝试调试内存泄漏问题。我正在使用mtrace()来获取 malloc/free/realloc 跟踪。我已经运行了我的 prog,现在有一个巨大的日志文件。到现在为止还挺好。但我在解释文件时遇到问题。看看这些行:
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x1502570 0x68
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x1502620 0x30
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x2aaab43a1700 0xa80
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x1501460 0xa64
奇怪的是,一个调用(相同的返回地址)负责 4 个分配。
更陌生:
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x2aaab43a1700 0xa2c
…
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x2aaab43a1700 0xa80
在这两行之间,块 0x2aaab43a1700 永远不会被释放。
有谁知道如何解释这个?一次调用如何导致 4 次分配?malloc 怎么会返回一个之前已经分配好的地址呢?
编辑 2008/09/30:分析 GLIBC (mtrace.pl) 提供的 mtrace() 输出的脚本在这里没有任何帮助。它只会说:Alloc 0x2aaab43a1700 重复。但这怎么会发生呢?