Jak śledzić i debugować w środowisku Visual C#

Tłumaczenia artykułów Tłumaczenia artykułów
Numer ID artykułu: 815788 - Zobacz jakich produktów dotyczą zawarte w tym artykule porady.
Wersja tego artykułu dla programu Microsoft Visual Basic .NET: 313417 .
Rozwiń wszystko | Zwiń wszystko

Na tej stronie

Streszczenie

W tym artykule opisano sposób używania klas Debug i Trace. Te klasy są dostępne w systemie Microsoft .NET Framework. Korzystając z tych klas, można dostarczać informacje dotyczące wydajności aplikacji podczas opracowania lub po wdrożeniu do produkcji. Te klasy są tylko jedną z części funkcji instrumentacji dostępnych w systemie .NET Framework.

Wymagania

Na następującej liście uwzględniono podstawowe składniki zalecanego i niezbędnego sprzętu, oprogramowania, infrastruktury sieciowej i dodatków Service Pack:
  • Systemy Microsoft Windows 2000, Microsoft Windows XP lub Microsoft Windows Server 2003
  • Środowisko Microsoft Visual C#
W artykule założono również, że czytelnik jest obeznany z debugowaniem programów.

Opis techniki


Kroki w sekcji Tworzenie przykładu z klasą Debug demonstrują sposób tworzenia aplikacji konsoli używającej klasy Debug do dostarczania informacji dotyczących wykonywania programu.

Po uruchomieniu programu można użyć metod klasy Debug do generowania komunikatów ułatwiających użytkownikowi monitorowanie sekwencji wykonywania programu, wykrywanie usterek lub dostarczanie informacji dotyczących pomiarów wydajności. Domyślnie komunikaty generowane przez klasę Debug pojawiają się w oknie Output (Dane wyjściowe) zintegrowanego środowiska programowania (IDE, Integrated Development Environment) programu Visual Studio.

Kod przykładowy używa metody WriteLine do generowania komunikatu i znaku końca wiersza. Jeżeli ta metoda jest używana do generowania komunikatu, każdy komunikat pojawia się w oddzielnym wierszu w oknie Output.

Jeżeli używana jest metoda Assert klasy Debug, komunikat jest wyświetlany w oknie Output tylko wówczas, gdy określony warunek nie jest spełniony. Komunikat pojawia się również w modalnym oknie dialogowym przeznaczonym dla użytkownika. To okno dialogowe zawiera komunikat, nazwę projektu i numer instrukcji Debug.Assert. W tym oknie dialogowym dostępne są również następujące trzy przyciski polecenia:
  • Abort (Przerwij): Przerwanie działania aplikacji.
  • Retry (Ponów próbę): Przełączenie aplikacji do trybu debugowania.
  • Ignore (Ignoruj): Kontynuacja działania aplikacji.
Użytkownik musi kliknąć jeden z tych przycisków, aby umożliwić kontynuację działania aplikacji.

Dane wyjściowe mogą być również przekazywane z klasy Debug bezpośrednio do lokalizacji innych niż okno Output. Klasa Debug ma kolekcję o nazwie Listeners zawierającą obiekty Listener.

Każdy obiekt Listener monitoruje dane wyjściowe klasy Debug i kieruje je do określonej lokalizacji docelowej.

Każdy obiekt Listener w kolekcji Listener otrzymuje dowolne dane wyjściowe generowane przez klasę Debug. Korzystając z klasy TextWriterTraceListener, można definiować obiekty Listener. Można określić lokalizację docelową dla klasy TextWriterTraceListener za pośrednictwem jej konstruktora.

Lokalizacje docelowe dla danych wyjściowych mogą być następujące:
  • Okno konsoli przy użyciu właściwości System.Console.Out.
  • Plik tekstowy (txt) przy użyciu instrukcji System.IO.File.CreateText("NazwaPliku.txt").
Po utworzeniu obiektu TextWriterTraceListener należy dodać obiekt do kolekcji Debug.Listeners, aby uzyskać dane wyjściowe klasy Debug.

