Gibt es eine Möglichkeit, das Speicherleck eines laufenden Prozesses zu finden? Ich kann Valgrind verwenden, um Speicherlecks vor dem Start eines Prozesses zu finden. Ich kann GDB verwenden, um es an einen laufenden Prozess anzuhängen. Wie kann ich Speicherlecks eines laufenden Prozesses debuggen?
c
gdb
memory-leaks
howtechstuffworks
quelle
quelle
Antworten:
Hier ist fast Garantie Schritte, um herauszufinden, wer den Speicher verliert:
Ermitteln Sie die PID des Prozesses, der einen Speicherverlust verursacht.
nimm das auf
/proc/PID/smaps
und speichere es in irgendeiner Datei wieBeforeMemInc.txt
./proc/PID/smaps
und speichern hat esafterMemInc.txt
finde den Unterschied zwischen erstem
smaps
und zweitemsmaps
, zB mitdiff -u beforeMemInc.txt afterMemInc.txt
Notieren Sie den Adressbereich, in dem der Speicher vergrößert wurde, zum Beispiel:
Verwenden Sie GDB, um den Arbeitsspeicher beim Ausführen des Prozesses zu sichern, oder rufen Sie den Coredump mit ab
gcore -o process
Ich habe gdb beim Ausführen von process verwendet, um den Speicher in eine Datei zu verschieben.
Verwenden Sie jetzt den
strings
Befehl oderhexdump -C
, um die zu druckendump_outputfile.dump
Sie erhalten ein lesbares Formular, in dem Sie diese Zeichenfolgen in Ihrem Quellcode finden können.
Analysieren Sie Ihre Quelle, um das Leck zu finden.
quelle
Ich denke, Memleax ist genau das, was Sie wollen.
Es behebt den Speicherverlust eines laufenden Prozesses, indem es ihn anfügt, ohne das Programm neu zu kompilieren oder den Zielprozess neu zu starten. Es ist sehr bequem und geeignet für produktionsumgebung.
Es funktioniert unter GNU / Linux und FreeBSD.
HINWEIS: Ich bin der Autor, jeder Vorschlag wird begrüßt
== EDIT ==
Ich schreibe ein weiteres Tool libleak , das Speicherfunktionen von LD_PRELOAD einbindet.
Das Zielprogramm muss auch nicht geändert werden. Obwohl Sie den Fortschritt mit LD_PRELOAD neu starten müssen, können Sie die Erkennung während der Ausführung aktivieren / deaktivieren.
Die Leistung wird wesentlich weniger beeinträchtigt, da keine Signalfalle vorhanden ist.
Im Vergleich zu ähnlichen Tools (wie mtrace) wird der gesamte Aufrufstapel an einer verdächtigen Speicherleckstelle gedruckt.
quelle
Unter Linux können Sie mtrace in Ihrem Programm aktivieren , es handelt sich jedoch um eine Codeänderung.
Unter OpenBSD können Sie die malloc-Statistiken ausprobieren .
Google- Leck checker wert sein könnte auch einen Blick, und im Gegensatz zu mtrace können Sie in der Lage sein zu verwenden ,
LD_PRELOAD
zu vermeiden Neuübersetzung.quelle
Ich denke, ohne Unterstützung für die Zuordnungsüberwachung nach dem Programmstart direkt im Quellcode, haben Sie Pech. Hier sind zwei Gründe, die mir einfallen:
Wenn Ihr Programm jedoch in einer virtuellen Maschine ausgeführt wird, bietet diese Umgebung möglicherweise Unterstützung für die Überwachung von Zuweisungen. Ich weiß, dass Java verschiedene Tools zur Zuordnungs- und Speicherbereinigungsüberwachung (wie VisualVM ) hat, die mit laufenden Programmen oder VMs verbunden sind.
quelle
IBM Purify ist wahrscheinlich das älteste und fortschrittlichste Tool überhaupt. Es kennzeichnet die Zeilennummer im Code, die den Speicherverlust verursacht.
quelle