GLIBC: Debuggen von Speicherverlusten: so interpretieren Sie die Ausgabe von mtrace()
Ich versuche zu Debuggen, die einen memory-leak problem. Ich bin mit mtrace() um ein malloc/free/realloc Spur. Ich habe meinem prog und habe nun eine riesige log-Datei. So weit So gut. Aber ich habe Probleme mit der Interpretation der Datei. Blick auf diese Zeilen:
@ /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
Das seltsame daran ist, dass ein Anruf (gleiche Adresse zurück) ist verantwortlich für 4 Zuweisungen.
Sogar noch seltsamer:
@ /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
Zwischen diesen beiden Linien der block 0x2aaab43a1700 ist nie freigegeben wird.
Weiß jemand, wie dies zu erklären? Wie könnte man das Ergebnis in 4 Zuweisungen? Und wie könnte malloc Rückkehr eine Adresse bereits zugewiesen zuvor?
Bearbeiten 2008/09/30:
Das Skript zu analysieren, die mtrace () - Ausgabe zur Verfügung gestellt von der GLIBC (mtrace.pl) ist nicht von jedem hier helfen. Es wird nur sagen: Alloc 0x2aaab43a1700 doppelte. Aber wie konnte das passieren?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Funktion, die die Zuordnung der Speicher wird mehr als einmal aufgerufen. Der Aufrufer die Adresse, die Punkte für den code, habe die Zuordnung, und dieser code ist einfach nur mehr als einmal ausgeführt werden.
Hier ist ein Beispiel in C:
Die Ausgabe von mtrace ist:
Beachten Sie, wie der Anrufer die Adresse ist identisch? Dies ist der Grund, warum die mtrace Analyse-Skript ist zu sagen, Sie sind identisch, weil die gleichen Fehler gesehen, mehrmals, wodurch mehrere memory leaks.
Kompilieren mit debug-flags (-g) ist hilfreich, wenn du kannst:
Du suchst, die auf die direkte Ausgabe von mtrace, das ist extrem verwirrend und widersprüchlich. Zum Glück, es ist ein perl-Skript (namens mtrace, gefunden in glibc-utils) kann sehr einfach helfen, die Analyse in dieser Ausgabe.
Zusammenstellen, aufbauen, Debuggen und ausführen von mtrace wie:
Sollte die Ausgabe ein viel leichter zu verdauen.
Eine mögliche Erklärung ist, dass die gleiche Funktion, ist die Zuteilung der verschiedenen Puffer-Größen? Ein Beispiel ist strdup.
Für die zweite Frage, ist es möglich, dass die Laufzeit der Zuteilung einige "statische" scratch-Bereich, die nicht dazu bestimmt sind, befreit zu werden, bis der Prozess beendet wird. Und an diesem Punkt wird das OS clean-up nach dem Prozess trotzdem.
Denken Sie an es auf diese Weise: in Java gibt es keine Destruktoren, und keine Garantien, die Fertigstellung wird immer aufgerufen, für jedes Objekt.
Versuchen, Ihre app unter valgrind. Es könnte Ihnen einen besseren überblick über das, was ist eigentlich durchgesickert.