Wie kann ich einen Speicherverlust eines laufenden Prozesses finden?

Wie kann ich einen Speicherverlust eines laufenden Prozesses finden?

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:

  1. Finden Sie die PID des Prozesses heraus, der den Speicherverlust verursacht.

    ps -aux
    
  2. Erfassen Sie es /proc/PID/smapsund speichern Sie es in einer Datei wie BeforeMemInc.txt.

  3. Warten Sie, bis der Speicher erweitert wird.
  4. erneut erfassen /proc/PID/smapsund speichern hatafterMemInc.txt
  5. Finde den Unterschied zwischen dem ersten smapsund dem zweiten smaps, zB mit

    diff -u beforeMemInc.txt afterMemInc.txt

  6. 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
    
  7. Verwenden Sie GDB, um den Speicher bei laufenden Prozessen zu sichern, oder holen Sie sich den Coredump mitgcore -o process

  8. 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
    
  9. Verwenden Sie nun stringsden Befehl oder hexdump -Czum Drucken derdump_outputfile.dump

    strings outputfile.dump
    
  10. Sie erhalten ein lesbares Formular, in dem Sie diese Zeichenfolgen in Ihrem Quellcode platzieren können.

  11. 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_PRELOADeine Neukompilierung vermeiden.

Antwort4

IBMsReinigenist wahrscheinlich das älteste und ausgereifteste Tool überhaupt. Es markiert die Zeilennummer im Code, die den Speicherverlust verursacht.

verwandte Informationen