メモリ リークの問題をデバッグしようとしています。malloc/free/realloc トレースを取得するためにmtrace()を使用しています。プログラムを実行したところ、巨大なログ ファイルが作成されました。ここまでは順調ですね。しかし、ファイルの解釈に問題があります。次の行を見てください。
@ /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
これに関する奇妙な点は、1 つの呼び出し (同じ戻りアドレス) が 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
これらの 2 行の間で、ブロック 0x2aaab43a1700 が解放されることはありません。
誰もこれを説明する方法を知っていますか? 1 回の呼び出しで 4 つの割り当てが発生するのはなぜですか? また、以前に割り当てられたアドレスを malloc で返すにはどうすればよいでしょうか。
edit 2008/09/30: GLIBC が提供する mtrace() 出力を分析するスクリプト (mtrace.pl) は、ここでは役に立ちません。それはただ言うでしょう:0x2aaab43a1700重複を割り当てます。しかし、どうしてこれが起こるのでしょうか?