Delphi’de Hata Bulma ve Çözme (Debug)

Bir uygulama yazılırken iki türlü hata çıkabilmektedir. Bunlardan tasarım anında çıkan hatalar programın derlenememesi ve çalışmaması sonucunu ürettiği için çözülmek zorundadırlar.

Button1.Caption := 'Buton1';
Button2.Daption := 'Buton2'; 
// Daption hatalı Caption olmalı
// Uygulama hata verir derlenmez

Çalışma anı hatalarında ise program hatasızmış gibi derlenir ve çalıştırılır. Çalışma anı hatasına sahip program ansızın çalışmayı durdurup çökebileceği gibi sadece hatalı sonuçta üretip çalışmaya devam edebilir.

Button1.Caption := 'Buton1';
Button1.Caption := 'Buton2'; 
// Alttaki Button1 Button2 olmalı
// Hatalı sonuç üretiyor
// Uygulama hata vermez derlenir


Her programda çalışma anı hataları olabilir. Bu hataların olması normaldir. Bu sebeple büyük yazılım şirketlerinde program yazanların yanında programdaki hatalar bulmak için uğraşan test ediciler de vardır. Programcıların görevi programın işini mükemmel yapmasını sağlamak iken, test edicilerin görevi ise programdaki hataları bulmaktır.

Gelişmiş büyük programların halka sunulmadan önce birçok sürümü vardır. Bunlar Pre-alpha, Alpha, Beta, RC (Release Candidate – Sunum Adayı) ve Release (Sunum) olarak isimlendirilir. Bu sürümlerden Pre-alpha ve Alpha en çok hataya sahipken (her an çökebilecek kadar hatalı olabilir), RC ve Release sürümleri son kullanıcıya dağıtıma uygun hatasız (en az hatalı) sürümlerdir. Programlar geliştirilirken sürekli hatalar çözülür, bir yandan yeni hatalar ortaya çıkar.

Çalışma anı hatalarını çözmek için bazen program çalışırken hata çözme işlemi yapmak gerekir. Bunun için programlama dillerinde birçok hata bulma ve çözme (debug) yöntemi vardır.

Delphi’de Hata Bulma ve Çözme (Debug)

Delphi’de debug yapmak için Project menüsündeki Options seçeneği seçildiğinde gelen Project Options diyalogunda Compiler tabının Debugging kısmında birçok debug seçeneği seçili olmalıdır. Normalde bu seçenekler varsayılan olarak seçilidir. Fakat yapılan uygulama sunulacağı zaman bu seçenekler kaldırılır. Bu durumda debug yapmak için gereken bilgiler uygulamanın içine konulmayacağı için uygulamanın boyu daha küçük olur.

Yeni Rad Studio sürümlerinde bu ayarları değiştirme gerekli değildir. Project Manager penceresinde Build Configurations kısmında Debug seçildiğinde bu ayarlar otomatik seçilir. Release seçildiğinde ise bu seçenekler otomatik kaldırılır.

Aşağıda yapılan açıklamalar şu kod üzerinde denenmiş ve resimler kod ile ilgilidir:

var
  Form1 : TForm1;
  sayidizisi : Array[1..5]of Integer;
  sayi : Integer;
  karakter : Char;
  ikili : Boolean;
  yazi : string;

implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 sayidizisi[1] := 100;
 sayi := 200;
 karakter := 'A';
 ikili := True;
 sayidizisi[2] := 300;
 yazi := 'Delphi';
 Button1.Caption:='Buton1';
end;

Debug Windows

Delphi’nin View menüsünde bulunan Debug Windows > seçeneğinin alt menüsünde birçok debug aracı vardır :

a) Breakpoints :

