Home Index Search Links About Us
[LinuxFocus Image]
[Navegation Bar]
  Duyumlar   Belgelikler   Kurulu�lar  ���tler  

D�zg� (Kod) Yanl��lar�n�n ddd ile Saptan�p Giderilmesi

Yazar: Jose M. Laveda

�eviri: Osman Kazdal


Giri�

Debugger nedir?

DDD nedir?

GUI Ortam�

Dipten ba�lang��

Genel g�revler

Son s�zler

Giri�

Bu yaz�n�n amac�, daha �nce hi� debugger kullanmam�� kullan�c�lara ya da kullanan kullan�c�lara bu g�nl�k �al��ma i�in daha ho� bir grafik ortam g�stermektir. gdb isimli debugger'�n yapabildikleri ve sa�laml��� hakk�nda �ok �ey yaz�labilir, ancak, her zaman oldu�u gibi ��retici ama�lar i�in bunlar� basitle�tirmeye karar verdik :)

Debugger nedir?

" Bir zamanlar, tek i�i kendi kodu i�inde hata bulmak i�in a�a��dakini kullanan bir programc� vard�:

/*Code*/
(...)
loop
change_a_variable;
show_value_of_variable;
end_loop
(...)

�al��ma zaman� i�erisinde, de�i�kenlerin de�erini ara�t�rabilmek i�in kaynak kodu i�ine bir �ok kez bu sat�rlar� eklemeye zorlanm��t�. Bu zor bir g�revdi ve programc�n�n hayat�n� zorla�t�rmaktayd� ve kendi kodunda hatalar� bulman�n zahmeti, o kodu yazman�n zahmetini ikiye katl�yordu.(..)".

Kim kendini daha �nce b�yle bir durumda bulmad� ki? S�k s�k program�m�zda hata olu�ur, her �eyi de�i�tirmi� ve her�eyi denemi�izdir, denenecek az �ey kald���ndan bu a�amada neredeyse derleyicinin hatal� oldu�una hemen hemen kendi kendimizi ikna etmi�izdir... ��te burada hata bulucu yaz�l�mlar devreye girer.

Debugger a�ama a�ama program�n�z�n �al��mas�n� kontrol etmenizi sa�lar, bu �ekilde de�i�kenlerin durumu, tan�mlanmas�, baz� ko�ullarda nas�l davrand�klar� kolayca takip edilebilir. B�t�n bunlar, yine, program �al���rken yap�l�r. Bu havada kalan tan�mlama yeterince a��k de�ilse, bunu yaz�n�n ileriki a�amalar�nda daha a��k hale getirmeyi umuyorum.

�yk�m�zde programc�n�n spy isminde, a�a��dakileri yapmas�n� sa�layan bir debugger'� olsayd� neler olurdu:

jose# spy my_program

ve e�er spy'� yard�ma �a��rd�ktan sonra, programc�m�z �unlar� yapabilseydi:

spy > execute my_program "up to line number 50"
spy > show me the value of the variable <X>
spy > what is the type of variable <X>

Muhtemelen, bu anda, hayali programc�m�z sevin�ten havalara u�maktad�r, ��nk� en sonunda hatan�n sebebini bulmu�tur.

A��k�a, spy ad�ndaki elayg�t� �ok kullan��l� olmu�tu, ��nk� programc�n�n program�n�n �al��t��� s�rada de�i�kenlerin de�erlerini ve tan�mlanmalar�n� kontrol edebilmesini sa�lam��t�r. Bu debugger'�n �z�d�r, ancak tabii ki kabaca resimlendirilmi�tir.

Dikkat !!: Debugger'lar sadece debug parametreleriyle �al��an derleyiciler ile derlenen programlar ile �al���r. GNU gcc derleyicisi �rne�inde bu parametre -g dir.

