* Nix sistemlerde büyük bir C / C ++ kodunda bellekle ilgili bir sorun nasıl izlenir / düzeltilir


9

Bellekle ilgili bir sorunu izlerken hangi stratejiyi kullanırsınız? Bellek sızıntılarını, bellek bozulmasını vb. Tanımlamak için hangi araçları (açık kaynaklı ve özel) kullanıyorsunuz? Bir sistemde yalnızca gdb / dbx varsa bellek sızıntılarını nasıl izlersiniz?

Benim için, sadece bir hata ayıklayıcı ile bellek sızıntılarını düzeltmek çok zor.


2
Şahsen bu sorunun unix ile ilgili programlardan daha fazla olduğunu düşünüyorum.
phunehehe

Yanıtlar:


12

Kaynak kodunu değiştirebiliyorsanız, Dmalloc mükemmeldir; hangi işaretçilerin serbest bırakıldığını ve (hata ayıklama simgeleriyle oluşturulan kod için) tam olarak hangi satıra ayrıldıklarını listeler.

Yapamıyorsanız , Valgrind bu tür şeyler için standarttır. Genelde Valgrind'i biraz daha zor buluyorum, ancak daha fazla özelliği var ve kodunuza dmalloc çağrıları eklemeyi içermiyor


dmalloc, çok büyük sistemlerde beklendiği gibi pek performans göstermez. valgrind daha iyi bir bahis ve orada bile darboğazlara çarpacaksınız ...

valgrind --tool memcheck "yourapp" çalışma zamanında bellekle ilgili bilgi verecektir (masaüstü sistemlerinde kullanışlıdır). Başka bir harika araç memwatch ama kaynağınızla birlikte derlenmelidir. Memwatch ayrıntıları bir dosyaya kaydedebilir, böylece gömülü sistemler için daha uygundur.
Ocak


2

Massif (valgrind'ten) bellek sızıntılarını bulmanın en iyi yollarından biridir. Şüpheli kodunuzu tekrarlayın (veya programınızı yeterince uzun süre çalıştırın) ve sonucu ms_print ile silin. Genellikle, çağrı yığını bunu düzeltmek için yeterli bilgi verir.

GDB ile, çalışan bir programa bağlanmayı ve malloc_stats()

Programınız farklı bir dilde yazılmışsa, daha zor olabilir. Son zamanlarda, bazı GDB yazılabilirlik kazandı ve insanlar pdhon belleğini çekirdek dökümünden analiz edebilen gdb-heap gibi ilginç projeler başlattı . C ++ nesneleri için benzer bellek analiz komut dosyaları mümkün olabilir.

Ayrıca /programming/2564752/examining-cc-heap-memory-statistics-in-gdb



1

Bir süredir Objective-C yapıyorum ve C seviyesi bellek yönetimi ve bunun gibi şeylerle ilgilenen bir analizör var. Clang Static Analyzer , Apple'ın xCode IDE'leri ile paketlemeye karar verdiği kadar iyi. Bunun sorunuz için iyi olup olmadığından emin değilim, ancak C yapıyorsanız denemeye değer.


Küçük kelime oyunu: clang en başından itibaren xcode'da kullanılmak üzere geliştirildi. Bkz. Clang.llvm.org/clang_video-05-25-2007.html
Daniel James

Merhaba Daniel, bu doğru olabilir, ancak yakın zamana kadar xCode'a dahil edilmedi (veya en azından Apple'dan indirdiğim pakete dahil değil)
phunehehe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.