JAK: Klasy Trace i Debug w programie Visual Basic .NET

Streszczenie

W tym artykule pokazano, jak używać klas
Debug
i
Trace. Są one dostępne w architekturze Microsoft .NET Framework. Tych klas można używać do dostarczania informacji o wydajności aplikacji podczas projektowania aplikacji lub po jej wdrożeniu. Te klasy to tylko część funkcji instrumentacji dostępnych w architekturze .NET Framework.


powrót do początku

Wymagania

Oto lista wymaganych elementów, takich jak sprzęt, oprogramowanie, infrastruktura sieci i dodatki Service Pack:
  • System Microsoft Windows 2000 lub Microsoft Windows XP
  • Program Microsoft Visual Basic .NET
W artykule założono również, że czytelnik umie debugować programy.


powrót do początku

Opis techniki

Procedura z sekcji
Tworzenie przykładu z klasą Debug pokazuje, jak utworzyć aplikację konsoli, która używa klasy
Debug
do dostarczenia informacji o wykonywaniu programu.


Gdy program jest uruchomiony, metod klasy
Debug
można używać do generowania komunikatów, które pomagają w monitorowaniu działania programu i wykrywaniu błędów lub podają informacje statystyczne dotyczące wydajności. Domyślnie komunikaty generowane przez klasę
Debug
pojawiają się w oknie Output interfejsu Visual Studio Integrated Development Environment (IDE).


W kodzie przykładowym używana jest metoda
WriteLine
do wygenerowania komunikatu, po którym następuje terminator wiersza. Jeśli do generowania komunikatów jest używana ta metoda, każdy komunikat pojawia się w osobnym wierszu w oknie Output.


Jeśli użyje się metody
Assert
klasy
Debug, komunikat w oknie Output jest wyświetlany tylko wtedy, gdy określony warunek jest fałszywy. Ponadto komunikat pojawia się w modalnym oknie dialogowym. Okno dialogowe zawiera komunikat, nazwę projektu i numer instrukcji
Debug.Assert. Zawiera ono również następujące przyciski poleceń:
  • Abort: Zatrzymuje działanie aplikacji.
  • Retry: Wprowadza aplikację w tryb debugowania.
  • Ignore: Aplikacja kontynuuje działanie.
Aby aplikacja mogła kontynuować działanie, użytkownik musi kliknąć jeden z tych przycisków.


Dane wyjściowe klasy
Debug
można również skierować w inne miejsce docelowe niż okno Output. Klasa
Debug
obejmuje kolekcję o nazwie
Listeners, która zawiera obiekt
Listener. Każdy obiekt
Listener
monitoruje dane wyjściowe klasy
Debug
i kieruje je w określone miejsce docelowe. Każdy obiekt
Listener
w kolekcji
Listeners
odbiera wszelkie dane wyjściowe wygenerowane przez klasę
Debug. Do określenia obiektów
Listener
użyj klasy
TextWriterTraceListener. Miejsce docelowe klasy
TextWriterTraceListener
można określić przy użyciu jej konstruktora. Do niektórych możliwych miejsc docelowych danych wyjściowych należą:
  • Okno Console w przypadku użycia właściwości
    System.Console.Out.
  • Plik tekstowy (.txt) w przypadku użycia instrukcji
    System.IO.File.CreateText("NazwaPliku.txt")).
Aby odbierać dane wyjściowe klasy Debug, po utworzeniu obiektu
TextWriterTraceListener
należy dodać ten obiekt do kolekcji
Debug.Listeners.


powrót do początku

