Udostępnij za pośrednictwem


Używanie klas śledzenia i debugowania w programie Visual Basic .NET

Ten artykuł zawiera informacje o sposobie używania Debug klas i w programie Trace Visual Basic .NET.

Oryginalna wersja produktu: Visual Basic .NET
Oryginalny numer KB: 313417

Podsumowanie

W tym artykule pokazano, jak używać Debug klas i Trace . Te klasy są dostępne w .NET Framework firmy Microsoft. Za pomocą tych klas można podać informacje o wydajności aplikacji podczas opracowywania aplikacji lub po wdrożeniu w środowisku produkcyjnym. Te klasy są tylko jedną częścią funkcji instrumentacji, które są dostępne w .NET Framework.

Wymagania

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

  • System Windows
  • Visual Basic .NET

W tym artykule przyjęto również założenie, że znasz debugowanie programu.

Opis techniki

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

Po uruchomieniu programu można użyć metod klasy do tworzenia komunikatów Debug , które pomagają monitorować, wykrywać błędy lub dostarczać informacje o pomiarze wydajności. Domyślnie komunikaty generowane przez klasę Debug są wyświetlane w oknie Dane wyjściowe zintegrowanego środowiska deweloperskiego (IDE) programu Microsoft Visual Studio.

Przykładowy kod używa WriteLine metody do utworzenia komunikatu, po którym następuje terminator wiersza. W przypadku użycia tej metody do utworzenia komunikatu każdy komunikat jest wyświetlany 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 będzie miał wartość false. Komunikat zostanie również wyświetlony w modalnym oknie dialogowym dla użytkownika. Okno dialogowe zawiera komunikat, nazwę projektu i Debug.Assert numer instrukcji. Okno dialogowe zawiera również trzy przyciski poleceń:

  • Przerwij: aplikacja przestaje działać.
  • Ponów próbę: aplikacja przechodzi w tryb debugowania.
  • Ignoruj: aplikacja jest kontynuowana. Użytkownik musi kliknąć jeden z tych przycisków, aby aplikacja mogła kontynuować.

Można również kierować dane wyjściowe z Debug klasy do miejsc docelowych innych niż okno Dane wyjściowe. Klasa Debug ma kolekcję o nazwie Listeners zawierającą obiekty odbiornika. Każdy obiekt odbiornika monitoruje dane wyjściowe Debug i kieruje dane wyjściowe do określonego obiektu docelowego. Każdy odbiornik w Listeners kolekcji otrzymuje wszystkie dane wyjściowe wygenerowane przez klasę Debug . Użyj klasy , TextWriterTraceListener aby zdefiniować obiekty odbiornika. Można określić obiekt docelowy dla klasy za pośrednictwem TextWriterTraceListener jej konstruktora. Niektóre możliwe cele wyjściowe obejmują:

  • Okno Konsoli przy użyciu System.Console.Out właściwości .
  • Plik tekstowy przy użyciu System.IO.File.CreateText("FileName.txt")) instrukcji .

Po utworzeniu obiektu TextWriterTraceListener należy dodać obiekt do kolekcji, aby Debug.Listeners odbierać Debug dane wyjściowe.

