Cara melacak / memperbaiki masalah terkait memori dalam kode C / C ++ besar pada sistem * nix

9

Strategi apa yang Anda gunakan saat melacak masalah terkait memori? Alat apa yang Anda gunakan (open source dan proprietary) untuk mengidentifikasi kebocoran memori, kerusakan memori, dll? Bagaimana Anda melacak kebocoran memori jika hanya gdb / dbx tersedia pada suatu sistem?

Bagi saya, memperbaiki kebocoran memori hanya dengan debugger sangat sulit.

Hemant
sumber
2
Secara pribadi saya pikir pertanyaan ini lebih terkait pemrograman daripada terkait unix.
phunehehe

Jawaban:

12

Jika Anda dapat mengubah kode sumber, Dmalloc hebat; itu akan mencantumkan pointer mana yang tidak dibuat dan (untuk kode yang dibangun dengan simbol debugging) tepat pada baris mana mereka dialokasikan.

Jika Anda tidak bisa, Valgrind cukup standar untuk hal semacam itu. Saya biasanya menemukan Valgrind agak sulit untuk digunakan, tetapi ia memiliki lebih banyak fitur dan tidak melibatkan penambahan panggilan dmalloc ke dalam kode Anda

Michael Mrozek
sumber
dmalloc tidak terlalu berkinerja seperti yang diharapkan dalam sistem yang sangat besar. valgrind adalah taruhan yang lebih baik, dan bahkan di sana Anda akan mendapatkan hambatan ...
valgrind --tool memcheck "yourapp" akan memberikan info terkait memori dalam runtime (berguna untuk sistem desktop). Alat hebat lainnya adalah memwatch tetapi harus dikompilasi bersama dengan sumber Anda. Memwatch dapat mencatat rincian ke file sehingga lebih cocok untuk sistem tertanam.
rajaganesh87
7

valgrind sangat membantu.

jacksonh
sumber
2

Massif (dari valgrind) adalah salah satu cara terbaik untuk menemukan kebocoran memori. Ulangi kode mencurigakan Anda (atau jalankan program Anda cukup lama) dan buang hasilnya dengan ms_print. Biasanya, tumpukan panggilan memberi Anda cukup informasi untuk memperbaikinya.

Dengan GDB, Anda dapat mencoba melampirkan ke program yang sedang berjalan dan memanggil fungsi seperti malloc_stats()

Jika program Anda ditulis dalam bahasa yang berbeda, itu mungkin lebih rumit. Baru-baru ini, beberapa GDB telah memperoleh skripibilitas, dan orang-orang memulai proyek menarik seperti gdb-heap , yang dapat menganalisis memori Python dari dump inti. Skrip analysys memori serupa mungkin untuk objek C ++.

Baca juga /programming/2564752/examining-cc-heap-memory-statistics-in-gdb

elmarco
sumber
1

Untuk Solaris, ada beberapa alat yang tercantum dalam jawaban untuk pertanyaan StackOverflow ini (termasuk pengecekan kebocoran dengan bentuk lain dari akses memori buruk).

alanc
sumber
1

Saya telah melakukan Objective-C selama beberapa waktu, dan ada analisa yang menangani manajemen memori level C dan hal-hal seperti itu. Clang Static Analyzer sangat bagus sehingga Apple memutuskan untuk menggabungkannya dengan IDE xCode mereka. Saya tidak yakin apakah ini baik untuk pertanyaan Anda, tetapi jika Anda melakukan C maka patut dicoba.

phhehehe
sumber
Quibble minor: dentang dikembangkan untuk digunakan dalam xcode sejak awal. Lihat clang.llvm.org/clang_video-05-25-2007.html
Daniel James
Hai Daniel, itu mungkin benar, tetapi itu tidak termasuk dalam xCode sampai saat ini (atau setidaknya tidak dalam bundel yang saya unduh dari Apple)
phunehehe