T�m Linux kullan�c�lar� i�in GNU Genel Lisans� ile elde edilebilecek GDB (The GNU Source-Level Debugger) ad�nda bir debugger vard�r (bu de�i�ik platformlarda da bulunabilir). Bununla C, C++, Modula-2 ve assembler kodlar� debug edilebilir.

Muhtemelen, �u anda kulland���n�z Linux bu yaz�l�ma sahiptir, e�er de�ilse, Linux'�n�z� yenileyin veya program�n kaynak kodunu bulun. Bu bir�ok yerde bulunabilir;)

Diyelim ki, /usr/src dizini alt�na kaynak kodlar�n� kopyalad�n�z, sonra /usr/src/gdb-4.xxxx/gdb dizini alt�na gidin ve doc dizinine inin. Orada make gdb.dvi;make refcard.dvi komutunu kullanarak gdb dok�manlar�n� olu�turabilirsiniz. Bu dosyalar t�m linux s�r�mlerinde kolayca g�r�nt�lenebilir.

DDD nedir?

Gdb'nin ayr�nt�l� sunumu ve t�m komutlar�n� a��klamak yerine, kullan�c� taraf�ndan �ok daha kolayl�kla kullan�labilecek olan ddd (Display Data Debugger) isimli ortam� a��klamak, yeni kullan�c�lar i�in �ok daha anlaml� olacakt�r.

DDD ortam�, genellikle konu�an, ayarlanmas� �ok daha kolay olan ve hata bulma i�in kullan�c�ya daha anla��l�r bir aray�z sunar. Yine de, belirtilmelidir ki, ddd sadece gdb �zerinde kullan�lan bir grafik ortamd�r. Bu nedenle ddd'nin �al��t�r�lmas� i�in gdb'ye gereksinim vard�r. Asl�nda, ddd kullan�c�n�n gdb �zerinde do�rudan de�i�iklik yapmas�na izin vermektedir. DDD ile kullan�labilen dbx, xdb gibi ba�ka debugger'lar da vard�r.

DDD i�in iyi bir bilgi kayna�� http://www.cs.tu-bs.de/softech/ddd/ adresinden elde edilebilir. Ayr�ca, e�er RedHat kullan�yorsan�z kaynak kodlar�n� rpm format�nda bulabilirsiniz. DDD'nin iki ayr� s�r�m�n� bulabilirsiniz, Motif kitapl�klar�yla dinamik olarak derlenmi� s�r�m�, di�eri ise statik olarak derlenmi� s�r�m�d�r. Statik s�r�m kendi Motif kitapl�klar� olmayan kullan�c�lar i�indir.

DDD'nin LESSTIF(http://www.lesstif.org) kar��s�ndaki �u andaki durumunu dikkate alm�yorum. Motif'in �cretsiz bir benzeri olan lesstif'in �u andaki durumu hakk�nda pek bilgi sahibi de�ilim. K�sa bir zaman �nce, bir yama sayesinde sadece lesstif alt�nda derlenebiliyordu. Bunu 1.2.13 �ekirdek ve lesstif 0.75 ile kulland�m (San�r�m ;). L�tfen, lesstif projesinin sayfalar�na bu proje ile ilgili daha fazla bilgi almak i�in bir g�z at�n�z.

��e giri�iyoruz, ddd'yi �al��t�rmam�zla birlikte, �ununla kar��la��yoruz:


Resim 1: DDD ana ekran�

ddd'yi �a��rman�n �� de�i�ik yollar� vard�r; ilkinden daha �nce bahsetmi�tik ve di�erlerini de a�a��da bulacaks�n�z:

ddd <program> core
ddd <program> <process_id>

Core isimli dosya bir program ��kt��� zaman �retilir ve ��k���n sebebi ile ilgili hatan�n olu�tu�u s�radaki program�n durumu ile ilgili yararl� bilgiler i�erir. E�er sizin sisteminiz core dosyalar� yaratm�yorsa, core dosyalar� i�in �evre de�i�kenlerine bir g�z at�n�z ('ulimit -a' hepsini g�sterir, ya da 'ulimit -c <de�er>' di�er gerekli de�erleri veya maksimum boyutlar� g�sterir).

