SORU
18 HAZİRAN 2009, PERŞEMBE


Nasıl yığın bozulması hataları ayıklamak için?

(Yerli) bir çok iş parçacıklı C uygulama Visual Studio 2008 altında hata ayıklama ediyorum. Rastgele vesilelerle, "Windows bir kırılma noktası tetikledi..." bu öbek bozulması nedeniyle olabilecek bir not ile hata. bir olsun Bu hatalar her zaman kısa sonra kaza olasılığı olmasına rağmen uygulama hemen kaza olmaz.

Bu hatalar büyük sorun yolsuzluk aslında onları çok sert bir şekilde izlemek ve hata ayıklama için özellikle çok parçacıklı bir uygulama yapan yer aldı, sonra onlar pop.

  • Ne gibi şeyler bu hatalar neden olabilir?

  • Onları nasıl debug edebilirim?

İpuçları, araçlar, yöntemler, enlightments... bekliyoruz.

CEVAP
18 HAZİRAN 2009, PERŞEMBE


Application Verifier Debugging Tools for Windows ile birlikte inanılmaz bir tuzak. Windows Driver Kit or the lighter Windows SDK bir parçası olarak siz de alabilirsiniz. (earlier question about a heap corruption issue. bir araştırma Uygulama Doğrulayıcı öğrendi) İşlevselliği Uygulama Doğrulayıcı ne kadar şaşırmış olsam da boundschecker uygulamasının ve Sigorta (diğer cevap belirtilen) geçmişte çok kullandım.

Elektrikli Çit (nam-ı diğer "efence"), dmalloc, valgrind, ve benzeri tüm kayda değer, ama en çok da bunlar çok kolay elde altında çalışan *nix daha Windows. Valgrind olduğunu gülünç esnek: çok yığın sorunları ile büyük sunucu yazılımını kullanarak debug ettim.

Ne zaman her şeyin başarısız, sen-ebilmek sağlamak senin kendi küresel operatör yeni/Sil ve malloc/calloc/realloc aşırı -- nasıl bu kadar değişir bir bit bağlı olarak derleyici ve platform -- ve bu biraz bir yatırım ama olabilir ödemek üzerinde uzun çalıştırın. Arzu edilen özellik listesi dmalloc ve electricfence tanıdık bakmak gerekir, ve şaşırtıcı derecede mükemmel kitabı Writing Solid Code:

  • nöbetçi değerlerve her ayırma öncesi ve sonrası biraz daha fazla boşluk bırakın, maksimum uyum gereksinimi; dolgu ile sihirli numaraları (tampon taşması ve underflows yakalamak yardımcı olur, ve arada sırada "" işaretçi) vahşi . saygı
  • doldurma ayırma: -- Visual C zaten sizin için yapacak dışı 0 büyü değeri hata Ayıklama yapılarında yeni ayırma (başlatılmamış değişkenleri kullanmak yakalamak yardımcı olur) doldurun
  • ücretsiz doldurun: non-0 büyü değeri, çoğu durumda başvuru yapıldı eğer bir segfault tetiklemek için tasarlanmış serbest bellek (sarkan işaretçiler yakalamak yardımcı olur) doldurun
  • ücretsiz erteledi: yığın bellek, bir süre serbest, serbest dolu ama kullanılabilir (daha fazla sarkan işaretçiler yakalamak yardımcı olur, yakın yakalar çift serbest bırakır) . geri dönüş yok
  • izlemebir ayırma yapıldığı kaydetmek için güçlü olmak bazen faydalı olabilir

Yerel homebrew sistemi (gömülü bir hedef için) çalışma zamanı yükü çok yüksek olduğu için izleme diğer şeyler çoğu ayrı tutuyoruz, unutmayın.


Eğer ilgileniyorsanız daha fazla sebep için aşırı bu ayırma fonksiyonları/operatörler, bir göz atın my answer to "Any reason to overload global operator new and delete?"; utanmaz kendini promosyon yana, bu listeleri diğer teknikler yararlıdır izleme yığın bozulması hataları, yanı sıra diğer ilgili araçlar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Booredatwork.com

    Booredatwork

    5 Ocak 2009
  • DJAndrewRyan

    DJAndrewRyan

    22 Ocak 2007
  • happyjpy

    happyjpy

    22 AĞUSTOS 2009