2008-12-22 17 views
6

Ben hata ayıklama MS VC++ 6.0'da bazı kod var. Bazı nedenlerden ötürü, dinamik olarak ayrılmış bir belleği silmeye çalıştığım bu noktada, kırılıyor ve "Kullanıcı Aracısı blah blah'ta koddan aradı" diyen bir mesaj kutusu açıyor. Sonra Demontaj penceresi açılır veKullanıcı Breakpoint hiçbir yerde

*memory address* int  3 

garip şey, böyle bir montaj talimatı arıyorum kodunda NOWHERE orada görmek (Ben asm düşünüyorum 3 int x86 bir donanım molası komutu mi?) ..

neyi buna neden olabilir?

DÜZENLEME: CEVAP: Kodumun bir dizinin "sonunda bitmesi" idi, ancak yalnızca Visual Studio hata ayıklaması, NoMan'sLand çiti adı verilen 0xFDFDFDFD ile işaretlendi. Off-by-one hatası .. Bu dizi, hata oluştuğunda belleği serbest bıraktığım nokta ile ilgisizdi. Hangisi daha zor noktaya yapılan .. :(

+0

Sadece merak ediyorum - hata ayıklama yığınının neye benzediğini öğrenmek veya başka bir araç/teknik yardımı yapmak için montaj talimatlarını tek adım yaparak bunu buldunuz mu? –

+0

http://www.highprogrammer.com/alan/windev/visualstudio.html adlı bu siteye baktım: 0xFDFDFDFD, MSVC++ hata ayıklayıcısını, bir dizideki bir sınırı belirtmek için kullanılan bir bellek değeridir. bir hata .. İşaretçilerimi kontrol ettim ve tek tek iterasyonların içinden adım attı .. – krebstar

+0

kaynak kodu ve benim dizilerden birini doğru şekilde sınırlamamış olduğunu fark ettim .. Sanırım bu sadece benim işaretlerimi doğru bir şekilde kontrol etmem gerekiyordu :) – krebstar

cevap

8

Muhtemelen yığın bozulması bulduk ayıklama yığın rutinleri kodu vuruyorlar.

neyi Int 3 isabet ettik zaman gibi çağrı yığını bakmak ?

Düzenleme: yorumlarınızda yığın izleme dayanarak, rutin _CrtIsValidHeapPointer() Bırakılan işaretçi kötü olduğunu söylüyor İşte MSVC en Dbgheap.c kaynağından kod bloğu var.

/* 
    * If this ASSERT fails, a bad pointer has been passed in. It may be 
    * totally bogus, or it may have been allocated from another heap. 
    * The pointer MUST come from the 'local' heap. 
    */ 
    _ASSERTE(_CrtIsValidHeapPointer(pUserData)); 

pUserData ediyorum val ol Silmekte olduğunuz işaretçinin ue.

+0

NTDLL! 7c90120e() NTDLL! 7c95d454() NTDLL! 7c96c5cf() NTDLL! 7c9603b0() KERNEL32! 7c85f8d7() – krebstar

+0

_CrtIsValidHeapPointer (const void * 0x04880068) hattı 1697 _free_dbg_lk (void * 0x04880068, int 1) hattı 1044 + 9 bayt _free_dbg (void * 0x04880068, int 1) 1001 + 13 bayt operatörü (silme hattı void * 0x04880068) satır 351 + 11 bayt – krebstar

+0

Bunun gibi bir şey ... – krebstar

3

(ı asm int 3 x86 bir donanım molası komut olduğunu düşünüyorum? O

olduğunu. O "donanım kesme" deniyor. Eğer VS ayıklayıcısını ile kullanıyorsanız proje kaynak kodu, sadece bir breakpoint (ama kod) gibi. Uygulamanız herhangi bir hata ayıklama olmadan başlatılır vs2005 yana, uygulama sadece yönetilmeyen bir istisna başlattı gibi çökecek,

iştigal Ny, kodda bu kesme noktasını eklemek için kullanılan basit bir makro var. yerini alabilecek Yani iddia ve bazı (sert ve nadir) durumlarda istisnalar:

#define BREAKPOINT __asm { int 3; } 

BREAKPOINT; 

Bkz: http://www.highprogrammer.com/alan/windev/visualstudio.html

+0

Evet, programda açılan bazı dll/lib var ve bunun için kaynak kodum yok. Ancak bunun sebebi olduğunu düşünmüyorum .. Michael Burr'ın daha muhtemel görünüyor .. Neyse teşekkürler :) – krebstar