Makale Özeti

Her programcının bilmesi gereken debug işlemi hakkında...

Makale

.Net ve Hata Ayıklama
Hata ayıklama yazılımcıların hayatlarının vazgeçilemeyen bir parçası. Günümüzde hatasız program yazan code generatorlar varolmadığı için, elimizdeki hata ayıklama araçlarının gücü yazacağımız program açısından büyük öneme sahip.
VS.NET getirmiş olduğu bir çok dilde program yazabilme özelliklerine ek olarak hata ayıklama konusunda da gelişmiş tekniklerle yazılımcılara yardımcı oluyor.
.Net uygulamaları hem Visual Studio.net in içinden hem de .NET Framework SDK nın içinden çıkan DbgClr adlı GUI Debuggerı kullanarak yapılabiliyor. Aynı zamanda CorDbg ile de komut satırı üzerinden hata ayıklama yapabilirsiniz. Uygulamanızın log bilgisi yazmasının yanısıra belirli exceptionlar durumunda Assert mesajları da çıkartılabilir.
Visual Studio.net ortamında uygulamanızın calışma modunu solution configuration ile belirleyebilirsiniz. Böylece programınızın hata ayıklama modunda mı yoksa çalışma modunda mı üretileceğini belirleyebiliyorsunuz. Bu da hem performans hem de detaylı kod analizi açısından yazılımcıya bir avantaj sağlıyor.
Hata ayıklama her zaman programcının makinasında olmayabilir. Aynı şekilde programın da her zaman bir debugger altında çalışması da istenmeyen bir durumdur. Genelde programlar normal çalışmalarına bırakılır ve yalnızca bir hata olduğunda bir debugger a bağlanıp hatanın detaylarına inilir.
Programınız çalışma anında exception a düştüğü zaman  Just-In-Time Debugging  penceresi ile istediğiniz   debugger a bağlanma imkanınız oluşur. Default olarak  aşağıda göründüğü gibi Microsoft common language runtime debugger gelir.

Trace ve Debug
Systems.Diagnostics namespace i sayesinde programın yaptıklarını analiz etmek için satır satır izlemek gerekmiyor. Bu namespace te bulunan Trace ve debug sınıfları  code-execution sıraları ve  performans profile  ile ilgili metodları barındırmakta. Her iki sınıfta da belirli koşulları kontrol edebileceğimiz Assert  metodları da mevcut.
Trace ve Debug I kullanmak için üç aşama gerekiyor
1. TRACE ve/veya DEBUG tanımı yapın
Debug ve trace i kullanabilmek için öncelikle gerekli sembolleri tanımlamamız gerekiyor. Bu tanım derleme esnasında yapılabilir.

/target:library /debug+ /d:TRACE=True math.vb

veya
#Const TRACE=1   
 
şeklinde de yapılabilir

2. Gerekli Listener nesnesine ait bir instance yaratın
Bu aşama eğer default debugger i kullanmıyorsanız gerekir. Debug ve Trace çıktıları bir TraceListener nesnesi tarafından yakalanır. Default olarak DefaultTraceListener nesnesi OutpuutDebugString API sine ait Dbugger.Log metodu ile kullanarak Windows system debugger a gonderir. Eger bağlı bir Debugger yok ise bu mesajlar yakalanmaz.
Eğer VS.NET Debuggerı kullanıyorsanız, çıktılar Output penceresinde görüntülenir. Ancak başka bir debugger kullanmak isterseniz buna ait bir listener nesnesi yaratmanız ve Listeners Collection unu eklemeniz gerekmektedir.
Trace.Listeners.Add(new 
   TextWriterTraceListener(File.Create("output.txt")))

3. Trace ve Debug metodlarını kullanan satırları programınıza eklyin
Son olarak Trace.Write  Metodu ile runtime degubbimg bilgileri yaratılır.
Trace.WriteLine("")
Trace.WriteLine("Starting tracing...")

Burada kullandıgımız ilk komut Debbug dosyasının başındaki binary bilgiden ilk satırı eklemek için konululmuş bir yeni satır açmaya yarar.
Boşluk ile yazının ileriden başlaması içinde
Trace.Indent()
 
Kullanabilirsiniz.

Aşağıdaki örnekte WriteIf ile Trace in bir kullanımı görülebilir. Burada başlangıçta “0” degeri var ise hata verilir.
Trace.WriteLineIf(test = "0", "hata: Sıfır ile başlangıç")  

Assert Metodu ile de aynı şekilde detaylı bir hata dialog penceresi çıkartılabilir.
Trace.Assert(test = "0", "hata: Sıfır ile başlangıç")  
 


Aşağıdaki örnek ile Trace ve Debug Classlarını test edebilirsiniz

