Visual C sharp'da izleme ve hata ayıklama

Bu makalede, Visual C# içinde izleme ve hata ayıklama işlemleri açıklanır ve ilgili bilgileri açıklamak için bazı örnek adımlar sağlanır.

Orijinal ürün sürümü: Visual C#
Özgün KB numarası: 815788

Özet

Bu makalenin Microsoft Visual Basic .NET sürümü için bkz. Visual Basic .NET'te İzleme ve Hata Ayıklama sınıflarını kullanma.

Bu makale, .NET Framework Sınıf Kitaplığı ad alanı Sistemi'ne başvurur. Tanılama ve ve Trace sınıflarının nasıl kullanılacağını Debug açıklar. Bu sınıflar .NET Framework kullanılabilir. Uygulama geliştirme sırasında veya üretime dağıtımdan sonra uygulamanın performansı hakkında bilgi sağlamak için bu sınıfları kullanabilirsiniz. Bu sınıflar, .NET Framework kullanılabilen izleme özelliklerinin yalnızca bir parçasıdır.

Gereksinimler

Aşağıdaki listede ihtiyacınız olan önerilen donanım, yazılım, ağ altyapısı ve hizmet paketleri özetlenmiştir:

  • Microsoft Windows
  • Microsoft Visual C#

Bu makalede, program hata ayıklama hakkında bilgi sahibi olduğunuz da varsayılır.

Tekniğin açıklaması

Hata Ayıklama Sınıfı ile Örnek Oluşturma bölümündeki adımlar, program yürütme hakkında bilgi sağlamak için sınıfını Debug kullanan bir konsol uygulamasının nasıl oluşturulacağını gösterir.

Program çalıştırıldığında, program yürütme sırasını izlemenize, arızaları Debug algılamanıza veya performans ölçümü bilgileri sağlamanıza yardımcı olacak iletiler üretmek için sınıfının yöntemlerini kullanabilirsiniz. Varsayılan olarak, sınıfın Debug ürettiği iletiler Visual Studio Tümleşik Geliştirme Ortamı'nın (IDE) Çıkış penceresinde görünür.

Örnek kod, bir satır sonlandırıcısı tarafından izlenen bir ileti oluşturmak için yöntemini kullanır WriteLine . İleti oluşturmak için bu yöntemi kullandığınızda, her ileti Çıkış penceresinde ayrı bir satırda görüntülenir.

sınıfının yöntemini Debug kullandığınızdaAssert, Çıkış penceresi yalnızca belirtilen bir koşul false olarak değerlendirilirse bir ileti görüntüler. İleti, kullanıcıya kalıcı bir iletişim kutusunda da görünür. İletişim kutusu iletiyi, proje adını ve öğesini Debugiçerir. Assert deyimi numarası. İletişim kutusu aşağıdaki üç komut düğmesini de içerir:

  • Iptal: Uygulama çalışmayı durdurur.

  • Yeni -den deneme: Uygulama hata ayıklama moduna girer.

  • Yoksay: Uygulama devam eder. Uygulamanın devam etmesi için kullanıcının bu düğmelerden birine tıklaması gerekir.

Ayrıca, çıktıyı sınıfından Debug Çıkış penceresi dışındaki hedeflere de yönlendirebilirsiniz. sınıfı, Debug nesneleri içeren Listener bir Dinleyiciler koleksiyonuna sahiptir.

Her Dinleyici nesnesi çıkışı izler Debug ve çıkışı belirtilen hedefe yönlendirir.

Dinleyici koleksiyonundaki her Dinleyici, sınıfın Debug oluşturduğu tüm çıkışları alır. Nesneleri tanımlamak Listener için sınıfını TextWriterTraceListener kullanın. Bir sınıfın hedefini TextWriterTraceListener oluşturucu aracılığıyla belirtebilirsiniz.

Bazı olası çıkış hedefleri şunlardır:

  • özelliğini kullanarak System.Console.Out Konsol penceresi.
  • deyimini kullanarak System.IO.File.CreateText("FileName.txt") bir metin (.txt) dosyası. Nesneyi TextWriterTraceListener oluşturduktan sonra nesnesine Debugeklemeniz gerekir. Çıktı almak Debug için dinleyiciler koleksiyonu.

