我想調試內存泄漏問題。我使用mtrace()來獲得malloc/free/realloc跟蹤。我跑了我的編,現在有一個巨大的日誌文件。到現在爲止還挺好。但我在解釋文件時遇到問題。看看這些行:GLIBC:調試內存泄漏:如何解釋輸出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
奇怪的是,一個調用(相同的返回地址)負責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重複。但是,這怎麼會發生?
它不僅是一個函數調用malloc()幾次,這是acually因爲一個調用的malloc/realloc的/釋放calloc:如果你能
與(1)調試標誌(-g)編譯是有幫助返回地址是一樣的。 如果運行時正在分配臨時區域,爲什麼它返回的指針是由於第二個malloc()? – 2008-09-30 22:05:18