Delphi’nin Run menüsünde bulunan Add Breakpoint seçeneğinin alt menüsünde bulunan Source Breakpoint… komutu ile uygulamaya duraklama noktaları eklemek mümkündür. Run komutu ile uygulama çalıştırıldığında bu noktalara geldiğinde uygulama duraklatılacaktır. Duraklama noktası eklenirken istenirse Condition kısmına koşul eklenebilir. Koşul eklenirse sadece koşul oluştuğunda duraklama olur. Eğer Pass count sıfırdan büyük bir değer belirlenmişse satır o değer kadar tekrarlandıktan sonra koşul yerine getirilecektir. Örneğin Pass count 3 yapılırsa 3. geçişte koşul uygulanır.

Bu alt menüdeki Breakpoints komutu ile bu eklenmiş duraklama noktalarını görmek ve değiştirmek mümkündür.

Breakpoint List diyaloguna sağ tıklanırsa gelen menüde Enabled komutu ile duraklama noktası aktif veya pasif edilebilir. Delete komutuyla duraklama noktası silinebilir. Properties komutuyla duraklama noktasında değişiklik yapılabilir.

Advanced butonuna tıklandığında alt kısımda gelişmiş seçenekler çıkacaktır. Burada Break kutusu işaretlenerek programın o noktada durması sağlanır. Bu kutu varsayılan olarak işaretlidir. Eğer kutudan işaret kaldırılırsa program o satırda durmaz.

Log Message kısmına yazılacak mesaj o satır çalıştırıldığında Event Log penceresinde görülecektir. Break ve Log Message beraber veya ayrı ayrı kullanılabilir. Bunlar Breakpoint List’tin Action kısmında şekildeki gibi görülürler:

Kod çalışırken Run->Add Breakpoint menüsünden Data Breakpoint veya Memory Breakpoint eklenerek değişken veya hafıza adresinden değişken veya hafıza adresi takibi yapılabilir.

b) Call Stack :

Bu alt menüdeki Call Stack komutu ile bu eklenmiş duraklama noktalarına kadar çağrılmış alt programları ve fonksiyonları görmek mümkündür.

Aşağıda uygulama çalışmadan ve çalıştırılıp duraklama yapıldıktan sonra Call Stack pencereleri görünmektedir:

Debug Call Stack

c) Watches :

Bu alt menüdeki Watches seçeneği ile açılan Watch List, herhangi bir sebeple duraklatılmış uygulamadaki (listesine önceden eklenmiş) değişkenlerin değerlerini incelemek için kullanılır.

Uygulama Step Over veya Trace Into komutları ile adım adım çalıştırılırken veya Run komutu ile doğrudan çalıştırırken önceden tanımlanmış Breakpoint noktasında duraklatıldığında önceden Watch List‘e eklenmiş değişkenlerin değerleri listesinde görünür.

Delphi’nin Run menüsünde bulunan Add Watch komutu ile Watch List listesine uygulamanın çalışması sırasında takip edilmek istenen değişken veya değişkenler eklenebilir. Değişken eklenirken değişkenin ismi yazılır ve alttan tipi seçilir. (Diziler (Array) için Record/Structure tipi seçilir)

Watch List‘e birden fazla değişken eklemek için sağ tıklanarak gelen menüden Add Watch seçeneği kullanılır. Edit Watch seçeneği ile eklenmiş değişken değiştirilebilir. Disable Watch ile değişken pasif hale gelir. Delete Watch ile değişken listeden silinir. Copy Watch Value ile değişkenin değeri kopyalanır. Copy Watch Name ile değişkenin ismi kopyalanır. Break When Changed aktif edilirse değişkenin değeri değiştiğinde kod duraklatılır.

Debug Watch List Menü

Aşağıda örnek bir uygulamada birden fazla değişken eklenmiş Watch List görünmektedir:

Örnek uygulamaya Break Point eklendikten sonra çalıştırıldığında eklenen noktada uygulama durakladığında Watch List‘te değişken değerleri aşağıdaki gibi görünecektir:

d) Thread Status :

