Udostępnij za pośrednictwem


Śledzenie i debugowanie w programie Visual C sharp

W tym artykule opisano sposób śledzenia i debugowania w języku Visual C# oraz przedstawiono kilka przykładowych kroków wyjaśniania powiązanych informacji.

Oryginalna wersja produktu: Visual C#
Oryginalny numer KB: 815788

Podsumowanie

Aby zapoznać się z wersją platformy .NET programu Microsoft Visual Basic w tym artykule, zobacz Use Trace and Debug classes in Visual Basic .NET (Używanie klas śledzenia i debugowania na platformie .NET języka Visual Basic).

Ten artykuł dotyczy systemu przestrzeni nazw biblioteki klas programu .NET Framework. Diagnostyka i opisuje sposób używania Debug Trace klas i . Te klasy są dostępne w programie .NET Framework. Za pomocą tych klas można podać informacje o wydajności aplikacji podczas tworzenia aplikacji lub po wdrożeniu do środowiska produkcyjnego. Te klasy są tylko jedną częścią funkcji instrumentacji, które są dostępne w programie .NET Framework.

Wymagania

Na poniższej liście przedstawiono zalecany sprzęt, oprogramowanie, infrastrukturę sieciową i wymagane dodatki Service Pack:

  • Microsoft Windows
  • Microsoft Visual C#

W tym artykule założono również, że znasz debugowanie programów.

Opis techniki

Kroki opisane w sekcji Tworzenie przykładu za pomocą klasy debugowania pokazują, jak utworzyć aplikację konsolową, która używa Debug klasy do dostarczania informacji o wykonaniu programu.

Po uruchomieniu programu można użyć metod klasy do tworzenia komunikatów Debug , które ułatwiają monitorowanie sekwencji wykonywania programu, wykrywanie awarii lub dostarczanie informacji o pomiarze wydajności. Domyślnie komunikaty generowane Debug przez klasę są wyświetlane w oknie Dane wyjściowe zintegrowanego środowiska projektowego (IDE) programu Visual Studio.

Przykładowy kod używa WriteLine metody do utworzenia komunikatu, po którym następuje terminator wiersza. Gdy używasz tej metody do tworzenia komunikatu, każdy komunikat pojawia się w osobnym wierszu w oknie Dane wyjściowe.

Jeśli używasz Assert metody Debug klasy, w oknie Dane wyjściowe zostanie wyświetlony komunikat tylko wtedy, gdy określony warunek zwróci wartość false. Komunikat jest również wyświetlany w modalnym oknie dialogowym dla użytkownika. Okno dialogowe zawiera komunikat, nazwę projektu i Debug. Numer instrukcji Assert. Okno dialogowe zawiera również następujące trzy przyciski poleceń:

  • Przerwanie: aplikacja przestaje działać.

  • Ponów próbę: aplikacja wprowadza tryb debugowania.

  • Ignoruj: aplikacja jest kontynuowana. Użytkownik musi kliknąć jeden z tych przycisków, zanim aplikacja będzie mogła kontynuować.

Możesz również kierować dane wyjściowe z Debug klasy do miejsc docelowych innych niż okno Dane wyjściowe. Klasa Debug ma kolekcję Odbiorniki, która zawiera Listener obiekty.

Każdy obiekt Odbiornik monitoruje Debug dane wyjściowe i kieruje dane wyjściowe do określonego obiektu docelowego.

Każdy odbiornik w kolekcji Odbiornik otrzymuje wszystkie dane wyjściowe generowane przez klasę Debug . TextWriterTraceListener Użyj klasy , aby zdefiniować Listener obiekty. Element docelowy klasy można określić za pomocą konstruktora TextWriterTraceListener .

Niektóre możliwe elementy docelowe danych wyjściowych obejmują następujące elementy:

  • Okno Konsola przy użyciu System.Console.Out właściwości .
  • Plik tekstowy (.txt) przy użyciu instrukcji System.IO.File.CreateText("FileName.txt") . Po utworzeniu TextWriterTraceListener obiektu należy dodać obiekt do obiektu Debug. Kolekcja odbiorników do odbierania Debug danych wyjściowych.

