Bagaimana saya bisa menemukan kebocoran memori dari proses yang sedang berjalan?

19

Apakah ada cara, saya dapat menemukan kebocoran memori dari proses yang sedang berjalan? Saya dapat menggunakan Valgrind untuk menemukan kebocoran memori sebelum memulai suatu proses. Saya bisa menggunakan GDB untuk melampirkannya ke proses yang sedang berjalan. Bagaimana saya bisa men-debug kebocoran memori dari proses yang sedang berjalan?

bagaimana cara kerjanya
sumber
Valgrind sangat berguna, saya bahkan menyebutnya intuitif.
user400344

Jawaban:

13

Berikut ini hampir langkah-langkah jaminan untuk menemukan siapa yang membocorkan memori:

  1. Cari tahu PID dari proses yang menyebabkan kebocoran memori.

    ps -aux
  2. ambil /proc/PID/smapsdan simpan ke dalam beberapa file seperti BeforeMemInc.txt.

  3. tunggu sampai ingatan bertambah.
  4. tangkap lagi /proc/PID/smapsdan simpanafterMemInc.txt
  5. temukan perbedaan antara pertama smapsdan ke-2 smaps, misalnya dengan

    diff -u beforeMemInc.txt afterMemInc.txt

  6. catat kisaran alamat tempat memori bertambah, misalnya:

       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. gunakan GDB untuk membuang memori saat menjalankan proses atau menggunakan coredump gcore -o process

  8. Saya menggunakan gdb pada proses yang berjalan untuk membuang memori ke beberapa file.

    gdb -p PID
    dump memory ./dump_outputfile.dump 0x2b3289290000 0x2b3289343000
  9. sekarang, gunakan stringsperintah atau hexdump -Cuntuk mencetakdump_outputfile.dump

    strings outputfile.dump
  10. Anda mendapatkan formulir yang dapat dibaca di mana Anda dapat menemukan string itu ke dalam kode sumber Anda.

  11. Analisis sumber Anda untuk menemukan kebocoran.

Jagannath Pattar
sumber
12

Saya pikir memleax persis apa yang Anda inginkan.

Ini menghilangkan kebocoran memori dari proses yang berjalan dengan melampirkannya, tanpa mengkompilasi ulang program atau memulai kembali proses target. Ini sangat nyaman dan cocok untuk lingkungan produksi.

Ini berfungsi pada GNU / Linux dan FreeBSD.

CATATAN: Saya penulis, semua saran disambut

== EDIT ==

Saya menulis alat lain libleak , yang mengaitkan fungsi memori dengan LD_PRELOAD.

Juga tidak perlu memodifikasi program target. Meskipun Anda harus memulai kembali kemajuan dengan LD_PRELOAD, Anda dapat mengaktifkan / menonaktifkan deteksi selama menjalankan.

Ada jauh lebih sedikit dampak pada kinerja karena tidak ada jebakan sinyal.

Dibandingkan dengan alat serupa (seperti mtrace), ini mencetak tumpukan panggilan penuh pada titik kebocoran memori yang mencurigakan.

Bingzheng Wu
sumber
1
Saya menjamin memleax sebagai alat yang sangat berguna untuk memantau kebocoran yang jelas. The ringkasan output sangat efektif . Hampir seperti saya akan menulisnya jika saya memiliki kekuatan pemrosesan untuk melakukannya secara manual. Terima kasih untuk ini
lihat
6

Di Linux, Anda bisa mengaktifkan mtrace di program Anda, tetapi itu adalah perubahan kode.

Di OpenBSD, Anda bisa mencoba statistik malloc .

Pemeriksa kebocoran Google juga layak untuk dilihat, dan tidak seperti mtrace yang dapat Anda gunakan LD_PRELOADuntuk menghindari kompilasi ulang.

Tak berguna
sumber
0

Saya pikir tanpa memberikan dukungan untuk pemantauan alokasi setelah program dimulai langsung dalam kode sumber, Anda kurang beruntung. Berikut adalah dua alasan yang dapat saya pikirkan:

  • Heap checker dimulai ketika program dimulai. Beberapa menawarkan kemampuan untuk mengubah waktu yang tepat, tetapi variabel lingkungan yang memulai mereka harus diatur ketika program berjalan. Ini karena mereka mengawasi untuk memastikan setiap alokasi memiliki deallokasi yang sesuai, dan mereka akan melewatkan beberapa sebaliknya.
  • Heap checking biasanya membutuhkan hak-hak tinggi, atau kait, untuk disediakan oleh sistem operasi. Jika kait itu tidak disediakan pada saat program dimulai, checker tumpukan tidak dapat memanfaatkannya. Saya tidak percaya OS memberikan hak istimewa ini setelah program tersebut dimulai.

Namun, jika program Anda berjalan di dalam mesin virtual, lingkungan itu dapat memberikan dukungan untuk memantau alokasi. Saya tahu Java memiliki beberapa alat pemantauan alokasi dan pengumpulan sampah (seperti visualVM ) yang dilampirkan ke menjalankan program atau VM.

Chris Betti
sumber
0

IBM's Purify mungkin adalah alat tertua dan paling canggih dari semuanya. Ini akan menandai nomor baris dalam kode yang menyebabkan kebocoran memori.

keseimbangan hidup
sumber