Module Module1
    Sub Main()
        Dim sProdName As String = "Widget"
        Dim iUnitQty As Integer = 100
        Dim dUnitCost As Decimal = 1.03
        Debug.WriteLine("Debug Information-Product Starting ")
        Debug.Indent()
        Debug.WriteLine("The product name is " & sProdName)
        Debug.WriteLine("The available units on hand are " & iUnitQty)
        Debug.WriteLine("The per unit cost is " & dUnitCost)
        Dim oxml As New System.Xml.XmlDocument()
        Debug.WriteLine(oxml)
        Debug.WriteLine("The product name is " & sProdName, "Field")
        Debug.WriteLine("The units on hand are " & iUnitQty, "Field")
        Debug.WriteLine("The per unit cost is " & dUnitCost, "Field")
        Debug.WriteLine("Total cost is " & iUnitQty * dUnitCost, "Calc")
        Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear")
        Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear")
        Debug.Assert(dUnitCost > 1, "Message will NOT appear")
        Debug.Assert(dUnitCost < 1, "Message will appear")
        Dim tr1 As New TextWriterTraceListener(System.Console.Out)
        Debug.Listeners.Add(tr1)
        Dim tr2 As New _
          TextWriterTraceListener(System.IO.File.CreateText("Output.txt"))
       
        Debug.Listeners.Add(tr2)
        Debug.WriteLine("The product name is " & sProdName)
        Debug.WriteLine("The available units on hand are " & iUnitQty)
        Debug.WriteLine("The per unit cost is " & dUnitCost)
        Debug.Unindent()
        Debug.WriteLine("Debug Information-Product Ending")
        Debug.Flush()
        Trace.WriteLine("Trace Information-Product Starting ")
        Trace.Indent()
        Trace.WriteLine("The product name is " & sProdName)
        Trace.WriteLine("The product name is " & sProdName, "Field")
        Trace.WriteLineIf(iUnitQty > 50, "This message WILL appear")
        Trace.Assert(dUnitCost > 1, "Message will NOT appear")
        Trace.Unindent()
        Trace.WriteLine("Tr
ace Information-Product Ending")
        Trace.Flush()
        Console.ReadLine()
    End Sub
End Module

Yapısal Hata Ayıklama
Bütün bunların yanında kodunuzun içinde Try Catch Finally yapısı ile de hata ayıklama yapabilirsiniz. Daha önceden VB programcılarının alışkın olduğu On Error Goto exception handling yönteminin yerine  Try Catch yapısı getiriliyor. Böylece Error handler ların içerisine diğerleri yerleştirilebiliyor. İç içe hata ayıklama yapıları ile de VS.Net C++ programcılarının daha önceden kullandıkları bu güçlü yapıyı tüm dillerde mümkün kılıyor.
Yapısal Hata ayıklama yöntemi If..Else..Endif benzeri bir yapı ile geliyor. Böylelikle daha karmaşık ve iç içe hata ayıklama koşullarını gerçekleştirebiliyoruz.
Daha önceden kullanılan On Error komutu geriye yönelik uyumluluk için kullanılabiliyor ancak On error ve Try Catch yapısı aynı rutim içinde beraber kullanılamıyor.
Bu yapının temel syntax ı şöyle
Try
   Hatanın oluşabileceği program kısmı
Catch
   Hata sırasında çalışacak kod
Finally
   Son olarak yapılan işlemler (Temizlik)
End Try
Try ve End Try  içinde birkaç Catch komutu kullanarak farklı hatalara ait farklı kodlar çalıştırabilirsiniz.

Sub Main()
    Dim a As Integer = 2147483647
    Dim b As Integer = 0
    Dim c As Integer = 0
    Try
      a += 1
    Catch exc As DivideByZeroException
      Console.WriteLine("Hata : Sıfıra Bölünme")
    Catch exc As OverflowException
      Console.WriteLine("Hata: Overflow")
    Catch exc As Exception
      Console.WriteLine("Hata: " & exc.Message)
    Finally
      Console.ReadLine()
    End Try
  End Sub

Sonuç olarak Try Catch ve Trace Debug yontemleri yazılımcıların tüm kodlarının içine yerleştirebilecekleri detaylı hata ayıklama yöntemleri olarak sunuluyor.
Sizden ricamız VS.NET i yüklemeniz, hata ayıklama modunda çeşitli programlama dillerinde aynı anda hata ayıklama yöntemlerine kendi gözlerinizle şahit olmanız.
Tüm yazılımcılar için daha rahat daha hızlı kodlanabilir bir dünyaya doğru hep birlikte ilerlemek dileğiyle hoşçakalın.