Tworzenie przykładu przy użyciu klasy debugowania

  1. Uruchom program Visual Studio lub Visual C# Express Edition.

  2. Utwórz nowy projekt aplikacji konsolowej Visual C# o nazwie conInfo. Klasa 1 jest tworzona w programie Visual Studio .NET. Program.cs jest tworzony w programie Visual Studio 2005.

  3. Dodaj następującą przestrzeń nazw u góry w klasie Class1 lub Program.cs.

    using System.Diagnostics;
    
  4. Aby zainicjować zmienne zawierające informacje o produkcie, dodaj następujące instrukcje deklaracji do metody Main:

    string sProdName = "Widget";
    int iUnitQty = 100;
    double dUnitCost = 1.03;
    
  5. Określ komunikat, który klasa generuje jako pierwszy parametr WriteLine wejściowy metody. Naciśnij kombinację CTRL+ALT+O , aby upewnić się, że okno Dane wyjściowe jest widoczne.

    Debug.WriteLine("Debug Information-Product Starting ");
    
  6. Aby uzyskać czytelność, użyj Indent metody , aby wciąć kolejne komunikaty w oknie Dane wyjściowe:

    Debug.Indent();
    
  7. Aby wyświetlić zawartość wybranych zmiennych, użyj WriteLine metody w następujący sposób:

    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. Można również użyć WriteLine metody , aby wyświetlić przestrzeń nazw i nazwę klasy dla istniejącego obiektu. Na przykład poniższy kod wyświetla System.Xml.XmlDocument przestrzeń nazw w oknie Dane wyjściowe:

    System.Xml.XmlDocument oxml = new System.Xml.XmlDocument();
    Debug.WriteLine(oxml);
    
  9. Aby zorganizować dane wyjściowe, możesz dołączyć kategorię jako opcjonalny, drugi parametr WriteLine wejściowy metody. Jeśli określisz kategorię, format komunikatu okna Dane wyjściowe to "kategoria: komunikat". Na przykład w pierwszym wierszu następującego kodu zostanie wyświetlony komunikat "Pole: Nazwa produktu to Widget" w oknie Dane wyjściowe:

    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. Okno Dane wyjściowe może wyświetlać komunikaty tylko wtedy, gdy wyznaczony warunek daje wartość true przy użyciu WriteLineIf metody Debug klasy . Warunek, który ma zostać oceniony, jest pierwszym parametrem wejściowym WriteLineIf metody. Drugi parametr WriteLineIf to komunikat, który pojawia się tylko wtedy, gdy warunek w pierwszym parametrze ma wartość true.

    Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear");
    Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");
    
  11. Użyj metody Debug Assert klasy, aby okno Dane wyjściowe wyświetlało komunikat tylko wtedy, gdy określony warunek daje wartość false:

    Debug.Assert(dUnitCost > 1, "Message will NOT appear");
    Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");
    
  12. TextWriterTraceListener Utwórz obiekty dla okna Konsola (tr1) i pliku tekstowego o nazwie Output.txt (tr2), a następnie dodaj każdy obiekt do kolekcji Odbiorniki debugowania:

    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. Aby uzyskać czytelność, użyj Unindent metody , aby usunąć wcięcia dla kolejnych komunikatów generowanych przez klasę Debug . W przypadku używania Indent metod i Unindent czytnik może odróżnić dane wyjściowe jako grupę.

    Debug.Unindent();
    Debug.WriteLine("Debug Information-Product Ending");
    
  14. Aby upewnić się, że każdy Listener obiekt odbiera wszystkie jego dane wyjściowe, wywołaj metodę Flush dla Debug klas:

    Debug.Flush();
    

Korzystanie z klasy Trace