Hata Ayıklama Sınıfı ile örnek oluşturma

  1. Visual Studio veya Visual C# Express Edition'ı başlatın.

  2. conInfo adlı yeni bir Visual C# Konsol Uygulaması projesi oluşturun. Sınıf1, Visual Studio .NET'te oluşturulur. Program.cs Visual Studio 2005'te oluşturulur.

  3. Sınıf1 veya Program.cs'da en üste aşağıdaki ad alanını ekleyin.

    using System.Diagnostics;
    
  4. Bir ürün hakkında bilgi içerecek değişkenleri başlatmak için Main yöntemine aşağıdaki bildirim deyimlerini ekleyin:

    string sProdName = "Widget";
    int iUnitQty = 100;
    double dUnitCost = 1.03;
    
  5. sınıfının yönteminin ilk giriş parametresi WriteLine olarak ürettiği iletiyi belirtin. Çıkış penceresinin görünür olduğundan emin olmak için CTRL+ALT+O tuş bileşimine basın.

    Debug.WriteLine("Debug Information-Product Starting ");
    
  6. Okunabilirlik için, Çıkış penceresinde sonraki iletileri girintili yapmak için yöntemini kullanın Indent :

    Debug.Indent();
    
  7. Seçili değişkenlerin içeriğini görüntülemek için yöntemini aşağıdaki gibi kullanın WriteLine :

    Debug.WriteLine("The product name is " + sProdName);
    Debug.WriteLine("The available units on hand are" + iUnitQty.ToString());
    Debug.WriteLine("The per unit cost is " + dUnitCost.ToString());
    
  8. Mevcut bir nesnenin WriteLine ad alanını ve sınıf adını görüntülemek için yöntemini de kullanabilirsiniz. Örneğin, aşağıdaki kod Çıkış penceresinde ad alanını görüntüler System.Xml.XmlDocument :

    System.Xml.XmlDocument oxml = new System.Xml.XmlDocument();
    Debug.WriteLine(oxml);
    
  9. Çıkışı düzenlemek için, yönteminin isteğe bağlı, ikinci giriş parametresi WriteLine olarak bir kategori ekleyebilirsiniz. Bir kategori belirtirseniz, Çıkış penceresi iletisinin biçimi "category: message" olur. Örneğin, aşağıdaki kodun ilk satırında Çıkış penceresinde "Alan: Ürün adı Pencere Öğesidir" ifadesi görüntülenir:

    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.ToString(),"Field");
    Debug.WriteLine("Total Cost is " + (iUnitQty * dUnitCost),"Calc");
    
  10. Çıkış penceresi iletileri yalnızca belirlenmiş bir koşul sınıfın yöntemini Debug kullanarak WriteLineIf true olarak değerlendiriyorsa görüntüleyebilir. Değerlendirilecek koşul, yöntemin ilk giriş parametresidir WriteLineIf . İkinci parametresi WriteLineIf , yalnızca ilk parametredeki koşul true olarak değerlendirilirse görüntülenen iletidir.

    Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear");
    Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");
    
  11. Çıkış penceresinin Debug yalnızca belirtilen bir koşul false olarak değerlendirilirse iletiyi görüntülemesi için sınıfının Assert yöntemini kullanın:

    Debug.Assert(dUnitCost > 1, "Message will NOT appear");
    Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");
    
  12. TextWriterTraceListener Konsol penceresi (tr1) ve Output.txt (tr2) adlı bir metin dosyası için nesneleri oluşturun ve ardından her nesneyi Hata Ayıklama Dinleyicileri koleksiyonuna ekleyin:

    TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
    Debug.Listeners.Add(tr1);
    
    TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("Output.txt"));
    Debug.Listeners.Add(tr2);
    
  13. Okunabilirlik için yöntemini kullanarak Unindent sınıfın oluşturduğu sonraki iletilerin girintisini Debug kaldırın. ve Unindent yöntemlerini birlikte kullandığınızdaIndent, okuyucu çıkışı grup olarak ayırt edebilir.

    Debug.Unindent();
    Debug.WriteLine("Debug Information-Product Ending");
    
  14. Her Listener nesnenin tüm çıkışını aldığından emin olmak için sınıf arabellekleri için Flush yöntemini çağırın Debug :

    Debug.Flush();
    

İzleme Sınıfını Kullanma

Bir uygulamanın yürütülmesini Trace izleyen iletiler oluşturmak için sınıfını da kullanabilirsiniz. Trace ve Debug sınıfları, aşağıdakiler de dahil olmak üzere çıkış üretmek için aynı yöntemlerin çoğunu paylaşır:

  • Yazma Çizgisi
  • Writelineıf
  • Girinti
  • Unindent
  • Assert
  • Flush

ve sınıflarını TraceDebug aynı uygulamada ayrı ayrı veya birlikte kullanabilirsiniz. Hata Ayıklama Çözümü Yapılandırması projesinde hem hem Debug de Trace çıkış etkindir. Proje, bu sınıfların her ikisinden de tüm Listener nesnelere çıkış oluşturur. Ancak, Bir Sürüm Çözümü Yapılandırması projesi yalnızca bir Trace sınıftan çıkış oluşturur. Release Solution Configuration projesi tüm Debug sınıf yöntemi çağrılarını yoksayar.

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("Trace Information-Product Ending");

Trace.Flush();

Console.ReadLine();