Tworzenie przykładu z klasą Debug

  1. Otwórz program Visual Studio .NET.
  2. W programie Visual Basic .NET utwórz nowy projekt aplikacji konsoli o nazwie conInfo. Domyślnie do projektu zostaje dodany moduł o nazwie Module1.
  3. Aby zainicjować zmienne, które będą zawierać informacje o produkcie, dodaj następujące instrukcje
    Dim:
    Dim sProdName As String = "Widget"
    Dim iUnitQty As Integer = 100
    Dim dUnitCost As Decimal = 1.03
  4. Określ generowany przez klasę komunikat jako pierwszy parametr wejściowy metody
    WriteLine. Naciśnij klawisze CTRL+ALT+O, aby upewnić się, że okno Output będzie widoczne.
    Debug.WriteLine("Początek informacji klasy Debug o produkcie")
  5. Dla zwiększenia czytelności użyj metody
    Indent
    w celu wcięcia kolejnych komunikatów w oknie Output:
    Debug.Indent()
  6. Aby wyświetlić zawartość wybranych zmiennych, użyj metody
    WriteLine, jak następuje:
    Debug.WriteLine("Nazwa produktu: " & sProdName)
    Debug.WriteLine("Liczba dostępnych jednostek: " & iUnitQty)
    Debug.WriteLine("Koszt jednostkowy: " & dUnitCost)
  7. Metody
    WriteLine
    można również użyć do wyświetlenia obszaru nazw i nazwy klasy istniejącego obiektu. Na przykład następujący kod wyświetla w oknie Output obszar nazw
    System.Xml.XmlDocument:
    Dim oxml As New System.Xml.XmlDocument()
    Debug.WriteLine(oxml)
  8. Aby uporządkować dane wyjściowe, można również dołączyć kategorię jako opcjonalny, drugi parametr wyjściowy metody
    WriteLine. Jeśli określi się kategorię, format komunikatu w oknie Output jest następujący „kategoria: komunikat”. Na przykład pierwszy wiersz następującego kodu wyświetla w oknie Output tekst „Pole: Nazwa produktu: Widget”:
    Debug.WriteLine("Nazwa produktu: " & sProdName, "Pole")
    Debug.WriteLine("Liczba jednostek: " & iUnitQty, "Pole")
    Debug.WriteLine("Koszt jednostkowy: " & dUnitCost, "Pole")
    Debug.WriteLine("Całkowity koszt:" & iUnitQty * dUnitCost, "Obl")
  9. Komunikat w oknie Output może być również wyświetlany tylko wtedy, gdy określony warunek jest prawdziwy; należy w tym celu użyć metody
    WriteLineIf
    klasy
    Debug. Warunek, który ma być sprawdzony, jest pierwszym parametrem wejściowym metody
    WriteLineIf. Drugim parametrem metody
    WriteLineIf
    jest komunikat, który pojawia się, jeśli warunek w pierwszym parametrze jest prawdziwy.
    Debug.WriteLineIf(iUnitQty > 50, "Ten komunikat SIĘ POJAWIA")
    Debug.WriteLineIf(iUnitQty < 50, "Ten komunikat SIĘ NIE POJAWIA")
  10. Użyj metody
    Assert
    klasy
    Debug, aby komunikat w oknie Output był wyświetlany tylko w przypadku, gdy określony warunek jest fałszywy:
    Debug.Assert(dUnitCost > 1, "Ten komunikat SIĘ NIE POJAWIA")
    Debug.Assert(dUnitCost < 1, "Ten komunikat SIĘ POJAWIA")
  11. Utwórz obiekty
    TextWriterTraceListener
    dla okna Console (tr1) i dla pliku tekstowego o nazwie Output.txt (tr2), a następnie dodaj każdy z tych obiektów do kolekcji
    Debug Listeners:
    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)
  12. Aby zwiększyć czytelność, użyj metody
    Unindent
    w celu usunięcia wcięć kolejnych komunikatów generowanych przez klasę
    Debug. Jeśli użyjesz metod
    Indent
    i
    Unindent
    razem, użytkownik będzie mógł odróżnić dane wyjściowe jako grupę.
    Debug.Unindent()
    Debug.WriteLine("Koniec informacji klasy Debug o produkcie")
  13. Aby zapewnić, że każdy obiekt
    Listener
    odbiera wszystkie swoje dane wyjściowe, wywołaj metodę
    Flush
    dla buforów klasy
    Debug:
    Debug.Flush()

Korzystanie z klasy Trace

Do generowania komunikatów, które monitorują wykonywanie aplikacji, można również używać klasy
Trace. Klasy
Trace
i
Debug
w większości do generowania danych wyjściowych używają wspólnych metod, takich jak:
  • WriteLine
  • WriteLineIf
  • Indent
  • Unindent
  • Assert
  • Flush
