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?
c
gdb
memory-leaks
bagaimana cara kerjanya
sumber
sumber
Jawaban:
Berikut ini hampir langkah-langkah jaminan untuk menemukan siapa yang membocorkan memori:
Cari tahu PID dari proses yang menyebabkan kebocoran memori.
ambil
/proc/PID/smaps
dan simpan ke dalam beberapa file sepertiBeforeMemInc.txt
./proc/PID/smaps
dan simpanafterMemInc.txt
temukan perbedaan antara pertama
smaps
dan ke-2smaps
, misalnya dengandiff -u beforeMemInc.txt afterMemInc.txt
catat kisaran alamat tempat memori bertambah, misalnya:
gunakan GDB untuk membuang memori saat menjalankan proses atau menggunakan coredump
gcore -o process
Saya menggunakan gdb pada proses yang berjalan untuk membuang memori ke beberapa file.
sekarang, gunakan
strings
perintah atauhexdump -C
untuk mencetakdump_outputfile.dump
Anda mendapatkan formulir yang dapat dibaca di mana Anda dapat menemukan string itu ke dalam kode sumber Anda.
Analisis sumber Anda untuk menemukan kebocoran.
sumber
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.
sumber
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_PRELOAD
untuk menghindari kompilasi ulang.sumber
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:
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.
sumber
IBM's Purify mungkin adalah alat tertua dan paling canggih dari semuanya. Ini akan menandai nomor baris dalam kode yang menyebabkan kebocoran memori.
sumber