Tworzenie przykładu z klasą Debug

  1. Uruchom program Visual Studio lub Visual C# Express Edition.
  2. Utwórz nowy projekt aplikacji konsoli Visual C# o nazwie conInfo. Klasa Class1 jest tworzona w programie Visual Studio .NET. Plik Program.cs jest tworzony w programie Visual Studio 2005.
  3. Dodaj następującą przestrzeń nazw na początku klasy Class1 lub pliku Program.cs.
    using System.Diagnostics;
  4. Aby zainicjować zmienne, w których będą umieszczane informacje dotyczące produktu, dodaj następujące instrukcje deklaracji do metody Main:
    string sProdName = "Widget";
    int iUnitQty = 100;
    double dUnitCost = 1.03;
  5. Określ komunikat generowany przez klasę jako pierwszy parametr wejściowy metody WriteLine. Naciśnij kombinację klawiszy CTRL+ALT+O, aby upewnić się, że okno Output jest widoczne.
    Debug.WriteLine("Debug Information-Product Starting ");
  6. Aby zwiększyć czytelność, użyj metody Indent do wcięcia kolejnych komunikatów w oknie Output:
    Debug.Indent();
  7. Aby wyświetlić zawartość wybranych zmiennych, użyj metody WriteLine 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ć metody WriteLine do wyświetlenia przestrzeni nazw i nazwy klasy dla istniejącego obiektu. Na przykład następujący kod wyświetla przestrzeń nazwy System.Xml.XmlDocument w oknie Output:
    System.Xml.XmlDocument oxml = new System.Xml.XmlDocument();
    Debug.WriteLine(oxml);
  9. Aby organizować dane wyjściowe, można uwzględnić kategorię jako opcjonalny, drugi parametr wejściowy metody WriteLine. Jeżeli użytkownik określi kategorię, format komunikatu w oknie Output to „category: message”. Na przykład w pierwszym wierszu następującego kodu jest wyświetlany tekst „Field: The product name is Widget” w oknie Output:
    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. W oknie Output mogą być wyświetlane komunikaty tylko wówczas, gdy wyznaczony warunek zostanie uznany za spełniony przez metodę WriteLineIf klasy Debug. Szacowany warunek jest pierwszym parametrem wejściowym metody WriteLine. Drugi parametr metody WriteLineIf jest komunikatem pojawiającym się tylko wówczas, gdy warunek w pierwszym parametrze jest spełniony.
    Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear");
    Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");
    
  11. Użyj metody Assert klasy Debug, tak aby komunikat był wyświetlany w oknie Output tylko wówczas, gdy określony warunek nie jest spełniony:
    Debug.Assert(dUnitCost > 1, "Message will NOT appear");
    Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");
    
  12. Utwórz obiekty TextWriterTraceListener dla okna konsoli (tr1) i pliku tekstowego o nazwie Output.txt (tr2), a następnie dodaj każdy obiekt do kolekcji Debug.Listeners:
    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 zwiększyć czytelność, użyj metody Unindent do usunięcia wcięć kolejnych komunikatów generowanych przez klasę Debug. Jeżeli metoda Indent jest używana razem z metodą Unindent, czytelnik może odróżnić dane wyjściowe jako grupę.
    Debug.Unindent();
    Debug.WriteLine("Debug Information-Product Ending");
  14. Aby upewnić się, że każdy obiekt Listener otrzymuje wszystkie swoje dane wyjściowe, wywołaj metodę Flush dla buforów klasy Debug:
    Debug.Flush();

Korzystanie z klasy Trace

Można również użyć klasy Trace do generowania komunikatów związanych z monitorowaniem wykonywania aplikacji. Klasy Trace i Debug używają zazwyczaj tych samych metod do generowania danych wyjściowych, na przykład:
  • WriteLine
  • WriteLineIf
  • Indent
  • Unindent
  • Assert
  • Flush
Można użyć klas Trace i Debug oddzielnie lub łącznie w tej samej aplikacji. W projekcie Debug Solution Configuration aktywne są dane wyjściowe zarówno metody Trace, jak i Debug. Projekt generuje dane wyjściowe z obu tych klas do wszystkich obiektów Listener. Projekt Release Solution Configuration generuje jednak tylko dane wyjściowe z klasy Trace. Projekt Release Solution Configuration ignoruje dowolne wywołania metod klasy Debug.
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();

