Ablaufverfolgung und Debuggen in Visual C sharp

In diesem Artikel wird das Nachverfolgen und Debuggen in Visual C# beschrieben, und es werden einige Beispielschritte zum Erläutern verwandter Informationen beschrieben.

Originalversion des Produkts:   Visual C #
Ursprüngliche KB-Nummer:   815788

Zusammenfassung

Eine Microsoft Visual Basic .NET-Version dieses Artikels finden Sie unter Verwenden von Ablaufverfolgungs- und Debugklassen in Visual Basic .NET.

Dieser Artikel bezieht sich auf den .NET Framework KlassenbibliotheksnamespaceSystem. Diagnose und Beschreibt die Verwendung der Debug Klassen und der Trace Klassen. Diese Klassen sind in der .NET Framework verfügbar. Sie können diese Klassen verwenden, um Informationen über die Leistung einer Anwendung entweder während der Anwendungsentwicklung oder nach der Bereitstellung in der Produktion bereitzustellen. Diese Klassen sind nur ein Teil der Instrumentierungsfeatures, die im .NET Framework verfügbar sind.

Anforderungen

In der folgenden Liste sind die empfohlenen Hardware, Software, Netzwerkinfrastruktur und Service Packs aufgeführt, die Sie benötigen:

  • Microsoft Windows
  • Microsoft Visual C#

In diesem Artikel wird auch davon ausgegangen, dass Sie mit dem Programmdebugging vertraut sind.

Beschreibung der Technik

Die Schritte im Abschnitt "Erstellen eines Beispiels mit der Debugklasse " veranschaulichen das Erstellen einer Konsolenanwendung, die die Debug Klasse verwendet, um Informationen zur Programmausführung bereitzustellen.

Wenn das Programm ausgeführt wird, können Sie Methoden der Debug Klasse verwenden, um Nachrichten zu erstellen, die Ihnen helfen, die Ausführungssequenz des Programms zu überwachen, Fehlfunktionen zu erkennen oder Leistungsmessinformationen bereitzustellen. Standardmäßig werden die von der Debug Klasse erzeugten Meldungen im Ausgabefenster der Visual Studio Integrated Development Environment (IDE) angezeigt.

Der Beispielcode verwendet die WriteLine Methode, um eine Nachricht zu erzeugen, auf die ein Zeilenabschlusszeichen folgt. Wenn Sie diese Methode verwenden, um eine Nachricht zu erzeugen, wird jede Nachricht in einer separaten Zeile im Ausgabefenster angezeigt.

Wenn Sie die Assert Methode der Debug Klasse verwenden, wird im Ausgabefenster nur dann eine Meldung angezeigt, wenn eine angegebene Bedingung als "false" ausgewertet wird. Die Meldung wird dem Benutzer auch in einem modalen Dialogfeld angezeigt. Das Dialogfeld enthält die Nachricht, den Projektnamen und den Debug. Assert-Anweisungsnummer. Das Dialogfeld enthält auch die folgenden drei Befehlsschaltflächen:

  • Abbrechen: Die Anwendung wird nicht mehr ausgeführt.

  • Wiederholen: Die Anwendung wechselt in den Debugmodus.

  • Ignorieren: Die Anwendung wird fortgesetzt. Der Benutzer muss auf eine dieser Schaltflächen klicken, bevor die Anwendung fortgesetzt werden kann.

Sie können die Debug Ausgabe der Klasse auch an andere Ziele als das Ausgabefenster weiterleiten. Die Debug Klasse verfügt über eine Listeners-Auflistung, die Objekte enthält Listener .

Jedes Listener-Objekt überwacht Debug die Ausgabe und leitet die Ausgabe an ein angegebenes Ziel weiter.

Jeder Listener in der Listener-Auflistung empfängt jede ausgabe, die die Debug Klasse generiert. Verwenden Sie die TextWriterTraceListener Klasse, um Objekte zu definieren Listener . Sie können das Ziel für eine TextWriterTraceListener Klasse über ihren Konstruktor angeben.

Einige mögliche Ausgabeziele umfassen Folgendes:

  • Das Konsolenfenster mithilfe der System.Console.Out Eigenschaft.
  • Eine Textdatei (.txt) mithilfe der System.IO.File.CreateText("FileName.txt") Anweisung. Nachdem Sie ein TextWriterTraceListener Objekt erstellt haben, müssen Sie das Objekt dem Debughinzufügen. Listeners-Auflistung zum Empfangen Debug der Ausgabe.