Proses id �al��ma zaman� s�ras�nda program� incelememizi sa�lar.

ddd'nin grafik yap�s� bir i�i yapmak i�in birden fazla yol sunar; Burada hepsini a��klayamam, ancak en basit olanlar�n� a��klayaca��m. DDD'nin ana konsolunun en alt�ndaki pencere, ddd'nin �al��t�rd��� t�m i�lemlerin loglar�n� g�sterir. Bu log penceresi gdb'nin komut sat�r�ndan �al��t�r�lmas�n� ��renmede �ok yararl� olabilir.

GUI ortam�

1. resim ana pencerenin 3 alt pencereye b�l�nd���n� g�steriyor. En alttaki alt pencere yal�n debugger consoludur (bizim durumumuzda bu gdb'dir). Burada, e�er ddd aray�z�m�z olmasayd� burada do�rudan gdb komutlar�n� kullanabilirdik. Ortadaki alt pencere ise program�n kaynak kodunu g�stermektedir, ve �st alt pencere ise program�n de�i�kenleri ve nesneleri i�in grafik bir ortamd�r. Son olarak ise, ara� bar� (toolbar) ddd komutlar�n�n �al��t�r�lmas�n�n kontrol�n� sa�lar.

Ana pencere d���nda ise �al��an proses i�in bir ve debug edilen program�n kaynak kodu i�in de ayr� birer pencere vard�r. Bunlar�n ikisi de iste�e ba�l�d�r.

ddd ile birlikte, hata bulma s�ras�nda gerekebilecek yard�m i�in t�m kaynaklar gelmektedir. �rnek vermek gerekirse, imle� aray�z �zerinde bir de�i�ken �zerine veya aray�z �zerindeki herhangi bir butonun �zerine geldi�inde ayr� bir dialog kutusu ekrana gelir; bu dialog kutusu o andaki durumla ilgili gerekli bilgi verir. Ayr�ca, ana pencerenin alt taraf�nda ise, ddd'nin durumu, hangi komutun �al��t�r�ld��� ve o komutun ��kt�lar�n� g�stermektedir. Sa� tarafta her t�rl� yard�ma bir popup men� sayesinde ula��labilir. A��lan pencerede bir konu se�ip F1 tu�una bast���n�zda daha fazla bilgi elde edilebilinir. Son olarak gdb konsoludan "help" yazarak debugger hakk�nda genel yard�m veya belli bir konu �zerinde yard�m al�nabilir.

Benimsenmi� olarak, ddd tek �er�evede birle�mi� �� alt pencere sunmaktad�r. Ayr�ca, "Preferences" men�s� ddd aray�z�ne benimsenmi� �ekil yerine ayr� pencereler a�t�rabilir.


Resim 2. File men�s� i�in yard�m

Dipten ba�lang��

Debugger konsolu, debugger2�n kullan�m� ��renmemizde ilk ad�mlar�m�z� ataca��m�z yerdir; gdb �zerinde deneyimli kullan�c�lar ddd ile buradan �al��abilirler. Benim durumumda bu konsol grafik aray�z �zerinden komutlar �al��t�r�ld�k�a neler oldu�unu izleyebilmem i�in yard�mc� olmu�tu. Commands-Command History se�imi o ana kadar �al��t�r�lm�� t�m komutlar� listeler.

DDD'nin yapabileceklerini ��renebilmek i�in orijinal dok�manlara bakmak daha yararl� olacakt�r. Her durumda debugger ile bir ka� basit i�lemin nas�l yap�labilece�ini a��klayaca��m.

Genel G�revler

Hata bulmak i�in, kaynak kodu y�kleme i�lemi men�lerden File se�ene�i se�ilerek yap�labilir; kaynak kodunun i�eri�i bu alanda g�r�nt�lenir. Bu a�amadan itibaren, kaynak koduna g�z atarak, bir de�i�kenin de�eri ve tipi incelenebilir ve program kontrol alt�nda �al��t�r�labilir...

Program�n ��kt�s� bir pencere ile izlenebilir ( Options men�s�nden Run in Execution window ) veya debugger konsolundaki program ��kt�s�ndan do�rudan izlenebilir ( bu y�ntem program Motif veya ba�ka bir GUI tabanl� kitapl�klar kullan�ld�ysa i�e yaramaz).

Kaynak kodu i�inde imleci herhangi bir de�i�ken �zerine getirmeyi denerseniz, o de�i�kenin o andaki de�erini ddd ��kt�s� i�erisinde g�rebilirsiniz. Ayr�ca, sa� fare butonuna t�klarsan�z a�a��daki men� ��kacakt�r:


Bu men� fname isimli de�i�kenin de�erini incelememizi sa�lar, alttaki pencerede, �izim b�lgesinde bu de�i�kenin bir i�aretleyici veya ger�ek bir de�i�ken olup olmad��� g�sterilir (i�aretleyici ba�ka bir de�i�kenin bellekteki adresini saklayan ba�ka bir de�i�kendir). What is b�l�m� ise se�ilmi� de�i�kenin yap�s�n� veya tipini g�sterir. Lookup rastlanan benzerlikleri takip etmemizi sa�lar. Son olarak, Break at ve Clear at b�l�mlerinde k�saca anlataca��m breakpoint diye deyimlendirilen kullan�mlard�r.

Kaynak kodun alt�ndaki d��melerin bulundu�u barda da de�i�ik se�enekler mevcuttur, sadece gerekli parametreleri soldaki bo� kutuya yaz�p gerekli eylemi se�mek yeterlidir.

Bir break-point, program� istedi�iniz sat�r�na kadar �a�l��t�rman�z� sa�lar; belli bir noktada program�n �al��mas� durur ve kullan�c� de�i�kenlerin bu noktadaki de�erlerini izleyebilir. Ayr�ca, bu noktadan sonra kullan�c� program�n �al��t�r�lmas�n� elle ad�m ad�m yapt�rabilir, ve a�ama a�ama program� izleyebilir. Breakpointlerin olmamas� durumunda, program problemsiz �al���r veya bir hata sonucu �al��amadan sona erer, bu durumda program� incelemek i�in bir i�lem yapmak i�in �ok ge�tir. Program �al��t�r�ld��� s�rada hata bulma i�leminden ge�irilmelidir.

Program�n�za bir breakpoint eklemek i�in a�a��dakileri yap�n�z:

  • Breakpoint koymak istedi�iniz b�l�m�n sol taraf�na imleci getirip sa� fare butonuna t�klad�ktan sonra Set Temporary Breakpoint se�ene�ini se�meniz yeterli olacakt�r. �kisi aras�ndaki fark ge�ici olan breakpointlerin ilk �al��t�rmadan sonra kaybolmas�d�r. Di�eri ise sadece do�ru komut verilirse kald�r�labilir (Bu komutu tahmin edebilir misiniz? :) ).
  • Break at isimli butonu kaynak kodu penceresinden se�erek
  • Debugger konsolundan break yazarak
  • Men� se�eneklerinden Source->Edit Breakpoints b�l�m�n� se�erek, bu ayr�ca bu program�n kullan�m� i�in ayr� bir pencerede a�acakt�r.

