메모리 누수 문제를 디버그하려고합니다. mtrace()을 사용하여 malloc/free/realloc 추적을 얻습니다. 나는 내 prog을 돌 봤는데 지금은 거대한 로그 파일을 가지고있다. 여태까지는 그런대로 잘됐다. 하지만 파일을 해석하는 데 문제가 있습니다.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 개의 할당을 담당한다는 것입니다.
심지어 낯선 사람 : 블록 0x2aaab43a1700가 해제되고 있지 않습니다 두 라인 사이
@ /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
.
누구든지 이것을 설명하는 방법을 알고 있습니까? 어떻게 하나의 결과를 4 개의 할당으로 부를 수 있습니까? 그리고 malloc은 이전에 이미 할당 된 주소를 어떻게 반환 할 수 있습니까?
편집 2008/09/30 : GLIBC (mtrace.pl)에서 제공하는 mtrace() 출력을 분석하는 스크립트는 여기에 도움이되지 않습니다. 그것은 단지 말할 것이다 : Alloc 0x2aaab43a1700 duplicate. 그러나 어떻게 이런 일이 일어날 수 있습니까?
그것은, 그것의 malloc/realloc을 /은 calloc 하나의 호출 이후 acually뿐만 아니라 하나의 함수 호출의 malloc()을 여러 번이다 : 당신이 할 수있는 경우 디버깅 플래그 (-g)로 컴파일
도움이됩니다 반송 주소는 동일합니다. 런타임에서 스크래치 영역을 할당하는 경우 두 번째 malloc()의 결과로 포인터가 반환되는 이유는 무엇입니까? –