Erstellen eines Beispiels mit der Debugklasse

  1. Starten Sie Visual Studio oder Visual C# Express Edition.

  2. Erstellen Sie ein neues Visual C#-Konsolenanwendungsprojekt mit dem Namen "conInfo". Class1 wird in Visual Studio .NET erstellt. Program.cs wird in Visual Studio 2005 erstellt.

  3. Fügen Sie oben in Class1 oder Program.cs den folgenden Namespace hinzu.

    using System.Diagnostics;
    
  4. Fügen Sie die folgenden Deklarationsanweisungen zur Main-Methode hinzu, um Variablen zu initialisieren, die Informationen zu einem Produkt enthalten:

    string sProdName = "Widget";
    int iUnitQty = 100;
    double dUnitCost = 1.03;
    
  5. Geben Sie die Meldung an, die von der Klasse als erster Eingabeparameter der WriteLine Methode erzeugt wird. Drücken Sie die Tastenkombination STRG+ALT+O , um sicherzustellen, dass das Ausgabefenster sichtbar ist.

    Debug.WriteLine("Debug Information-Product Starting ");
    
  6. Verwenden Sie zur besseren Lesbarkeit die Indent Methode, um nachfolgende Nachrichten im Ausgabefenster einzurücken:

    Debug.Indent();
    
  7. Um den Inhalt ausgewählter Variablen anzuzeigen, verwenden Sie die WriteLine Methode wie folgt:

    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. Sie können die WriteLine Methode auch verwenden, um den Namespace und den Klassennamen für ein vorhandenes Objekt anzuzeigen. Der folgende Code zeigt z. B. den System.Xml.XmlDocument Namespace im Ausgabefenster an:

    System.Xml.XmlDocument oxml = new System.Xml.XmlDocument();
    Debug.WriteLine(oxml);
    
  9. Zum Organisieren der Ausgabe können Sie eine Kategorie als optionalen zweiten Eingabeparameter der WriteLine Methode einschließen. Wenn Sie eine Kategorie angeben, lautet das Format der Ausgabefensternachricht "Kategorie: Nachricht". In der ersten Zeile des folgenden Codes wird beispielsweise im Ausgabefenster "Feld: Der Produktname ist Widget" angezeigt:

    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. Im Ausgabefenster können Meldungen nur angezeigt werden, wenn eine festgelegte Bedingung mithilfe der WriteLineIf Methode der Debug Klasse als wahr ausgewertet wird. Die auszuwertende Bedingung ist der erste Eingabeparameter der WriteLineIf Methode. Der zweite Parameter ist WriteLineIf die Meldung, die nur angezeigt wird, wenn die Bedingung im ersten Parameter als wahr ausgewertet wird.

    Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear");
    Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");
    
  11. Verwenden Sie die Assert-Methode der Debug Klasse, damit die Meldung im Ausgabefenster nur angezeigt wird, wenn eine angegebene Bedingung als "false" ausgewertet wird:

    Debug.Assert(dUnitCost > 1, "Message will NOT appear");
    Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");
    
  12. Erstellen Sie die TextWriterTraceListener Objekte für das Konsolenfenster (tr1) und für eine Textdatei mit dem Namen Output.txt (tr2), und fügen Sie dann jedes Objekt der Debuglistener-Auflistung hinzu:

    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. Verwenden Sie zur besseren Lesbarkeit die Unindent Methode, um den Einzug für nachfolgende Nachrichten zu entfernen, die von der Debug Klasse generiert werden. Wenn Sie die Methoden und die Indent Unindent Methoden zusammen verwenden, kann der Leser die Ausgabe als Gruppe unterscheiden.

    Debug.Unindent();
    Debug.WriteLine("Debug Information-Product Ending");
    
  14. Um sicherzustellen, dass jedes Listener Objekt seine gesamte Ausgabe empfängt, rufen Sie die Flush-Methode für die Debug Klassenpuffer auf:

    Debug.Flush();
    

Verwenden der Ablaufverfolgungsklasse