Tworzenie przykładu za pomocą klasy Debug

  1. Użyj programu Visual Basic .NET, aby utworzyć nowy projekt aplikacji konsolowej o nazwie conInfo. Moduł publiczny o nazwie Module1 jest domyślnie dodawany do projektu.

  2. Aby zainicjować zmienne zawierające informacje o produkcie, dodaj następujące Dim instrukcje:

    Dim sProdName As String = "Widget"
    Dim iUnitQty As Integer = 100
    Dim dUnitCost As Decimal = 1.03
    
  3. Określ komunikat, który klasa generuje jako pierwszy parametr wejściowy WriteLine metody . Naciśnij kombinację klawiszy CTRL+ALT+O, aby upewnić się, że okno Dane wyjściowe jest widoczne.

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

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

    Debug.WriteLine("The product name is " & sProdName)
    Debug.WriteLine("The available units on hand are " & iUnitQty)
    Debug.WriteLine("The per unit cost is " & dUnitCost)
    
  6. Możesz również użyć metody , WriteLine aby wyświetlić przestrzeń nazw i nazwę klasy istniejącego obiektu. Na przykład poniższy kod wyświetla System.Xml.XmlDocument przestrzeń nazw w oknie Dane wyjściowe:

    Dim oxml As New System.Xml.XmlDocument()
    Debug.WriteLine(oxml)
    
  7. Aby zorganizować dane wyjściowe, można dołączyć kategorię jako opcjonalny, drugi parametr wejściowy WriteLine metody. Jeśli określisz kategorię, format komunikatu okna Dane wyjściowe to "category: message". Na przykład w pierwszym wierszu następującego kodu w oknie Dane wyjściowe jest wyświetlany komunikat "Pole: nazwa produktu to Widget":

    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, "Field")
    Debug.WriteLine("Total Cost is" & iUnitQty * dUnitCost, "Calc")
    
  8. Okno Dane wyjściowe może wyświetlać komunikaty tylko wtedy, gdy wyznaczony warunek ma wartość true przy użyciu WriteLineIf metody Debug klasy . Warunek, który ma zostać oceniony, jest pierwszym parametrem wejściowym WriteLineIf metody . Drugim parametrem parametru WriteLineIf jest komunikat, który jest wyświetlany 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")
    
  9. Użyj metody Debug Assert klasy, aby w oknie Dane wyjściowe był wyświetlany komunikat tylko wtedy, gdy określony warunek ma wartość false:

    Debug.Assert(dUnitCost > 1, "Message will NOT appear")
    Debug.Assert(dUnitCost < 1, "Message will appear")
    
  10. TextWriterTraceListener Utwórz obiekty dla okna Konsoli (tr1) i pliku tekstowego o nazwie Output.txt (tr2), a następnie dodaj każdy obiekt do DebugListeners kolekcji:

    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)
    
  11. Aby uzyskać czytelność, użyj Unindent metody , aby usunąć wcięcie dla kolejnych komunikatów generowanych przez klasę Debug . Gdy używasz Indent metod i Unindent razem, czytelnik może odróżnić dane wyjściowe jako grupę.

    Debug.Unindent()
    Debug.WriteLine("Debug Information-Product Ending")
    
  12. Aby upewnić się, że każdy obiekt odbiornika odbiera wszystkie swoje dane wyjściowe, wywołaj Flush metodę buforów Debug klasy:

    Debug.Flush()
    

Korzystanie z klasy Trace

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

  • WriteLine
  • WriteLineIf
  • Indent
  • Unindent
  • Assert
  • Flush

Klasy i Debug można używać Trace osobno lub razem w tej samej aplikacji. W projekcie debugowania konfiguracji rozwiązań zarówno dane wyjściowe, jak Trace i Debug wyjściowe są aktywne. Projekt generuje dane wyjściowe z obu tych klas do wszystkich obiektów odbiornika. Jednak projekt Release Solution Configuration generuje tylko dane wyjściowe z Trace klasy. Projekt Release Solution Configuration ignoruje wszelkie 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ę klawiszy CTRL+ALT+L, aby wyświetlić to okno.

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

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

  5. Nad folderem Konfiguracja na liście rozwijanej Konfiguracja kliknij pozycję Aktywne (debugowanie) lub Debuguj, a następnie kliknij przycisk OK.

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

  7. Naciśnij klawisz F5, aby uruchomić kod. Po wyświetleniu okna dialogowego Assertion Failed (Niepowodzenie asercji) kliknij pozycję Ignoruj.

  8. W oknie Konsola naciśnij klawisz ENTER. Program powinien zakończyć pracę, a w oknie Dane wyjściowe powinny zostać wyświetlone następujące dane wyjściowe:

    Debug Information-Product Starting
        The product name is Widget
        The available units on hand are 100
        The per unit cost is 1.03
        System.Xml.XmlDocument
        Field: The product name is Widget
        Field: The units on hand are 100
        Field: The per unit cost is 1.03
        Calc: Total cost is 103
        This message WILL appear
        ---- DEBUG ASSERTION FAILED ----
    ---- Assert Short Message ----
    Message will appear
    ---- Assert Long Message ----
    
    at Module1.Main() C:\Documents and Settings\Administrator\My
    Documents\Visual Studio Projects\conInfo\Module1.vb(29)
    
        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
    
  9. W oknie Konsola i pliku Output.txt powinny zostać wyświetlone 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)
        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
    

Ukończ listę kodu

Module Module1
    Sub Main()
        Dim sProdName As String = "Widget"
        Dim iUnitQty As Integer = 100
        Dim dUnitCost As Decimal = 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)
        Debug.WriteLine("The per unit cost is " & dUnitCost)

        Dim oxml As 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, "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")

        Dim tr1 As New TextWriter`Trace`Listener(System.Console.Out)
        Debug.Listeners.Add(tr1)

        Dim tr2 As 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()
    End Sub
End Module

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 otrzymuje TextWriterTraceListener dane wyjściowe z Trace klas i Debug . Dzieje się tak niezależnie od tego, czy używasz Add metody Trace klasy lub Debug do dodawania TextWriterTraceListenerListeners do klasy.

  • Jeśli dodasz obiekt odbiornika dla tego samego obiektu docelowego w Trace klasach iDebug, każdy wiersz danych wyjściowych zostanie zduplikowany, niezależnie od tego, czy Debug dane wyjściowe są generowane.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)
    

Informacje