Eski blogun yedeğine bakarken denk geldiğim bu eski çeviriyi, işinize yarayacağını umarak, burada da paylaşmak istedim. Çeviri biraz sorunlu ve de eskik yerler var!

Sıkça Sorulan Sorular

Debugging nedir?

Debugging (hata ayıklama), programlardaki hataları ayıklama işlemine verilen addır. Diğer bir deyişle; hatayı bulana kadar kodu baştan sona incelemektir.

Debugger nedir?

Debugger (hata ayıklayıcı), başka programları çalıştıran bir programdır. Debugger, programcının; çalıştırdığı program üzerinde oynamasına izin verir. Programı istediğiniz yerde durdurabilir, hafızadaki değişkenleri takip edip – değiştirebilir ve fonksiyonları çağırabilirsiniz.

Neden debugger kullanayım ki? printf yeterli değil mi?

Bir debugger kullanmak, -genelde- programınızdaki hataları bulmanın en etkili yoludur. Programınızın debugging için detaylı çıktı vermesi yanlış değildir (hatta bazen tek/en kolay yoldur). Ancak Segmentation Fault ve sonsuz döngü gibi hatalarda debugger hayat kurtarır.


gdb’ı Nasıl Kullanırım?

Debugging için nasıl derlerim?

Debugging için programınızın özel olarak derlenmesi gerekmektedir. Bu özel derleme sırasında programa; Debugging Symbols denilen, debugger’ın anlayabileceği türden özel bilgiler eklenir. Bu bilgiler olmadan debugger düzgün çalışamaz.

Programı derlerken gcc’a -g argümanını ekleyin: gcc -g program.c -o programname

Not: Eğer birden çok dosyadan oluşan bir programınız varsa, her bir dosya -g argümanı ile derlenmeli ve bağlarken de yine -g argümanı kullanılmalıdır.

Debugger’ı nasıl çalıştırırım?

gdb programadıyazarak gdb’ı çalıştırabilirsiniz. Programınızı çalıştırmaya başlamak için de run arg1 "arg2" ... komutunu verin.

Çalışan bir programı nasıl baştan başlatabilirim?

kill komutu ile programı sonlandırabilir; ve run komutu ile tekrar başlatabiliriniz.

gdb’dan nasıl çıkabilirim?

quit komutu ile çıkabilirsiniz.

gdb komutları için nereden yardım alabilirim?

help komutu ile yardım alabilirsiniz: help gdb_command


Programımın Çalışmasını Nasıl Takip Ederim?

gdb’ı programlarınız için bir interpreter(yorumlayıcı) gibi düşünebilirsiniz. Programınıza sinyal göndererek istediğiniz zaman durdurabilirsiniz. Normalde bu Ctrl+C kombinasyonuyla –SIGINT sinayli göndererek- yapılır. Bu programınızı sonlandıracaktır; ancak gdb bu sinyali yakalayarak programı durdurur. Aynı zamanda breakpoint(duraklama noktası)‘leri kullanarak programınızı belirli bir satırda veya fonksiyon çağırısında durdurabilirsiniz. Programınız durduğunda, kaynak kodun ‘neresinde’ olduğunu inceleyebilirsiniz. Scope‘daki değişkenlere bakabileceğiniz gibi hafızadaki ve register‘daki değişkenleri de görebilirsiniz. Aynı zamanda değişkenleri ve hafızayı değiştirerek programınıza olan etkilerini inceleyebilirsiniz.

Yürütmeyi nasıl durdururum?

Ctrl+C kombinasyonu ile programınıza SIGINT sinyali göndererek:

(gdb) run
Starting Program: /home/ug/ryansc/a.out`

Program received signal SIGINT, Interrupt.
0x80483b4 in main(argc=1, argv=0xbffffda4) at loop.c:5
5 while(1){
...
(gdb)

Yürütmeye nasıl devam ederim?

continue komutu ile yürütmeye devam edebilirsiniz.

Yürütmeye satır-satır devam edebilir miyim?

Evet. Öncelikle programın durdurun. Ardından nextveya step komutlarıyla programınızın içerisinde satır-satır ilerleyebilirsiniz.

5   while(1){
(gdb) next
7   }
(gdb)

Not: next ve step komutları farklıdır. Fonksiyon çağrısının olduğu bir satırda next fonksiyonun ‘üzerinden’ geçecekken; step fonksiyonun içine girer.

next:

(gdb)
11     fun1();
(gdb) next
12 }

step:

(gdb)
11     fun1();
(gdb) step;
fun1 () at loop.c:5
5    return 0;
(gdb)
</p>

Değişkenleri nasıl incelerim?

print degisken_adi komutu ile.

Not: print komutu her zaman $### = (değer) formatında bir çıktı verir. $### kısmı şu ana kadar inclediğiniz değişkenlerin sayısını tutan bir sayaçtır.

Değişkenleri nasıl değiştiririm?

set x = y komutu ile değişkenlerin değerlerini değiştirebilirsiniz.

Not: gdb’ın yeni sürümelerinde set var x = y şeklinde kullanmanız gerekebilir.

Nasıl fonksiyon çağırabilirim?

call fonksiyon(arg1, arg2) komutu ile programınıza bağlanan(linking) herhangi bir fonksiyonu çağırabilirsiniz.

Bir fonksiyondan nasıl çıkabilirim?

finish komutu ile programınızı, içinde bulunduğunuz fonksiyon sonlanana kadar çalıştırabilirsiniz. Fonksiyonun çalışması bittikten sonra program durur ve fonksiyondan döndürülen değeri(return value) yazdırır.

(gdb) finish
Run till exit from #0  fun1 () at test.c:5
main (argc=1, argv=0xbffffaf4) at test.c:17
17        return 0;
Value returned is $1 = 1

“Breakpoint”leri Nasıl Kullanırım?

Brekpoint‘ler debugger‘a programı belirtilen satırdı durdurmasını söyler. Aynı zamanda belirli fonksiyon çağrılarında durdurulması için de kullanılabilir.

Bir satıra nasıl breakpoint koyabilirim?

Eğer programınız tek bir kaynak dosyadan oluşuyorsa break satir_no komutu ile koyabilirsiniz.

Eğer programınız birden çok kaynak dosyadan oluşuyorsa break dosya:satir_no komutunu kullanmanız gerekir.

(gdb) break 19
Breakpoint 1 at 0x80483f8: file main.c, line 19
(gdb) break test.c:19
Breakpoint 2 at 0x80483ff: file test.c, line 19

Bir fonksiyona nasıl breakpoint koyabilirim?

break fonksiyon_adi komutu ile.

Nasıl geçici breakpoint koyabilirim?

break komutu yerine tbreak komutunu kullanarak geçici breakpoint‘ler koyabilirsiniz. Geçici bir breakpoint, programı bir kez durdurduktan sonra kaldırılacaktır.

Breakpoint’lerin listesini nasıl görebilirim?

info breakpoints komutu ile:

Num Type           Disp Enb Address    What
2   breakpoint     keep y   0x080483c3 in func2 at test.c:5
3   breakpoint     keep y   0x080483da in func1 at test.c:10

Breakpoint’leri nasıl kaldırırım?

disable komutu ile kaldırabilirsiniz. Örnek kullanımı aşağıda gösterilmiştir.

(gdb) info breakpoints
Num Type           Disp Enb Address    What
2   breakpoint     keep y   0x080483c3 in func2 at test.c:5
3   breakpoint     keep y   0x080483da in func1 at test.c:10
(gdb) disable 2
(gdb) info breakpoints
Num Type           Disp Enb Address    What
2   breakpoint     keep n   0x080483c3 in func2 at test.c:5
3   breakpoint     keep y   0x080483da in func1 at test.c:10

Enb sütununa dikkat edin.

Breakpoint’i nasıl (pas) geçerim?

Bir breakpoint‘i belirtilen kez pas geçmek için ignore breakpoint_no kac_kez komutu kullanılır:

(gdb) ignore 2 5
Will ignore next 5 crossings of breakpoint 2.

“Watchpoint”leri Nasıl Kullanırım?

Watchpoint‘ler, breakpoint‘lere benzerdirler; ancak breakpoint‘lerden farklı olarak satırlarla veya fonksiyonlarla değil, değişkenlerle ilgilenirler. Bu değişkenler okunduğunda veya değişkenlere yazıldığında programı durdururlar.

Bu bölümde aşağıdaki örnek program kullanılacaktır:

#include <stdio.h>

int main(int argc, char **argv)
{
  int x = 30;
  int y = 10;

  x = y;

  return 0;
}

Nasıl bir “write Watchpoint” ayarlarım?

Eğer bir değişkenin değeri değiştiğinde -yani ona yazıldığında- programınızın durmasını istiyorsanız watch komutunu kullanmanız gerekir:

(gdb) watch x
Hardware watchpoint 4: x
(gdb) next
Hardware watchpoint 4: x

Old value = 30
New value = 10
main () at deneme.c:11
11        return 0;
(gdb)

Nasıl bir “read Watchpoint” ayarlarım?

rwatch komutu ile. Kullanımı watch komutu ile aynıdır.

Nasıl bir “read/write Watchpoint” ayarlarım?

awatch komutu ile. Kullanımı watch komutu ile aynıdır.

Watchpoint’leri nasıl kaldırırım?

Breakpoint‘lerdeki gibi kaldırabilirsiniz. info breakpoints komutu aynı zamanda Watchpoint‘leri de gösterir.


Dipnot

Yazıda pek çok İngilizce terimin geçtiğinin farkındayım ancak anlaşılmaz bir çeviri de olmasını istemedim. Eğer İngilizce terimlerin, Türkçe karşılıklarını bildirirseniz yazıyı düzenleyebilirim.

Kaynaktaki 3. bölüm‘e tam olarak hakim olmadığım için çevirmek istemedim. Bu bölümü de çevirip, -mümkünse markdown formatında- yollarsanız yazıya ekleyebilirim.

Okuduğunuz için teşekkürler. :)


Kaynak

http://www.unknownroad.com/rtfm/gdbtut/gdbtoc.html