Bu alt menüdeki Threads komutu ile bu eklenmiş duraklama noktalarına kadar oluşturulmuş (Thread) Kanalları ve Kanalların o anki durumlarını Thread Status penceresinde görmek mümkündür. Her uygulamada en az bir Kanal vardır. Bu komut birden fazla kanal oluşturan ve kullanan uygulamalarda daha kullanışlıdır.

Aşağıda uygulama çalıştırılıp duraklama yapıldıktan sonra Thread Status penceresinde var olan Ana kanal (Main Thread) görünmektedir:

Debug Thread Status

Uygulamada Ana Kanaldan başka kanallar varsa onlar da Thread Status penceresinde görünecektir.

Debug Thread Status with 2 threads

e) Modules :

Bu alt menüdeki Modules komutu ile modüller ile ilgili bilgileri Modules penceresinde görmek mümkündür.

Aşağıda uygulama çalıştırılıp duraklama yapıldıktan sonra Modules penceresi görünmektedir:

f) Event Log :

Bu alt menüdeki Event Log komutu ile bu eklenmiş duraklama noktalarına kadar hangi modülleri nasıl çağrıldıkları ile ilgili bilgileri Event Log penceresinde görmek mümkündür.

Aşağıda uygulama çalıştırılıp duraklama yapıldıktan sonra Event Log penceresi görülmektedir:

Debug Event Log

OutputDebugString Api’sini kullanarak uygulama içerisinden Event Log penceresinde görülecek bilgi(ler) göndermek mümkündür. Aşağıdaki kodda kullanım örneği görülmektedir:

OutputDebugString(PChar('Mesajım : Program problemsiz çalışıyor'));

Aşağıda uygulama çalıştırılıp uygulama bu satırı çalıştırdıktan sonraki Event Log penceresi görülmektedir:

Delphi ortamında uygulama denenirken Event Log penceresinde OutputDebugString mesajları görülür. Uygulama derlenip kendi başına çalışırken OutputDebugString mesajlarını görmek için Microsoft’un DebugView programı kullanılabilir.

g) CPU :

Bu alt menüdeki CPU komutu ile gelen pencerede duraklama noktasında mikroişlemcinin ne durumda olduğunu görmek mümkündür. Bu pencerede o anki çalışan kodun makine kodu, kaynak kodu, hafıza dökümü, stack hafıza dökümü, mikroişlemcinin registerleri (yazmaçları) ve mikroişlemcinin flaglar (durum bayrakları) gibi bilgilere ulaşmak mümkündür. İleri (asm) assembly debug ve kodu asm’ye çevirme gibi konularda faydalıdır.

Aşağıda uygulama çalıştırılıp Run menüsündeki Pause komutu ile duraklama yapıldıktan sonra CPU penceresi görünmektedir:

CPU Debug

h) FPU :

Bu alt menüdeki FPU komutu ile gelen pencerede duraklama noktasında mikroişlemcinin içindeki matematik işlemcinin (Floating Point Unit. FPU) ne durumda olduğunu görmek mümkündür. İleri programlama içindir.

Aşağıda uygulama çalıştırılıp Run menüsündeki Pause komutu ile duraklama yapıldıktan sonra FPU penceresi görünmektedir:

FPU Debug

Run Menüsü

Delphi’nin Run menüsünün sonunda da birçok debug aracı vardır :

Run menüsü

a) Inspect :

Delphi’nin Run menüsünde bulunan Inspect seçeneği ile çalıştırılan program Breakpoint ile duraklatıdığında, Step Over veya Trace Into komutları ile adım adım çalıştırıldığında Inspect penceresine girilen değişken veya bileşen ile ilgili bilgileri Debug Inspector penceresinde gösterir. Bu seçenek sadece duraklama sırasında aktiftir.

b) Evaluate/Modify :