Resimde 70 ve 71. sat�rlarda, kaynak kodu i�inde iki breakpoint g�r�nmektedir. Breakpoint i�in kullan�lan sembol kendi kendini �ok iyi a��klamaktad�r.

A�a��daki men� breakpointleri kullanmaya yarar:

Condition se�ene�i ile, ko�ullu breakpointler yerle�tirilebilir. Bu durumda, program�n breakpoint sat�r�nda durmas� i�in ko�ulun ger�ekle�mesi gerekir. Ba�ka bir ko�ul �e�idi ise Ignore Count se�ene�idir. Bu durumda, ko�ulun do�ru olmas� i�in breakpoint sat�r�na <n> defa ula��lmas� gerekir. �rne�in, herhangi bir d�ng�n�n 15. iterasyonundan sonra program� durdurmak i�in kullan�labilir.
Program herhangi bir breakpointte durdu�unda, gerekli men�lerin se�eneklerini kullanarak programdaki de�i�kenlerin de�erlerini inceleyebiliriz. B�t�n bu fonksiyonlar ana men�de bulunmaktad�r (�rnek; menu Data).
Kodun �al��t�r�lmas�n� kontrol etmek amac�yla, bu i� i�in kullan�lan d��melerin bulundu�u pencereyi kullanaca��z. Bu pencere ana pencerenin sa� �st k��esinde bulunmaktad�r.


