Windows için Hata Ayıklama Araçları ile birlikte Uygulama Doğrulayıcı inanılmaz bir kurulum. Her ikisini de Windows Sürücü Kiti'nin veya daha hafif Windows SDK'sının bir parçası olarak alabilirsiniz . ( Yığın bozulması sorunuyla ilgili daha önceki bir soruyu araştırırken Application Verifier hakkında bilgi edindim.) Geçmişte de BoundsChecker ve Insure ++ (diğer yanıtlarda belirtilmiştir) kullandım, ancak Uygulama Doğrulayıcı'da ne kadar işlevsellik olduğuna şaşırdım.
Elektrikli Çit ("efence" olarak da bilinir), dmalloc , valgrind ve benzerlerinin hepsi bahsetmeye değer, ancak bunların çoğu Windows * 'dan nix altında çalışmak çok daha kolaydır. Valgrind gülünç derecede esnektir: Büyük sunucu yazılımlarını kullanarak birçok yığın sorunu ayıkladım.
Her şey başarısız olduğunda, kendi global operatörünüze yeni / delete ve malloc / calloc / realloc aşırı yükleri sağlayabilirsiniz - bunun nasıl yapılacağı derleyiciye ve platforma bağlı olarak biraz değişecektir - ve bu biraz yatırım olacaktır - ancak uzun vadede ödeyebilir. Arzu edilen özellik listesi, dmalloc ve elektrik çitinden ve şaşırtıcı derecede mükemmel kitap Katı Kod Yazma'dan tanıdık görünmelidir :
- nöbetçi değerleri : her bir tahsisattan önce ve sonra biraz daha fazla boşluk bırakın, maksimum hizalama gerekliliğine uyun; sihirli sayılarla doldur (arabellek taşmalarını ve taşmalarını ve ara sıra "çılgın" işaretçiyi yakalamaya yardımcı olur)
- tahsis dolgusu : yeni ayırmaları sihirli olmayan bir 0 değeriyle doldurun - Visual C ++ bunu Debug derlemelerinde sizin için zaten yapacak (başlatılmamış varların kullanımını yakalamaya yardımcı olur)
- boş dolgu : serbest bırakılmış belleği, 0 durumunda sihirli olmayan bir değerle doldurun, çoğu durumda kayıttan çıkarılırsa bir segfaultu tetiklemek için tasarlanmıştır (sarkan işaretçileri yakalamaya yardımcı olur)
- gecikmeli boş : serbest bırakılmış hafızayı bir süreliğine yığına geri döndürmeyin, boşta dolu tutun, ancak mevcut değil (daha sarkan işaretçileri yakalamaya yardımcı olur, yaklaşık çift boşluğu yakalar)
- izleme : bir tahsisin yapıldığı yeri kaydedebilmek bazen yararlı olabilir
Yerel homebrew sistemimizde (gömülü bir hedef için) izlemeyi diğer şeylerin çoğundan ayrı tuttuğumuza dikkat edin, çünkü çalışma zamanı yükü çok daha yüksektir.
Bu tahsis işlevlerini / operatörlerini aşırı yüklemek için daha fazla nedenle ilgileniyorsanız, "Genel operatörü yeni yüklemek ve silmek için herhangi bir neden var mı?" ; utanmaz öz-tanıtım bir yana, yığın yolsuzluk hatalarını izlemeye yardımcı olan diğer teknikleri ve diğer uygulanabilir araçları listeler.
MS'in kullandığı tahsis / serbest / çit değerleri ararken burada kendi cevabımı bulmaya devam ettiğim için, Microsoft dbgheap dolgu değerlerini kapsayan başka bir cevap .