Możesz również użyć Trace klasy do tworzenia komunikatów monitorujących wykonywanie aplikacji. Klasy Trace i Debug współużytkują większość tych samych metod w celu wygenerowania danych wyjściowych, w tym następujących:

  • WriteLine
  • WriteLineIf
  • Wcięcie
  • Niezidentyfikowane
  • Assert
  • Spłukiwać

Klasy i Debug można używać Trace oddzielnie lub razem w tej samej aplikacji. W projekcie Konfiguracja rozwiązania debugowania dane wyjściowe i DebugTrace aktywne. Projekt generuje dane wyjściowe z obu tych klas do wszystkich Listener obiektów. Jednak projekt Release Solution Configuration generuje tylko dane wyjściowe z Trace klasy. Projekt Release Solution Configuration ignoruje wszystkie Debug wywołania metody klasy.

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

Sprawdź, czy działa

  1. Upewnij się, że debugowanie jest bieżącą konfiguracją rozwiązania.

  2. Jeśli okno Eksplorator rozwiązań nie jest widoczne, naciśnij kombinację CTRL+ALT+L, aby wyświetlić to okno.

  3. Kliknij prawym przyciskiem myszy polecenie conInfo, a następnie kliknij polecenie Właściwości.

  4. W lewym okienku strony właściwości conInfo w folderze Konfiguracja upewnij się, że strzałka wskazuje pozycję Debugowanie.

    Uwaga 16.

    W programie Visual C# 2005 i visual C# 2005 Express Edition kliknij pozycję Debuguj na stronie conInfo .

  5. Nad folderem Konfiguracja w polu listy rozwijanej Konfiguracja kliknij pozycję Aktywne (debugowanie) lub Debuguj, a następnie kliknij przycisk OK. W programie Visual C# 2005 i Visual C# 2005 Express Edition kliknij pozycję Aktywne (debugowanie) lub Debuguj w polu listy rozwijanej Konfiguracja na stronie Debugowanie , a następnie kliknij polecenie Zapisz w menu Plik .

  6. Naciśnij CTRL+ALT+O , aby wyświetlić okno Dane wyjściowe .

  7. Naciśnij F5, aby uruchomić kod. Gdy pojawi się okno dialogowe Asercji nie powiodło się , kliknij przycisk Ignoruj.

  8. W oknie Konsola naciśnij ENTER. Program powinien zostać zakończony, a w oknie Dane wyjściowe powinny zostać wyświetlone dane wyjściowe podobne do następujących:

    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. W oknie Konsola i pliku Output.txt powinny zostać wyświetlone następujące dane wyjściowe:

    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
    

Uwaga 16.

Plik Output.txt znajduje się w tym samym katalogu co plik wykonywalny conInfo (conInfo.exe). Zazwyczaj jest to folder \bin, w którym jest przechowywane źródło projektu. Domyślnie jest C:\Documents and Settings\User login\My Documents\Visual Studio Projects\conInfo\binto . W programie Visual C# 2005 i visual C# 2005 Express Edition plik Output.txt znajduje się w folderze : C:\Documents and Settings\User login\My Documents\Visual Studio 2005\Projects\conInfo\conInfo\bin\Debug.

Kompletna lista kodu

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

Rozwiązywanie problemów

  • Jeśli typ konfiguracji rozwiązania to Release, Debug dane wyjściowe klasy są ignorowane.

  • Po utworzeniu TextWriterTraceListener klasy dla określonego obiektu docelowego TextWriterTraceListener odbiera dane wyjściowe z Trace klas i Debug . Dzieje się tak niezależnie od tego, czy używasz Add metody Trace klasy , czy Debug klasy do dodania Listeners TextWriterTraceListener do klasy.

  • Jeśli dodasz Listeners obiekt dla tego samego obiektu docelowego w Trace klasach i Debug , każdy wiersz danych wyjściowych zostanie zduplikowany, niezależnie od tego, czy Debug lub Trace generuje dane wyjściowe.

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

Informacje