Standart C Programlama Dili


B.2.2. GDB Komutları

Bu kısımda GDB’nin sadece yaygın olarak kullanılan bazı komutlarından kısaca bahsedeceğiz. Ayrı bir kitap konusu olduğu için, daha detaylı bilgiye gereksinim duyarsanız, ilgili kaynaklara, örneğin (sadece İngilizce olarak sunulan) Çevrim içi GDB dokümantasyonuna bakmanız gerekecektir.

Programı gdb üzerinde çalıştırmaya başlamadan önce, program kaynak kodundaki herhangi bir satıra kesilme noktası koyabilirsiniz. Bu şekilde programı, örneğin run komutu ile çalıştırdığınızda, program ilk kesilme noktasına geldiğinde (o satırın başındaki deyim işletilmeden önce) duracaktır ve gdb sizden komut bekleyecektir. Bu aşamada, programdaki bazı değişkenlerin değerini print komutu ile görüntüleyebilir, set komutu ile değiştirebilir, step veya next komutu ile satır satır yürütmeyi ilerletebilirsiniz. Bazı örnekler:

breakpoint
b
Bulunduğumuz program satırına kesilme noktası koy.
b main Programın başına (yani main fonksiyonunun başına) kesilme noktası koy.
b 12 Kaynak kodunun 12. satırına kesilme noktası koy.
b +5 Bulunduğumuz satırın 5 satır ilerisine kesilme noktası koy.
b fonksiyon fonksiyonun başına kesilme noktası koy.
b adres if ifade Belirtilen adresin başına koşullu kesilme noktası koy: Sadece verilen ifade doğru olursa kesilme gerçekleşir.
tbreak adres
tb adres if ifade
Belirtilen adrese geçici (ve koşullu) kesilme noktası koy: Bu kesilme gerçekleştiği anda ilgili kesilme tanımı unutulur.
disable num
enable num
Numarası verilen (veya verilmediyse, tüm) kesilme noktalarını geçici olarak durdur veya tekrar başlat.
ignore num adet Numarası verilen kesilme noktasından verilen adet kere geçildikten sonra kesilme gerçekleşsin.
info b Tüm kesilme noktalarını listele.
delete 4
d 4
4 nolu kesilme noktasını sil.
d 6-9 6’dan 9’a kadar olan kesilme noktalarını sil.
watch ifade
wa değişken
Verilen ifade değiştiği anda kesilme yaratacak şekilde izleme noktası ekle.
info wat
info b
Daha önceden eklenmiş olan izleme (ve kesilme) noktalarını listele. İlgili izleme (veya kesilme) noktasını silmek için d numara komutunu girebilirsiniz.
backtrace
bt
Yürütmenin bulunduğu satır ve fonksiyon çağrıları yığıt bilgilerini al.
frame
f
Yürütmenin bulunduğu satır bilgisini al.
f numara backtrace komutu tarafından listelenen aktif fonksiyon çerçevelerinden numara olarak belirtileni seç. Bu şekilde, ilgili fonksiyonun yığıttaki ilgili işlek değişkenlerini print komutu ile görüntülemek veya set komutu ile değiştirmek olası hale gelir.
info frame İçinde bulunulan foksiyon ile ilgili bilgileri dök.
run
r
Program başlamamışsa, bir kesilme noktasına gelinceye veya program hata alıncaya kadar programı yürüt.
r arg1 arg2 Programı arg1 arg2 argümanları ile başlat.
continue
c
Program başlamış ancak kesilmişse, başka bir kesilme noktasına gelinceye veya program hata alıncaya kadar programı devam ettir.
finish Yürütmenin içinde bulunduğu fonksiyon bitinceye kadar programı çalıştır.
step
s
Yürütmeyi bir satır ilerlet. Satırda birden fazla deyim varsa, satırdaki tüm deyimleri yürüt.
s 5 Yürütmeyi verilen satır adedi kadar ilerlet.
next
n
Yürütmeyi step komutuna benzer şekilde bir satır ilerlet. Satırda fonksiyon çağrısı varsa, fonksiyon çağrısı dönünceye kadar çağrılan fonksiyonu yürüt.
n 5 Yürütmeyi verilen satır adedi kadar ilerlet. Bu esnada çağrılan herhangi bir fonksiyon olursa, çağrılan fonksiyon içindeki satırlar sayılmaz.
jump adres
j 5
Yürütmeye verilen satırdan devam et. Bulunulandan farklı bir fonksiyona ait bir adres verilirse, garip sonuçlar ortaya çıkabilir.
print ifade
p ifade
ifadeyi hesapla ve değerini görüntüle. Değeri görüntülerken, p/x ifade (onaltılı çıktı) örneğinde olduğu gibi, aşağıdaki tek karakterli biçim seçenekleri kullanılabilir:
p/x: onaltılı,
p/d: işaretli tamsayı,
p/u: işaretsiz tamsayı,
p/o: sekizli,
p/t: ikili,
p/a: adres,
p/c: karakter,
p/f: kayan noktalı sayı.
p &değişken
p &fonksiyon
değişken veya fonksiyonun adresini görüntüle.
p {tip}adres
p {float}&main
Verilen adresteki belleğin içeriğini tipinde görüntüle. İkinci örnekte de görüldüğü gibi, bu her zaman anlamlı olmayabilir.
info args İçinde bulunulan fonksiyonun parametre değişken değerlerini dök.
info locals İçinde bulunulan fonksiyonun yerel değişken değerlerini dök.
set var değişken=ifade Bulunulan noktada erişilebilen değişkenin içeriğine ifadenin değerini koy. Aktif bir fonksiyonun değişkenlerine ulaşmak için, önce backtrace komutu ile ilgili fonksiyonunun yığıttaki işlek değişkenlerinin çerçeve numarası listelenir, sonra da frame numara komutu ile o çerçeveye erişilir.
disassemble adres
disas &main
Verilen adresteki belleğin içeriğini program kodu olarak yorumla ve birleştirici diline çevirip dök.
x adres
x/10i &main
x/2dw &x
Verilen adresteki belleğin içeriğini değişik biçimlerde dök. Genel olarak komut x/nfu şeklindedir. Burada:
n: kaç adet bilgi döküleceğini belirten ondalık bir tamsayı;
f: yukarıda print komutunda da verilen tek karakterlik biçim seçenekleri veya \0 ile sonlanan bir karakter dizisi için s, birleştirici diline çevrilmiş işlemci emirleri için i;
u: kullanılacak bellek bayt sayısı (b: 1, h: 2, w: 4, g: 8).
display ifade Her program durduğunda verilen ifadeyi hesaplayıp görüntüle.
info display display komutu ile oluşturulmuş ifadeleri listele.
undisplay numara display komutu ile oluşturulmuş listeden numarası verileni sil.
disable display numara
enable display numara
display ifadelerini geçici olarak durdur veya tekrar başlat.
list
l
Bulunduğumuz satırı ortaya denk getirecek şekilde kaynak koddan 10 adet satır göster.
l - Önceki 10 satırı göster.
l 20
l 5,28
15 ile 24 veya 5 ile 28 arasındaki satırları göster.
l adres
l main
Verilen adrese karşılık gelen satırı ortaya denk getirecek şekilde kaynak koddan 10 adet satır göster.
call fonksiyon(argümanlar) Belirtilen (kullanıcı veya kütüphane) fonksiyonunu çağır.
quit
q
Oturumu kapatıp gdb’den çık.