Çalıştığını doğrulayın

  1. Hata Ayıklama'nın geçerli çözüm yapılandırması olduğundan emin olun.

  2. Çözüm Gezgini penceresi görünmüyorsa, bu pencereyi görüntülemek için CTRL+ALT+L tuş bileşimine basın.

  3. conInfo'ya sağ tıklayın ve ardından Özellikler'e tıklayın.

  4. conInfo özellik sayfasının sol bölmesindeki Yapılandırma klasörünün altında okun Hata Ayıklama'yı gösterdiğinden emin olun.

    Not

    Visual C# 2005 ve Visual C# 2005 Express Edition'da conInfo sayfasında Hata Ayıkla'ya tıklayın.

  5. Yapılandırma klasörünün üst kısmındaki Yapılandırma açılan liste kutusunda Etkin (Hata Ayıkla) veya HataAyıkla'ya ve ardından Tamam'a tıklayın. Visual C# 2005'te ve Visual C# 2005 Express Edition'da, Hata Ayıkla sayfasındaki Yapılandırma açılan liste kutusunda Etkin (Hata Ayıkla) veya Hata Ayıkla'ya tıklayın ve ardından Dosya menüsünde Kaydet'e tıklayın.

  6. Çıkış penceresini görüntülemek için CTRL+ALT+O tuşlarına basın.

  7. Kodu çalıştırmak için F5 tuşuna basın. Onaylama Başarısız oldu iletişim kutusu görüntülendiğinde Yoksay'a tıklayın.

  8. Konsol penceresinde ENTER tuşuna basın. Program bitmeli ve Çıkış penceresinde aşağıdakine benzer bir çıkış görüntülenmelidir:

    Debug Information-Product Starting
    The product name is Widget
    The available units on hand are100
    The per unit cost is 1.03
    System.Xml.XmlDocument
    Field: The product name is Widget
    Field: The units on hand are100
    Field: The per unit cost is1.03
    Calc: Total Cost is 103
    This message WILL appear
    ---- DEBUG ASSERTION FAILED ----
    ---- Assert Short Message ----
    Message will appear since dUnitcost < 1 is false
    ---- Assert Long Message ----
    
    at Class1.Main(String[] args) <%Path%>\class1.cs(34)
    
    The product name is Widget
    The available units on hand are100
    The per unit cost is 1.03
    Debug Information-Product Ending
    Trace Information-Product Starting
    The product name is Widget
    Field: The product name isWidget
    This message WILL appear
    Trace Information-Product Ending
    
  9. Konsol penceresi ve Output.txt dosyası aşağıdaki çıkışı göstermelidir:

    The product name is Widget
    The available units on hand are 100
    The per unit cost is 1.03
    Debug Information-Product Ending
    Trace Information-Product Starting
    The product name is Widget
    Field: The product name is Widget
    This message WILL appear
    Trace Information-Product Ending
    

Not

Output.txt dosyası conInfo yürütülebilir dosyasıyla (conInfo.exe) aynı dizinde bulunur. Genellikle bu, proje kaynağının depolandığı \bin klasörüdür. Varsayılan olarak, bu değeridir C:\Documents and Settings\User login\My Documents\Visual Studio Projects\conInfo\bin. Visual C# 2005 ve Visual C# 2005 Express Edition'da Output.txt dosyası şu klasörde bulunur: C:\Documents and Settings\User login\My Documents\Visual Studio 2005\Projects\conInfo\conInfo\bin\Debug.

Tam Kod Listesi

using System;
using System.Diagnostics;

class Class1
{
    [STAThread]
    static void Main(string[] args)
    {
        string sProdName = "Widget";
        int iUnitQty = 100;
        double dUnitCost = 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.ToString());
        Debug.WriteLine("The per unit cost is "+ dUnitCost.ToString());

        System.Xml.XmlDocument oxml = 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.ToString(),"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 since dUnitcost < 1 is false");

        TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
        Debug.Listeners.Add(tr1);

        TextWriterTraceListener tr2 = 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("Trace Information-Product Ending");

        Trace.Flush();

        Console.ReadLine();
    }
}

Sorun giderme

  • Çözüm yapılandırma türü Release ise, Debug sınıf çıkışı yoksayılır.

  • Belirli bir hedef için bir TextWriterTraceListener sınıf oluşturduktan sonra ve TextWriterTraceListenerDebug sınıflarından Trace çıkış alır. Bu, sınıfına eklemek için veya Debug sınıfının yöntemini Trace kullanıp kullanmadığınızdan AddListeners bağımsız olarak TextWriterTraceListener gerçekleşir.

  • ve sınıflarında Trace aynı hedef için bir Listeners nesne eklerseniz, çıkışın her satırı, çıkışın oluşturulup oluşturulmayacağından TraceDebug bağımsız olarak çoğaltılır.Debug

    TextWriterTraceListener myWriter = new TextWriterTraceListener(System.Console.Out);
    Debug.Listeners.Add(myWriter);
    
    TextWriterTraceListener myCreator = new TextWriterTraceListener(System.Console.Out);
    Trace.Listeners.Add(myCreator);
    

Başvurular