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 | fonksiyon un başına kesilme noktası koy. |
b adres if ifade | Belirtilen adres in başına koşullu kesilme noktası
koy: Sadece verilen ifade doğru olursa kesilme
gerçekleşir. |
tbreak adres tb adres if ifade |
Belirtilen adres e 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 |
ifade yi 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 fonksiyon un
adresini görüntüle. |
p {tip}adres p {float}&main |
Verilen adres teki belleğin içeriğini
tip inde 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şken in
içeriğine ifade nin 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 adres teki 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 adres teki 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 ifade yi hesaplayıp
görüntüle. |
info display | display komutu ile oluşturulmuş ifadeleri
listele. |
undisplay numara | display komutu ile oluşturulmuş listeden
numara sı 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 adres e 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) fonksiyon unu
ç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?