Jesteś obecnie w trybie offline. Czekamy na ponowne połączenie z Internetem.

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

Ten artykuł został opublikowany wcześniej pod numerem PL313417
Streszczenie
W tym artykule pokazano, jak używać klasDebugiTrace. 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.

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.

Opis techniki

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

Gdy program jest uruchomiony, metod klasyDebugmoż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ęDebugpojawiają się w oknie Output interfejsu Visual Studio Integrated Development Environment (IDE).

W kodzie przykładowym używana jest metodaWriteLinedo 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ę metodyAssertklasyDebug, 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 instrukcjiDebug.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 klasyDebugmożna również skierować w inne miejsce docelowe niż okno Output. KlasaDebugobejmuje kolekcję o nazwieListeners, która zawiera obiektListener. Każdy obiektListenermonitoruje dane wyjściowe klasyDebugi kieruje je w określone miejsce docelowe. Każdy obiektListenerw kolekcjiListenersodbiera wszelkie dane wyjściowe wygenerowane przez klasęDebug. Do określenia obiektówListenerużyj klasyTextWriterTraceListener. Miejsce docelowe klasyTextWriterTraceListenermoż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ściSystem.Console.Out.
  • Plik tekstowy (.txt) w przypadku użycia instrukcjiSystem.IO.File.CreateText("NazwaPliku.txt")).
Aby odbierać dane wyjściowe klasy Debug, po utworzeniu obiektuTextWriterTraceListenernależy dodać ten obiekt do kolekcjiDebug.Listeners.

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 instrukcjeDim:
    Dim sProdName As String = "Widget"Dim iUnitQty As Integer = 100Dim dUnitCost As Decimal = 1.03
  4. Określ generowany przez klasę komunikat jako pierwszy parametr wejściowy metodyWriteLine. 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 metodyIndentw celu wcięcia kolejnych komunikatów w oknie Output:
    Debug.Indent()
  6. Aby wyświetlić zawartość wybranych zmiennych, użyj metodyWriteLine, jak następuje:
    Debug.WriteLine("Nazwa produktu: " & sProdName)Debug.WriteLine("Liczba dostępnych jednostek: " & iUnitQty)Debug.WriteLine("Koszt jednostkowy: " & dUnitCost)
  7. MetodyWriteLinemoż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 nazwSystem.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 metodyWriteLine. 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ć metodyWriteLineIfklasyDebug. Warunek, który ma być sprawdzony, jest pierwszym parametrem wejściowym metodyWriteLineIf. Drugim parametrem metodyWriteLineIfjest 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 metodyAssertklasyDebug, 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 obiektyTextWriterTraceListenerdla okna Console (tr1) i dla pliku tekstowego o nazwie Output.txt (tr2), a następnie dodaj każdy z tych obiektów do kolekcjiDebug 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 metodyUnindentw celu usunięcia wcięć kolejnych komunikatów generowanych przez klasęDebug. Jeśli użyjesz metodIndentiUnindentrazem, 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 obiektListenerodbiera wszystkie swoje dane wyjściowe, wywołaj metodęFlushdla buforów klasyDebug:
    Debug.Flush()

Korzystanie z klasy Trace

Do generowania komunikatów, które monitorują wykonywanie aplikacji, można również używać klasyTrace. KlasyTraceiDebugw większości do generowania danych wyjściowych używają wspólnych metod, takich jak:
  • WriteLine
  • WriteLineIf
  • Indent
  • Unindent
  • Assert
  • Flush
KlasTraceiDebugmożna używać osobno lub razem w tej samej aplikacji. W projekcie Debug Solution Configuration są aktywne zarówno dane wyjściowe klasyTrace, jak iDebug. Program generuje dane wyjściowe z obu tych klas i przekazuje je do wszystkich obiektówListener. Projekt Release Solution Configuration generuje dane wyjściowe tylko z klasyTrace. Projekt Release Solution Configuration ignoruje wszelkie wywołania metod klasyDebug.
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()

Testowanie kodu

  1. Upewnij się, że bieżącą konfiguracją rozwiązania jestDebug.
  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 trybDebugging.
  5. Powyżej folderu Configuration, na liście rozwijanejConfigurationkliknij pozycjęActive (Debug)lubDebug, a następnie kliknij przyciskOK.
  6. Naciśnij klawisze CTRL+ALT+O, aby wyświetlić okno Output.
  7. Naciśnij klawisz F5, aby uruchomić kod. Po pojawieniu się okna dialogowegoAssertion Failedkliknij przyciskIgnore.
  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.03Początek informacji klasy Debug o produkciePoczątek informacji klasy Trace o produkcie     Nazwa produktu: Widget    Pole: Nazwa produktu: Widget    Ten komunikat SIĘ POJAWIAKoniec 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.03Początek informacji klasy Debug o produkciePoczątek informacji klasy Trace o produkcie     Nazwa produktu: Widget    Pole: Nazwa produktu: Widget    Ten komunikat SIĘ POJAWIAKoniec informacji klasy Trace o produkcie

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 SubEnd Module

Rozwiązywanie problemów

  • Jeśli typem konfiguracji rozwiązania jestRelease, dane wyjściowe klasyDebugsą ignorowane.
  • Po utworzeniu klasyTextWriterTraceListenerdla określonego miejsca docelowego obiektTextWriterTraceListenerodbiera dane wyjściowe z klasTraceiDebug. Dzieje się tak niezależnie od tego, czy użyje się metodyAddklasyTraceczy klasyDebugw celu dodania obiektuTextWriterTraceListenerdo klasyListeners.
  • Jeśli doda się obiektListenerdla tego samego miejsca docelowego w klasieTracei w klasieDebug, każdy wiersz danych wyjściowych będzie duplikowany, niezależnie od tego, czy dane wyjściowe generuje klasaDebug czyTrace.
    Dim tr1 As New TextWriterTraceListener(System.Console.Out)Debug.Listeners.Add(tr1)Dim tr2 As New TextWriterTraceListener(System.Console.Out)Trace.Listeners.Add(tr2)
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:




Właściwości

Identyfikator artykułu: 313417 — ostatni przegląd: 05/13/2007 04:07:27 — zmiana: 1.3

Microsoft Visual Basic .NET 2002 Standard Edition

  • kbdebug kbhowto kbhowtomaster KB313417
Opinia