Delphi’nin Run menüsünde bulunan Evaluate/Modify seçeneği ile gelen diyalogla çalıştırılan program Breakpoint ile duraklatıdığında veya Step Over veya Trace Into komutları ile adım adım çalıştırıldığında programdaki bir değişkenin değerini görmek veya değiştirmek için kullanılır.

Diyalogdaki Evaluate butonu ile ismi yazılan değişkenin değeri bulunur ve orta kısımda gösterilir. Modify butonu ile değişkenin değeri en alt kısma yazılan değer ile değiştirilir. Watch butonu ile değişken Watch List‘e eklenir. Inspect ile Debug Inspector‘da değişken ile ilgili bilgiler görüntülenir.

c) Add Watch… :

Delphi’nin Run menüsünde bulunan Add Watch komutu ile Watch List listesine uygulamanın çalışması sırasında takip edilmek istenen değişken veya değişkenler eklenebilir. Yukarıdaki Watches konusunda detaylı anlatılmıştır.

d) Add Breakpoint :

Delphi’nin Run menüsünde bulunan Add Breakpoint seçeneğinin alt menüsünde bulunan Source Breakpoint… komutu ile uygulamaya duraklama noktaları eklemek mümkündür. Yukarıdaki Breakpoints konusunda detaylı anlatılmıştır.

Derleme Konfigurasyona özel program yazılması

Delphi’de iki derleme konfigurasyonu bulunmaktadır. Bunlardan DEBUG konfigurasyonu uygulama derlenirken uygulamayla ilgili bazı bilgilerin programcının kullanması için koda eklenmesini sağlar. RELEASE konfigurasyonu ise programın dağıtılması için sadece kodun bulunduğu konfigurasyondur. Programcı duruma göre istediği konfigurasyonu etkin hale getirebilir.

Build Configuration

Programcılar konfigurasyonlara özgü kodlar yazabilir. Delphi 2007 sürümü ve sonrası sürümlerde DEBUG konfigurasyonu seçildiğinde DEBUG, RELEASE konfigurasyonu seçildiğinde RELEASE kelimesi tanımlanır. Bu tanımlar değerlendirilerek konfigurasyonlara özel kodlar yazılabilir.

procedure TForm1.Button1Click(Sender: TObject);
begin
 // Debug seçildiğinde DEBUG kelimesi tanımlanır
 {$IFDEF DEBUG} 
    label1.Caption:='Debug konfigurasyonu seçili';
 {$ELSE}
    label1.Caption:='Release konfigurasyonu seçili';
 {$ENDIF}
end;

Delphi 2007 sürümü ve öncesi sürümlerde konfigurasyonlar yoktur. Project menüsündeki Options seçeneği ile gelen Project Options diyalogunda Compiler tabının Debugging kısmında Debug information seçeneği seçildiğinde Debug info direktifi {$D+} {$DEBUGINFO ON} aktif hale gelir. Bu direktif değerlendirilerek konfigurasyonlara özel kodlar yazılabilir.

Project Options diyalogu

{$IFOPT D+} {$DEFINE DEBUG} {$ENDIF}
// Uygulamanın üst kısmında bir yere eklenir
// Debug info direktifi değerlendiriliyor.
// Direktif aktifse DEBUG kelimesi tanımlanıyor

....

procedure TForm1.Button1Click(Sender: TObject);
begin
 {$IFDEF DEBUG} 
    label1.Caption:='Debug konfigurasyonu seçili';
 {$ELSE}
    label1.Caption:='Release konfigurasyonu seçili';
 {$ENDIF}
end;

Not Uygulamada konfigurasyon değiştirildiğinde tekrar baştan derleme yapılmalıdır.

Not Delphi 2007 sürümü ve sonrası sürümlerde Debug ve Release konfigurasyonları haricinde başka konfigurasyonlar oluşturmak ve oluşturulan bu yeni konfigurasyonlara özel kodlar yazmak mümkündür.

, , , , , , , , , , ,

  1. Yorum bırakın

Yorum bırakın

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.