Makale Özeti

Debug ve Trace Sınıflarının Kullanılması

Makale


Debug ve Trace Sınıflarının Kullanılması - 1

Debug ve Trace sınıfları uygulamanın geliştirilmesi ve çalışması aşamasında bilgilendirici mesajlar verilmesini ve bunların kaydının tutulmasını sağlayan sınıflardır.

İzleme Mekanizması Nasıl Çalışır?

Trace ve Debug sınıfları System.Diagnostics ad uzayı (namespace) içerisinde yer alan ve Shared (C# için static) methodlar barındıran sınıflardır. Uygulamanın çalışma zamanında bazı koşulları kontrol edilmesini ve gerekli kayıt bilgisinin tutulmasını sağlarlar. Bu methodların çıktısı Visual Studio.NET Output penceresinde görüntülenir. Ayrıca bu çıktılar Listeners koleksiyonunda yer alan nesnelerede gönderilir. Trace ve Debug sınıflarının Listeners koleksiyonları ortaktır, ikisinin çıktısıda aynı listeners listesine gönderilir. Listeners koleksiyonuna eklenecek olan nesneler farklı işlevlerde bulunabilirler. Örneğin bir metin dosyasına veya EventLog’ a yazmak gibi.

Trace ve Debug classları arasındaki fark Trace ifadeleri uygulama release modda derlendiğindede çalışır, fakat debug sınıfı için durum böyle değildir. Debug sınıfı sadece debug modda derlenen uygulamalara dahil edilirler.

Debug sınıfı uygulamanın geliştirilmesi sürecinde kullanılır. Trace sınıfı ise uygulamanın geliştirilmesi sürecinde debug yapılırken kullanılabileceği gibi, release modda derlendikten sonrada kullanılır.


Trace ve Debug Çıktısı Oluşturmak

Oluşturulan Trace ve Debug çıktıları ortak olan Listeners koleksiyonuna yazdırılır. Ayrıca Visual Studio .NET bu çıktıları output penceresinde görüntüler.

Trace ve Debug sınıfları ile çıktı oluşturmak için kullanılabilecek olan altı tane metod vardır.

Bunlar :

Write : Verilen metni Listeners koleksiyonuna yazar.

WriteLine : Verilen metni Listeners koleksiyonuna yazar. Ve bir alt satıra geçer.

WriteIf: Eğer verilen Boolean koşulu True değerini taşıyor ise metni Listeners koleksiyonuna yazar.

WriteLineIf: Eğer verilen Boolean koşulu True değerini taşıyor ise metni Listeners koleksiyonuna yazar. Ve bir alt satıra geçer.

Assert : Boolean türündeki şart karşılanmadığı zaman bir mesaj kutusu ile kullanıcıya bilgi verir. Gelen mesaj kutusundaki seçenekler ile program sonlandırılabilir. Ayrıca Listeners koleksiyonunada ilgili mesajı yazar.

Fail: Assert metod ile aynı işlemi yapar. Tek farkı herhangi bir koşula bakmaz, kodun yazıldığı satıra gelindiğinde Assert metodundaki gibi uyarı mesajı görüntülenir.
 

Dim sayi1, sayi2 As Integer
sayi1 = 10
sayi2 = -1
Trace.Write("Trace Mesajı 1")
Trace.WriteLine("Trace Mesajı 2")
Debug.WriteIf(Sayi1 > Sayi2, "Sayi1 büyüktür Sayi2")
Debug.WriteLineIf(Sayi1 <> Sayi2, "Sayi1 ve Sayi2 eşit değildir")
Trace.Assert(sayi2 > 0, "Sayi2 sıfırdan küçük!")
Debug.Fail("İşler yolunda gitmiyor!")
 

Trace ve Debug mesajlarının hiyeraşik görünümü sağlamak için Indent ve UnIndent metodları kullanılır. Indent metodu yazılacak olan
metnin biraz içeriden başmalısını sağlar.
UnIndent ise yazılacak metni tekrar satırın başına konumlandırır. Bu şekilde daha okunaklı ve hiyerarşik kayıtlar tutulabilir.
Indent ile ne kadar içeriden başlanacağını belirmek için IndentSize özelliği kullanılır. Bu özelliği varsayılan değeri 4’tür.
Bu rakamın birimi boşluktur. Indent metodu varsayılan olarak 4 adet boşluk karakterine eşit gelmektedir.
 

Trace.IndentSize = 6
 
Listener Koleksiyonu

Trace ve Debug sınfılarının tüm çıktısı Listeners koleksiyonundaki tüm nesnelere gönderilir. Trace ve Debug sınıfları ortak bir Listeners koleksiyonu kullanırlar.
 
Listeners koleksiyonu her zaman bir öğeye sahiptir. Bu öğe DefaultTraceListener sınıfından türetilmiş olan bir nesnedir. Bu nesne otomatik olarrak oluşturulur ve Listeners koleksiyonuna eklenir. Bu nesne aldığı Trace ve Debug çıktılarını Visual Studio.NET Output penceresine gönderir.
 
Eğer Trace ve Debug mesajları farklı bir kaynağa kaydedilip burada tutulmak istenirse en azından bir tane TraceListener nesnesi oluşturup Listeners koleksiyonuna eklenmelidir. .NET Framework temel sınıf kütüphanesi Trace ve Debug sınfılarının kaydedilmesi için iki adet sınıf barındırmaktadır. Bunlar EventLogTraceListener ve TextWriterTraceListener sınıflarıdır. Bu iki sınıfta MustInherit(abstract) sınıf olan TraceListener sınıfından miras almaktadır.
 

Trace Çıktısının Metin Dosyasına Kaydedilmesi

TextWriterTraceListener sınıfı kendisine yönlendirilen çıktıyı bir metin dosyasına, Stream nesnesine veya TextWriter nesnesine yazdırabilir. Örneğin Console.Out özelliği bir TextWriter nesnesidir.

TextWriterTraceListener sınıfı türetilirken yapılandırıcısında parametre olarak nereye çıktı sağlayacağını alabilir.

Bir metin dosyasına yazdıran TextWriterTraceListener nesnesi oluşturmak:

Dim dinleyici As New TextWriterTraceListener("C:\kayitdosyasi.txt")
Trace.Listeners.Add(dinleyici)


Bir Stream nesnesine yazdıran TextWriterTraceListener oluşturmak:

Dim fs As New System.IO.FileStream("C:\kayitdosyasi.txt", IO.FileMode.Append)
Dim dinleyici As New TextWriterTraceListener(fs)
Trace.Listeners.Add(dinleyici)

TextWrite türünde bir nesneye yazdıran TextWriterTraceListener oluşturmak:

Dim sb As New System.Text.StringBuilder
Dim sw As New System.IO.StringWriter(sb)
Dim dinleyici As New TextWriterTraceListener(sw)
Trace.Listeners.Add(dinleyici)

 

StringWriter sınıfı soyut bir sınıf olan TextWrite sınıfından miras almış bir sınıftır. StringWriter ile bir StringBuilder nesnesine yazdırma işlemi yapılabilir ve uygulamanın Trace ve Debug bilgileri çalışma zamanında bir nesnede saklanır. StringBuilder nesnesinin .ToString özelliği ile Trace ve Debug bilgilerine ulaşılabilir. Bu örnekteki StringBuilder nesnesi metodların dışında tanımlanırsa uygulamanın herhangi bir yerinde Trace ve Debug bilgilerine erişilmesini sağlayacaktır.

Yukarıdaki örneklerde Listener koleksiyonuna TraceListener nesneleri eklenmiştir. Trace ve Debug sınıfıları ile oluşturulacak olan çıktılar artık bu koleksiyona dahil olan nesnelere gönderilecektir. Fakat bu çıktıların TraceListener nesnelerine yansıması için Flush metodu çağrılmalıdır.

Trace.Flush
veya
Debug.Flush

Trace ve Debug sınıfları ile oluşturulan her çıktıdan sonra bu metodları çağırmak yerine AutoFlush özelliği True yapılırsa Flush metodunun çağrılmasına gerek kalmaz.

Trace ve Debug sınfılarının çıktısının bir metin dosyasına yazılması için aşağıdaki adımlar gerçekleştirilmelidir.

1. İstenilen dosya için bir FileStream nesnesi oluşturulur.
2. Yeni bir TextWriterTraceListener nesnesi oluşturulup daha önce oluşturulan FileStream nesnesi ile ilişkilendirilir.
3. Oluşturulan TextWriterTraceListener nesnesi Listeners koleksiyonuna eklenir.
4. AutoFlush özelliği true yapılır veya her çıktı yazdıktan sonra Flush methodu çalıştırılır.


Dim fs As New System.IO.FileStream("C:\kayitdosyasi.txt", IO.FileMode.Append)
Dim dinleyici As New TextWriterTraceListener(fs)
Trace.Listeners.Add(dinleyici)
Trace.AutoFlush = True
Trace.WriteLineIf(sayi1 < 11, "Sayi1 sıfırdan küçük")


Trace Çıktısının EventLog’a Kaydedilmesi

Trace ve Debug çıktılarının EventLog’a yazılması için EventLogTraceListener nesnesi kullanılır. EventLog’a çıktı yazmak temelde metin dosyasına yazmaktan ile aynıdır.

Trace ve Debug çıktılarının EventLog’a yazılması için aşağıdaki işlemler gerçekleştirilmelidir.

1. Bir EventLog oluşturulur yada var olan bir EventLog’a yazılır.
2. Bir EventLogTraceListener nesnesi oluşturulur.
3. Oluşturulan EventLogTraceListener nesnesi Listeners koleksiyonuna eklenir.
4. Trace ve Debug çıktıları belirlenen EventLog’a EventLogEntry olarak yazılır.


Dim myLog As New EventLog
myLog.Source = "Uygulamanın Adı"
Dim dinleyici As EventLogTraceListener
dinleyici = New EventLogTraceListener(myLog)
Trace.Listeners.Add(dinleyici)
 

Cengiz HAN
Microsoft ASP.NET MVP
msn (ve email) : cengiz@cengizhan.com
(eğer online isem çekinmeden mesaj atabilirsiniz.)
e-mail : cengizh@yazgelistir.com