Sie können die Trace Klasse auch verwenden, um Nachrichten zu erstellen, die die Ausführung einer Anwendung überwachen. Die Trace Klassen und Debug klassen verwenden die meisten der gleichen Methoden, um eine Ausgabe zu erzeugen, einschließlich der folgenden:

  • WriteLine
  • Writelineif
  • Einzug
  • Unindent
  • Assert
  • Flush

Sie können die Trace Klassen und die Debug Klassen separat oder zusammen in derselben Anwendung verwenden. In einem Debuglösungskonfigurationsprojekt sind sowohl die Ausgabe als auch Trace Debug die Ausgabe aktiv. Das Projekt generiert die Ausgabe dieser beiden Klassen für alle Listener Objekte. Ein Projekt zur Versionslösungskonfiguration generiert jedoch nur die Ausgabe einer Trace Klasse. Das Projekt "Release Solution Configuration" ignoriert alle Debug Klassenmethodenaufrufe.

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();

Überprüfen, ob es funktioniert

  1. Stellen Sie sicher, dass Debuggen die aktuelle Lösungskonfiguration ist.

  2. Wenn das Projektmappen-Explorer Fenster nicht sichtbar ist, drücken Sie STRG +ALT+L, um dieses Fenster anzuzeigen.

  3. Klicken Sie mit der rechten Maustaste auf "conInfo", und klicken Sie dann auf "Eigenschaften".

  4. Stellen Sie im linken Bereich der Eigenschaftenseite "conInfo " unter dem Ordner "Konfiguration " sicher, dass der Pfeil auf "Debuggen" zeigt.

    Hinweis

    Klicken Sie in Visual C# 2005 und Visual C# 2005 Express Edition auf der Seite "conInfo" auf "Debuggen".

  5. Klicken Sie oberhalb des Ordners "Konfiguration " im Dropdown-Listenfeld "Konfiguration " auf "Aktiv" (Debuggen) oder " Debuggen", und klicken Sie dann auf "OK". Klicken Sie in Visual C# 2005 und Visual C# 2005 Express Edition im Dropdown-Listenfeld "Konfiguration" auf der Seite "Debuggen**" auf "Aktiv" (Debuggen)** oder "Debuggen", und klicken Sie dann im Menü "Datei**" auf "Speichern**".

  6. Drücken Sie STRG+ALT+O , um das Ausgabefenster anzuzeigen.

  7. Drücken Sie F5 , um den Code auszuführen. Wenn das Dialogfeld "Assertion Failed " angezeigt wird, klicken Sie auf "Ignorieren".

  8. Drücken Sie im Konsolenfenster die EINGABETASTE. Das Programm sollte fertig sein, und im Ausgabefenster sollte die Ausgabe angezeigt werden, die wie folgt aussieht:

    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. Im Konsolenfenster und in der Output.txt Datei sollte die folgende Ausgabe angezeigt werden:

    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
    

Hinweis

Die Output.txt Datei befindet sich im selben Verzeichnis wie die ausführbare ConInfo-Datei (conInfo.exe). In der Regel ist dies der Ordner "\bin", in dem die Projektquelle gespeichert ist. Der Standardwert ist C:\Documents and Settings\User login\My Documents\Visual Studio Projects\conInfo\bin. In Visual C# 2005 und Visual C# 2005 Express Edition befindet sich die Output.txt Datei im Ordner: C:\Documents and Settings\User login\My Documents\Visual Studio 2005\Projects\conInfo\conInfo\bin\Debug.

Vollständige Codeauflistung

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();
    }
}

Problembehandlung

  • Wenn der Lösungskonfigurationstyp "Release" lautet, wird die Debug Klassenausgabe ignoriert.

  • Nachdem Sie eine TextWriterTraceListener Klasse für ein bestimmtes Ziel erstellt haben, TextWriterTraceListener empfängt die Ausgabe von der Trace und den Debug Klassen. Dies geschieht unabhängig davon, ob Sie die Add Methode der Trace Klasse oder die Debug Klasse verwenden, um sie der Listeners Klasse hinzuzufügenTextWriterTraceListener.

  • Wenn Sie ein Listeners Objekt für dasselbe Ziel in der Trace und den Debug Klassen hinzufügen, wird jede Ausgabezeile dupliziert, unabhängig davon, ob Debug die Ausgabe generiert wird oder Trace nicht.

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

References