Weryfikacja działania kodu

  1. Upewnij się, że Debug jest bieżącą konfiguracją rozwiązania.
  2. Jeżeli okno Solution Explorer jest niewidoczne, naciśnij kombinację klawiszy CTRL+ALT+L w celu wyświetlenia tego okna.
  3. Kliknij prawym przyciskiem myszy element conInfo, a następnie kliknij polecenie Właściwości.
  4. W lewym okienku na stronie właściwości projektu conInfo, w folderze Configuration (Konfiguracja) upewnij się, że strzałka wskazuje pozycję Debugging (Debugowanie).

    Uwaga: W programach Visual C# 2005 i Visual C# 2005 Express Edition należy kliknąć przycisk Debug (Debuguj) na stronie conInfo.
  5. Powyżej folderu Configuration (Konfiguracja) w polu listy rozwijanej Configuration kliknij Active (Debug) (Aktywna) lub Debug (Debugowanie), a następnie kliknij przycisk OK. W programach Visual C# 2005 i Visual C# 2005 Express Edition kliknij pozycję Active (Debug) (Aktywna) lub Debug (Debugowanie) w polu listy rozwijanej Configuration (Konfigfuracja) na stronie Debug, a następnie kliknij polecenie Zapisz w menu Plik.
  6. Naciśnij klawisze CTRL+ALT+O, aby wyświetlić okno Output.
  7. Naciśnij klawisz F5, aby uruchomić kod. Po wyświetleniu okna dialogowego Assertion Failed (Błąd potwierdzenia) kliknij przycisk Ignore (Ignoruj).
  8. W oknie konsoli naciśnij klawisz ENTER. Program powinien zostać zakończony, a w oknie Output 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 konsoli i pliku Output.txt powinny być widoczne 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: Plik Output.txt znajduje się w tym samym katalogu, w którym znajduje się plik wykonywalny conInfo (conInfo.exe). Zazwyczaj jest to folder \bin, w którym jest przechowywany kod źródłowy projektu. Domyślnie jest to folder C:\Documents and Settings\Identyfikator logowania użytkownika\My Documents\Visual Studio Projects\conInfo\bin. W programach Visual C# 2005 i Visual C# 2005 Express Edition plik Output.txt znajduje się w następującym folderze:
C:\Documents and Settings\Identyfikator logowania użytkownika\My Documents\Visual Studio 2005\Projects\conInfo\conInfo\bin\Debug


Kompletny kod

   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żeli typ konfiguracji rozwiązania to Release (Wydanie), dane wyjściowe klasy Debug są ignorowane.
  • Po utworzeniu klasy TextWriterTraceListener dla określonej lokalizacji docelowej klasa TextWriterTraceListener otrzymuje dane wyjściowe od klas Trace i Debug. Jest to niezależne od tego, czy używana jest metoda Add klasy Trace czy klasy Debug w celu dodania obiektu TextWriterTraceListener do klasy Listeners.
  • Jeżeli obiekt Listeners zostanie dodany dla tej samej lokalizacji docelowej w klasach Trace i Debug, każdy wiersz danych wyjściowych jest duplikowany niezależnie od tego, czy klasa 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);
             
    

Materiały referencyjne

Aby uzyskać więcej informacji, zobacz następujące tematy w dokumentacji biblioteki klas systemu .NET Framework:
Klasa Trace
http://msdn2.microsoft.com/en-us/library/system.diagnostics.trace(vs.71).aspx

Klasa Debug
http://msdn2.microsoft.com/en-us/library/system.diagnostics.debug(vs.71).aspx

Właściwości

Numer ID artykułu: 815788 - Ostatnia weryfikacja: 23 lipca 2008 - Weryfikacja: 5.0
Informacje zawarte w tym artykule dotyczą:
  • Microsoft Visual C# 2008 Express Edition
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Słowa kluczowe: 
kbprogramming kbdebug kbnamespace kbhowtomaster KB815788

Przekaż opinię

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com