2011-04-12 9 views
8

Bir süre içinde C++ yapmamıştım, ama birileri için üzerinde çalıştığım büyük bir projeyi bitirmeye karar verdim. Şimdi aşağıdaki hata iletisini alıyorum ...C++ Yolsuzluk Yolsuzluğu

HEAP CORRUPTION ALGILANMIŞ: 0x17DEB940 adresindeki Normal Bloktan (# 1761) sonra. CRT Uygulamanın, yığın arabelleğinin sona ermesinden sonra belleğe yazıldığını tespit etti.

Yapmış olabileceğimi düşündüğüm tüm işlevlere adım atıyorum ama bir kayıp yaşıyorum. Bu aşağı avlamak için daha gelişmiş hata ayıklama özelliklerini kullanarak herhangi bir yolu var mı?

+0

Hangi platformdasınız? – Potatoswatter

+0

Üzgünüz, MSVC 2008 –

+0

Teşekkürler. Heh, ilk önce Linux, Mac ve agnostik cevapların yayınlanma şansı nedir? – Potatoswatter

cevap

4

Klasik bellek bozulması hatası gibi geliyor. Platform yararlı bilgiler olacaktır.

  1. ben çalışma zamanı kitaplık doğrudan kodundan yığın doğrulama kodu çağrıları eklemek için izin vereceğini tahmin yapacağız: kodunuzu ve 's karmaşıklığını görmeden birkaç olasılık vardır. çağrı kodunun kodunu kodunuzun çeşitli yerlerine yerleştirmesini öneririm, böylece , işler 'un yanlış olduğu yerleri bulabilir. yığınının kötü gittiği yeri bulabilir ve 'un önceki çağrıda tamam olduğunu bileceksiniz. eğer gerekiyorsa bu pencereyi daraltmaya devam edin ve sorunun oluştuğu yer olan kodunu gözden geçirin. bozuk aynı adımlar belleğinde bir kesme noktası (veya Watchpoint) ayarlamak için ayıklayıcısını kullanmak gerekir bellekte aynı yeri değişti elde ederse

  2. . 'dan bazıları bu değişiklikler için tasarlanabilir, ancak , hangisinin sorumlu olduğu 'u öğrenebilmelisiniz. kodunuzu özellikle karmaşık ya da bu çoğaltmak için gereken adımlar uzun ise

Sen ikisinin bir kombinasyonunu kullanabilir - o zaman sorunlu ve hafıza konumu bir breakpoint kod parçası daraltmak olduğunu Bozulur

david

1

Intruments ile yakalamaya çalışın.

Klasik bir C hatasına benziyor. Bir c dizisinden (int [xyz] gibi) bir süre ya da bir döngüde yazamayacağınızdan eminsiniz? Herhangi bir hataya neden olmaz, ancak hatanın yaşadığı bölümle ilgisi olmayan birçok alanda garip etkiler yaratırsınız. : p

2

Linux'ta, tam olarak nelerin yanlış gittiğini anlatan bir araç olarak valgrind'u öneririm. Bunun için bazı Windows alternatiflerine bakabilirsiniz here.

+0

Windows'da başarı ile Purify kullandım, ama $$$. –

1

etkin Normal pageheap ile AppVerifier kullanmayı deneyin. Daha sonra işlem için bir hata ayıklayıcısını eklerseniz ve bir miktar şansla bir yığın bozulması varsa, bellek bloğunun bozulduğu noktada (bir blok yazma taşması veya alttan yüklenme) kırılır. Küçük bir çabayla, her bir yığın bloğunu ayıran kodun bir çağrısını da alabilirsiniz, bu da hatayı takip etmenize yardımcı olabilecek bir şeydir.

Bu hataları izlemek zor olabilir, ancak ayrıntılı bilgi için konuya ayrılmış bir bölüm içeren Gelişmiş Windows Hata Ayıklama kitabını kontrol edin.