Klas
Trace
i
Debug
można używać osobno lub razem w tej samej aplikacji. W projekcie Debug Solution Configuration są aktywne zarówno dane wyjściowe klasy
Trace, jak i
Debug. Program generuje dane wyjściowe z obu tych klas i przekazuje je do wszystkich obiektów
Listener. Projekt Release Solution Configuration generuje dane wyjściowe tylko z klasy
Trace. Projekt Release Solution Configuration ignoruje wszelkie wywołania metod klasy
Debug.
Trace.WriteLine("Początek informacji klasy Trace o produkcie")

Trace.Indent()

Trace.WriteLine("Nazwa produktu: " & sProdName)
Trace.WriteLine("Nazwa produktu: " & sProdName, "Pole")
Trace.WriteLineIf(iUnitQty > 50, "Ten komunikat SIĘ POJAWIA")
Trace.Assert(dUnitCost > 1, "Ten komunikat SIĘ NIE POJAWIA")

Trace.Unindent()
Trace.WriteLine("Koniec informacji klasy Trace o produkcie")
Trace.Flush()
Console.ReadLine()
powrót do początku

Testowanie kodu

  1. Upewnij się, że bieżącą konfiguracją rozwiązania jest
    Debug.
  2. Jeśli okno Solution Explorer jest niewidoczne, naciśnij klawisze CTRL+ALT+L, aby je wyświetlić.
  3. Kliknij prawym przyciskiem myszy projekt conInfo, a następnie kliknij polecenie Properties.
  4. Upewnij się, że strzałka w lewym okienku strony właściwości projektu conInfo, w folderze Configuration wskazuje tryb
    Debugging.
  5. Powyżej folderu Configuration, na liście rozwijanej
    Configuration
    kliknij pozycję
    Active (Debug)
    lub
    Debug, a następnie kliknij przycisk
    OK.
  6. Naciśnij klawisze CTRL+ALT+O, aby wyświetlić okno Output.
  7. Naciśnij klawisz F5, aby uruchomić kod. Po pojawieniu się okna dialogowego
    Assertion Failed
    kliknij przycisk
    Ignore.
  8. W oknie Console naciśnij klawisz ENTER. Wykonywanie programu powinno się zakończyć, a w oknie Output powinny zostać wyświetlone następujące dane wyjściowe:

    Początek informacji klasy Debug o produkcie
    Nazwa produktu: Widget
    Liczba dostępnych jednostek: 100
    Koszt jednostkowy: 1.03
    System.Xml.XmlDocument
    Pole: Nazwa produktu: Widget
    Pole: Liczba jednostek: 100
    Pole: Koszt jednostkowy: 1.03
    Obl: Całkowity koszt: 103
    Ten komunikat SIĘ POJAWIA
    ---- DEBUG ASSERTION FAILED ----
    ---- Assert Short Message ----
    Komunikat się pojawia
    ---- Assert Long Message ----

    at Module1.Main() C:\Documents and Settings\Administrator\My
    Documents\Visual Studio Projects\conInfo\Module1.vb(29)

    Nazwa produktu: Widget
    Liczba dostępnych jednostek: 100
    Koszt jednostkowy: 1.03
    Początek informacji klasy Debug o produkcie
    Początek informacji klasy Trace o produkcie
    Nazwa produktu: Widget
    Pole: Nazwa produktu: Widget
    Ten komunikat SIĘ POJAWIA
    Koniec informacji klasy Trace o produkcie
  9. W oknie Console i w pliku Output.txt powinny pojawić się następujące dane wyjściowe:

    (The Output.txt file is located in the same directory as the conInfo
    executable, conInfo.exe. Normally this is the \bin folder of where the
    project source has been stored. By default that would be C:\Documents and
    Settings\User login\My Documents\Visual Studio Projects\conInfo\bin)
    Nazwa produktu: Widget
    Liczba dostępnych jednostek: 100
    Koszt jednostkowy: 1.03
    Początek informacji klasy Debug o produkcie
    Początek informacji klasy Trace o produkcie
    Nazwa produktu: Widget
    Pole: Nazwa produktu: Widget
    Ten komunikat SIĘ POJAWIA
    Koniec informacji klasy Trace o produkcie
