Gdb kullanımı üzerine

Açık Kaynak, Programlama, tutorial, ytulinux

Gdb, gnu debuggerın kısaltılmış halidir. Linux ve unix türevi çeşitli işletim sistemlerinde karşılaşabileceğiniz bu debugger ile, assembly ve c ile yazılmış programlarınızı debug edebilirsiniz. Debug işlemini yapmanız için öncelikle gcc veya as ye -gstabs parametresini vermeniz gerekiyor, böylece derleyicimiz veya assemblerımız programa ait kodları da derlenmiş hale ekliyor. Assembler ile yazılmış bir program için

as cevir.s -o cevir.o -gstabs
ld cevir.o -o cevir.out

C ile yazılmış bir program için

gcc hede.c -o hedehodo.out -gstabs

şeklinde.

Artık programlarımızı debug edebiliriz.

gdb hedehodo.out yazıp, bu komutu çalıştırmamızla debug konsoluna düşeriz. l komutu ile kodları listeleyebiliriz, l komutunu çalıştırırsak sıradan kodları listelemeye başlar (şu eski commodore lardaki list komutu gibi) l 100 dediğimizde ise 100 den başlayarak belli bir kısmı listeler.

Debuggerda amacımız, hatanın nereden kaynaklandığını araştırmak. Öncelikle bir tahminimiz olmalı. “ülen kesin burada patlıyo bu” şeklinde bir tahminle başlamak bizim açımızdan daha mantıklı olacaktır. Sonraki adımda ise, öne sürdüğümüz bu teze neden olan etkenleri denetlemek için programın nerelerde durması gerektiğini düşünmek. Örneğin sıfıra bölme hatamız var, sıfıra bölmeyi yaptığımız yer belli, hatayı burada arıyoruz. O zaman bölen değişkenimizi nerede atadığımızı ve bu atamaya neden olan diğer değişkenlerin nerelerde atandığını araştırmamız lazım. İşin teorik boyutunu geçtikten sonra, gdb de bunu nasıl yapacağımızı öğrenelim.

break 13
13 üncü satıra durak koymamıza yarar. programı çalıştırdığımız zaman 13 e kadar çalışır, orada tekrar konsola düşer.

break _bos_islerle_ugras
_bos_islerle_ugras fonksiyonumuza durak koymuş oluruz.

gdb, her break komutunun ardından bize bir tanım numarası verir. Örneğin break point 2 at bilmemne adresi der. Bu şekilde, koyduğumuz break pointleri silme şansımız olur. Örneğin break 2 diyerek ikinci koyduğumuz _bos_islerle_ugras fonksiyonumuzu break point listesinden silebiliriz.

r komutuyla, yazmış olduğumuz programı çalıştırıyoruz ve program ilk durakta duruyor. Burada diyelim ki değişkenimizin içeriğine bakacağız:

print i
diyerek i değişkenimizin içeriğine bakabiliriz.

print/x i
diyerek değişkenimizin onaltılık sistemde karşılığını görebiliriz veya

print $eax
komutuyla eax registerının içeriğini görebiliriz (assemby ile uğraşıyorsanız tabi :))

Diyelim ki bir işaretçinin yanlış atanmış olduğundan şüpheleniyoruz.
info variables komutuyla hangi değişkenin hangi aralıklarda adreslendiğini görebilir ve örneğin print isaretci diyerek bu adresle tabloyu karşılaştırabiliriz.

peki bu durakla işimiz bitti, nasıl devam edeceğiz? c komutu ile bir sonraki durağa kadar çalışılmasını veya s komutu ile tek bir satırın çalıştırılmasını sağlayabiliriz.

Bu kadar ayrıntıya girmek istemesek bile, gdb yi sadece programımızın çalışma esnasında hangi satırda segmentation fault verildiğini anlamak için kullanabiliriz, bunun için gdb ile açıp r dememiz yeterli.

Bu yazı toplamda 3104, bugün ise 0 kez görüntülenmiş

11 Comments
  • http://tolqiu.blogspot.com Tolqiu

    Hüseyin iyi hoş güzel yazmışsın da önce bi giriş yapsaydın konuya. Mesela biz yazdığımız bi kodu neden debug edelim şimdi, ne işe yarar? Yani hedef kitleni bilemiyorum ama beginnerleri de unutma hani :p

  • huseyinalb

    hmm evet bidahakine daha açıklamacı olmaya çalışırım 😀

  • http://vebsayt ugur

    benim yazdığım yazı çok daha güzel. hehehe 😀

  • http://vebsayt ugur

    ayırca dan diye lafa girmişsin. biraz benden örnek al hüseyinciğim

  • huseyinalb

    benimki daha gerekli bi yazı olm 😀 tutorial kıvamında dadından yinmez. ne o öyle linuxa system call yazcakmışsın falan madem system call yazıyosun kendi işletim sistemine yaz demi 😀

  • http://vebsayt ugur

    ne gereklisi olm kim gdbyi ne yapsın. visual studio 2008 team suite var babalar gibi bir satır yazı okumadam debug yapıyosun. hatta kod bile yazmadan debug edebiliyosun. ama sor bakalım system’i NULL’ı (char *) 0 ı bilen kaç adam var şu dünyada 😀

  • http://ahmetdursun.blogspot.com/ Ahmet Dursun

    hayırlı olsun blogun hüseyin.. bunu belki ilk yazıya koymalıydım ama renklilik olsun :)

  • huseyinalb

    Teşekkür ederim Ahmet :)

  • http://www.gorkemcetin.com Görkem Çetin

    “Kim gdb’yi ne yapsın?” diyen arkadaşlar mezun olduklarını zaman görürler kimin, nerede, hangi amaçlarla gdb kullandığını.. Sonra gelmeyin bana “keşke gdb öğrenseydim” diye…

  • huseyinalb

    ehuehue desteğiniz için teşekkür ederim :)

  • http://vebsayt ugur

    kitaplığıma şöyle bir bakıyorum, LINUX işletim sistemi diye bir şey var seçkin yayıncılık a.ş’den çıkan. yazarı görkem çetin. aslında sizinle hüseyin’in sitesinde karşılaşmayı istemezdim :) gdb olayı da espiriydi zaten ciddiye almayınız.