2012-06-12 17 views
24

Gdb'de bir programda hata ayıklama yapıyorum ve programın 0x08049000 - 0x0804a000 bellek bölgesine erişildiğinde programın durmasını istiyorum. Bellek kesme noktalarını elle ayarlamaya çalıştığımda, gdb aynı anda iki konumdan daha fazlasını desteklemiyor gibi görünüyor.gdb'de bir bellek aralığı mı izleyin?

(gdb) awatch *0x08049000 
Hardware access (read/write) watchpoint 1: *0x08049000 
(gdb) awatch *0x08049001 
Hardware access (read/write) watchpoint 2: *0x08049001 
(gdb) awatch *0x08049002 
Hardware access (read/write) watchpoint 3: *0x08049002 
(gdb) run 
Starting program: /home/iblue/git/some-code/some-executable 
Warning: 
Could not insert hardware watchpoint 3. 
Could not insert hardware breakpoints: 
You may have requested too many hardware breakpoints/watchpoints. 

bu sorular ve cevap o valgrind ile bunu yapmak mümkün olabilir, oldu edilmiş bir soru zaten var. Ne yazık ki cevap, valgrind kılavuzuna herhangi bir örnek veya referans içermemektedir, bu yüzden çok aydınlatıcı değildi: How can gdb be used to watch for any changes in an entire region of memory?

Yani: Tüm bellek bölgesini nasıl izleyebilirim?

+0

ilginci için the Valgrind user manual on gdb integration bakın http://stackoverflow.com/questions/ 13410941/set-breakpoint-on-her-line-in-gdb/31658056 # 31658056 –

+0

x86 8 bayta kadar küçük iz aralığı destekler: https://en.wikipedia.org/wiki/X86_debug_register –

cevap

23

GDgr 7.4'ü Valgrind 3.7.0 ile birlikte kullanıyorsanız, sınırsız "öykünmüş" donanım izleme noktalarına sahipsiniz.

o zaman ( target remote | vgdb) bağlanmak için GDB kullanmak argümanlar --vgdb=full --vgdb-error=0 vererek Valgrind altında programınızı başlatın

. Ardından, ör. PowerPC değişmiştir kırılma noktaları (? Ama Dikkat Edilmesi Gereken Hususlar): watch veya awatch veya rwatch rwatch (char[100]) *0x5180040

yaparak bir bellek aralığı fazla ayrıntı

+2

Daha iyi bir parçası geçirdikten sonra Günün, 'mprotect' ile uğraşmak ve SIGSEV işleyicilerini bellek erişimini kırmak için suistimal etmek, bunu denedim. Mükemmel çalışıyor. Günümü kurtardın. Teşekkür ederim! – iblue

+0

Evet, +1 de. Aylardır böyle bir özellik için avlanıyordum. – Crashworks

+0

Peki, valgrind tarafından başlatılan işlem için yığın adresi nasıl belirlenir? Bunu genellikle */proc/[pid]/maps * aracılığıyla yapıyorum ancak python'u bu valgrind komutuyla başlattığımda, haritalar dosyasının, bulmaya alışkın olduğum gibi ** [heap] ** ile tanımlanan bir girişi yok. . –

10

değişti bir bellek adresi a hardware breakpoint denilen ve aslında CPU — belirli bir adres erişildiğinde algılar bellek denetleyicisi içinde bir kayıt bir özelliğidir, ve bir hata ayıklayıcı mola kesme tetikler zaman algılar özellik. Ne yazık ki, the x86 architectureonly has four such registers ve bu yüzden ayarladığınız bellek izlemesi kesme noktalarının sayısı sınırlıdır.

Bu yüzden valgrind gibi bir şey kullanmanız gerekir; Tüm bölgeyi izlemek istiyorsanız, bellek erişim düzenlerini simüle eden bir yazılım kullanarak bunu yapmak zorundasınız. Valgrind'in aslında tüm bellek aralıklarını izlemeyi destekleyip desteklemediğini bilmiyorum. Kendini ona bağlaman gerekebilir. Bir kesme noktası atmak için VALGRIND_MAKE_MEM_NOACCESS() yöntemini değiştirin ancak programın devam etmesine izin verin.