Men� bar ile d��melerin bulundu�u pencere aras�ndaki benzerlik g�r�lebilir.

Program� �al��t�r�p durdurabiliriz, men� bar�n�n kullan�lmas� durumunda, dialog penceresini kullanarak programa baz� parametreler vermek olas�d�r. Step komutu, program� sat�r sat�r �al��t�r�r, bu durumda, program�n herhangi bir yerinde bir fonksiyon �a��r�l�rsa, hata bulucu o fonksiyonun ba��na gidecek ve bir sonraki Step komutunu bekleyecektir. �te yandan, Next komutu ise, fonksiyonlar� tek sat�r olarak kabul eder ve bu i�lemleri tek a�amada yapar.

Continue komutu, herhangi bir breakpointte durulduktan sonra program�n �al��t�r�lmas�na devam edilmesini sa�lar. Kill, Interrupt, Abort komutlar� ise program�n �al��t�r�lmas�n� durdurmak i�in kullan�l�r.

Muhtemelen, bu grafik ortam�n en �nemli �zelli�i, pencerenin �st taraf�nda bulunan bilgi g�steren penceredir. Grafiklerle, bilginin yap�s�n�, i�eri�ini ve di�er bilgiler ile aras�ndaki ba�lant�lar� buradan izleyebiliriz. Bir sonraki �rnekte, bir dizi (arg�manlar) ve o dizinin d�rt eleman� g�r�lmektedir.

Bu pencere, �ok geni� bilgi sunar, Data->More Status Displays b�l�m�nden yap�labilecek ayarlarla, data penceresinde g�rmek istedi�iniz her�eyi ayarlayabilirsiniz. Bir �nceki �rnekte, i�lemcinin kay�t de�erlerini, gerekli dinamik kitapl�klar� ve program�n �al��ma durumunu g�rebilirdik:


Son S�zler

DDD ortam�, ayn� program kullan�larak, Options->Preferences men�s�nden ayarlanabilir. Ayr�ca, bu ayarlar Motif programlar�n�n klasik y�ntemi olan $HOME/.dddinit dosyas�ndan da yap�labilir. Ayarlanabilecek t�m kaynaklar�n a��klanmas� bu yaz�n�n d���ndad�r.

DDD ile gelen kitap����n (ddd.ps)ve hata bulucunun kitap����n�n (Debugging with GDB) okunmas� �ok �nemlidir. Yine de, kullan�c� bunlar� k�sa bir zaman i�inde kendi kendine de ��renebilir. Yap�lams� gereken sadece iyice tan�d���n�z bir kodu burada hata bulma i�lemine tabii tutman�zd�r. Bu �ekilde hata bulucunun yapabilecekleri ortaya ��kacakt�r.

Ve son olarak, yaz�da hatalar yapt�ysam �z�rlerimi sunar�m :)

Daha �ok Bilgi ��in::
© 1998 Miguel Angel Sepulveda
Bu sanal y�renin bak�m� Miguel A Sepulveda taraf�ndan yap�lmaktad�r..