powrót do początku

Pełny kod

Module Module1
Sub Main()
Dim sProdName As String = "Widget"
Dim iUnitQty As Integer = 100
Dim dUnitCost As Decimal = 1.03

Debug.WriteLine("Początek informacji klasy Debug o produkcie")
Debug.Indent()

Debug.WriteLine("Nazwa produktu: " & sProdName)
Debug.WriteLine("Liczba dostępnych jednostek: " & iUnitQty)
Debug.WriteLine("Koszt jednostkowy: " & dUnitCost)

Dim oxml As New System.Xml.XmlDocument()
Debug.WriteLine(oxml)

Debug.WriteLine("Nazwa produktu: " & sProdName, "Pole")
Debug.WriteLine("Liczba jednostek: " & iUnitQty, "Pole")
Debug.WriteLine("Koszt jednostkowy: " & dUnitCost, "Pole")
Debug.WriteLine("Całkowity koszt: " & iUnitQty * dUnitCost, "Obl")

Debug.WriteLineIf(iUnitQty > 50, "Ten komunikat SIĘ POJAWIA")
Debug.WriteLineIf(iUnitQty < 50, "Ten komunikat SIĘ NIE POJAWIA")

Debug.Assert(dUnitCost > 1, "Ten komunikat SIĘ NIE POJAWIA")
Debug.Assert(dUnitCost < 1, "Ten komunikat SIĘ POJAWIA")

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("Nazwa produktu: " & sProdName)
Debug.WriteLine("Liczba dostępnych jednostek: " & iUnitQty)
Debug.WriteLine("Koszt jednostkowy: " & dUnitCost)

Debug.Unindent()
Debug.WriteLine("Początek informacji klasy Debug o produkcie")

Debug.Flush()

Trace.WriteLine("Początek informacji klasy Trace o produkcie")

Trace.Indent()

Trace.WriteLine("Nazwa produktu: " & sProdName)
Trace.WriteLine("Nazwa produktu: " & sProdName, "Pole")
Trace.WriteLineIf(iUnitQty > 50, "Ten komunikat SIĘ POJAWIA")
Trace.Assert(dUnitCost > 1, "Ten komunikat SIĘ NIE POJAWIA")

Trace.Unindent()
Trace.WriteLine("Koniec informacji klasy Trace o produkcie")

Trace.Flush()

Console.ReadLine()

End Sub
End Module
powrót do początku

Rozwiązywanie problemów

  • Jeśli typem konfiguracji rozwiązania jest
    Release, dane wyjściowe klasy
    Debug
    są ignorowane.
  • Po utworzeniu klasy
    TextWriterTraceListener
    dla określonego miejsca docelowego obiekt
    TextWriterTraceListener
    odbiera dane wyjściowe z klas
    Trace
    i
    Debug. Dzieje się tak niezależnie od tego, czy użyje się metody
    Add
    klasy
    Trace
    czy klasy
    Debug
    w celu dodania obiektu
    TextWriterTraceListener
    do klasy
    Listeners.
  • Jeśli doda się obiekt
    Listener
    dla tego samego miejsca docelowego w klasie
    Trace
    i w klasie
    Debug, każdy wiersz danych wyjściowych będzie duplikowany, niezależnie od tego, czy dane wyjściowe generuje klasa
    Debug czy
    Trace.
    Dim tr1 As New TextWriterTraceListener(System.Console.Out)
    Debug.Listeners.Add(tr1)
    Dim tr2 As New TextWriterTraceListener(System.Console.Out)
    Trace.Listeners.Add(tr2)
powrót do początku

Materiały referencyjne

Aby uzyskać więcej informacji, zobacz następujące tematy w dokumentacji biblioteki klas architektury .NET Framework:
Aby uzyskać więcej informacji dotyczących śledzenia, zobacz następujące tematy w samouczkach Microsoft GotDotNet Quickstart:
powrót do początku




Właściwości

Identyfikator artykułu: 313417 — ostatni przegląd: 13.05.2007 — zmiana: 1

Opinia