Я пытаюсь отладить проблему утечки памяти. Я использую mtrace () , чтобы получить трассировку malloc / free / realloc. Я запустил свою прогу и теперь у меня огромный лог-файл. Все идет нормально. Но у меня проблемы с интерпретацией файла. Посмотрите на эти строки:
@ /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:
Скрипт для анализа вывода mtrace (), предоставленный GLIBC (mtrace.pl), здесь не поможет. Он просто скажет: Alloc 0x2aaab43a1700 дублировать. Но как это могло произойти?