
Gibt es eine Möglichkeit, den Speicherverlust eines laufenden Prozesses zu finden? Ich kann Valgrind verwenden, um Speicherverluste vor dem Start eines Prozesses zu finden. Ich kann GDB verwenden, um es an einen laufenden Prozess anzuhängen. Wie kann ich Speicherverluste eines laufenden Prozesses debuggen?
Antwort1
Mit den folgenden Schritten finden Sie fast garantiert die Ursache für den Speicherverlust:
Finden Sie die PID des Prozesses heraus, der den Speicherverlust verursacht.
ps -aux
Erfassen Sie es
/proc/PID/smaps
und speichern Sie es in einer Datei wieBeforeMemInc.txt
.- Warten Sie, bis der Speicher erweitert wird.
- erneut erfassen
/proc/PID/smaps
und speichern hatafterMemInc.txt
Finde den Unterschied zwischen dem ersten
smaps
und dem zweitensmaps
, zB mitdiff -u beforeMemInc.txt afterMemInc.txt
Notieren Sie den Adressbereich, in dem der Speicher erweitert wurde, zum Beispiel:
beforeMemInc.txt afterMemInc.txt --------------------------------------------------- 2b3289290000-2b3289343000 2b3289290000-2b3289343000 #ADDRESS Shared_Clean: 0 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Clean: 0 kB Private_Dirty: 28 kB Private_Dirty: 36 kB Referenced: 28 kB Referenced: 36 kB Anonymous: 28 kB Anonymous: 36 kB #INCREASE MEM AnonHugePages: 0 kB AnonHugePages: 0 kB Swap: 0 kB Swap: 0 kB KernelPageSize: 4 kB KernelPageSize: 4 kB MMUPageSize: 4 kB MMUPageSize: 4 kB Locked: 0 kB Locked: 0 kB VmFlags: rd wr mr mw me ac VmFlags: rd wr mr mw me ac
Verwenden Sie GDB, um den Speicher bei laufenden Prozessen zu sichern, oder holen Sie sich den Coredump mit
gcore -o process
Ich habe gdb im laufenden Prozess verwendet, um den Speicher in eine Datei zu sichern.
gdb -p PID dump memory ./dump_outputfile.dump 0x2b3289290000 0x2b3289343000
Verwenden Sie nun
strings
den Befehl oderhexdump -C
zum Drucken derdump_outputfile.dump
strings outputfile.dump
Sie erhalten ein lesbares Formular, in dem Sie diese Zeichenfolgen in Ihrem Quellcode platzieren können.
Analysieren Sie Ihre Quelle, um das Leck zu finden.
Antwort2
Ich findeAbonnierenist genau das, was Sie wollen.
Es behebt Speicherlecks eines laufenden Prozesses, indem es sie anfügt, ohne das Programm neu zu kompilieren oder den Zielprozess neu zu starten. Es ist sehr praktisch und für die Produktionsumgebung geeignet.
Es funktioniert unter GNU/Linux und FreeBSD.
NOTIZ:Ich bin der Autor, jeder Vorschlag ist willkommen.
== BEARBEITEN ==
Ich habe auch ein anderes Tool geschriebenAbonnieren, das Speicherfunktionen über LD_PRELOAD einbindet.
Es ist nicht notwendig, das Zielprogramm zu ändern. Obwohl Sie den Vorgang mit LD_PRELOAD neu starten müssen, können Sie die Erkennung während der Ausführung aktivieren/deaktivieren.
Die Auswirkungen auf die Leistung sind wesentlich geringer, da keine Signalfalle auftritt.
Im Vergleich zu ähnlichen Tools (wie z. B. mtrace) druckt es den vollständigen Aufrufstapel an verdächtigen Speicherleckpunkten.
Antwort3
Unter Linux können Sie aktivierenmtracein Ihrem Programm, aber es ist eine Codeänderung.
Unter OpenBSD könnten Sie versuchen,malloc-Statistiken.
GooglesLecksucherkönnte auch einen Blick wert sein und im Gegensatz zu mtrace können Sie damit möglicherweise LD_PRELOAD
eine Neukompilierung vermeiden.
Antwort4
IBMsReinigenist wahrscheinlich das älteste und ausgereifteste Tool überhaupt. Es markiert die Zeilennummer im Code, die den Speicherverlust verursacht.