Yukarıdaki örneklerde, değişken veya fonksiyon adreslerken, eğer program birden fazla kaynak dosyadan oluşuyorsa dosya_adı:adres şeklinde adresleme yapabilirsiniz.

Kısım 4.7’deki 8 Vezir Programındaki VEZIRLER makrosunu 16 veya daha büyük bir sayıya eşitleyin. Programın bol miktarda çıktı üretmesini engellemek için Satır 36’daki cozumyaz(); çağrısını silip, yerine basitçe çözüm sayısını artıran ++sayi; deyimini ekleyin. Programı -g seçeneği ile derleyip gdb altında çalıştırın. Programın çalışması uzun sürecektir. Normal bitmesini beklemeden Ctrl+C ile programı durdurun ve bt komutu ile yerlestir fonksiyonlarının nasıl birbirini çağırdığını görün. p/t tahta komutu ile tahtanın o anki durumunu (yani programın ne kadar ilerlediğini) görüntüleyin. p sayi komutu ile şimdiye kadar kaç tane çözüm üretildiğine bakın. finish komutu ile en son çalışmakta olan fonksiyon işini bitirip çağıran fonksiyona dönünceye kadar programı çalıştırıp, tekrar bt ile fonksiyon çağrıları yığıt durumunu kontrol edin. Bu program için, arka arkaya girilen finish komutları ne işe yarayacaktır?