Informacje dziennika w oknie Dane wyjściowe przy użyciu punktów śledzenia w programie Visual Studio

Punkty śledzenia umożliwiają rejestrowanie informacji w oknie Dane wyjściowe w konfigurowalnych warunkach bez modyfikowania ani zatrzymywania kodu. Ta funkcja jest obsługiwana zarówno w językach zarządzanych (C#, Visual Basic, F#), jak i w kodzie natywnym, a także w językach takich jak JavaScript i Python.

Uwaga

Aby uzyskać informacje na temat rejestrowania informacji w oknie Dane wyjściowe programowo przy użyciu interfejsów API platformy .NET, zobacz Wysyłanie komunikatów do okna Dane wyjściowe.

Weźmy przykład

Poniższy przykładowy program to prosta for pętla ze zmienną licznika, która zwiększa się o jeden za każdym razem, gdy pętla uruchamia inną iterację.

Screenshot of a sample counter program.

Poniższy przykładowy program to prosta for pętla ze zmienną licznika, która zwiększa się o jeden za każdym razem, gdy pętla uruchamia inną iterację.


using System.Diagnostics;

namespace Tracepoints
{
    public class Program
    {
        public static void Main(string[] args)
        {
            int counter = 0;
            for (int i=0; i<=10; i++)
            {
                counter +=1;
            }
        }
    }
}

Ustawianie punktów śledzenia w kodzie źródłowym

Punkty śledzenia można ustawić, określając ciąg wyjściowy w polu wyboru Akcja w oknie Ustawienia punktu przerwania.

  1. Aby zainicjować punkt śledzenia, najpierw kliknij rynnę po lewej stronie numeru wiersza, w którym chcesz ustawić punkt śledzenia.

    Screenshot showing the Breakpoint Initialization in the sample code.

  2. Umieść kursor na czerwonym okręgu, a następnie kliknij ikonę koła zębatego.

  3. Ta akcja powoduje otwarcie okna Ustawienia punktu przerwania.

    Screenshot showing Breakpoint Window.

  4. Zaznacz pole wyboru Akcja.

    Screenshot of breakpoint window with Actions Box checked.

    Zwróć uwagę, że czerwone kółko zmienia się na romb wskazujący, że punkt przerwania został przełączony z punktu przerwania na punkt śledzenia.

  5. Wprowadź komunikat, który chcesz zalogować do pola tekstowego Pokaż komunikat w oknie danych wyjściowych (aby uzyskać szczegółowe informacje, zobacz sekcje w dalszej części tego artykułu).

    Punkt śledzenia jest teraz ustawiony. Naciśnij przycisk "Zamknij", jeśli wszystko, co chcesz zrobić, to zarejestrować niektóre informacje w oknie danych wyjściowych.

  6. Jeśli chcesz dodać warunki określające, czy komunikat jest wyświetlany, zaznacz pole wyboru Warunki .

    Screenshot of breakpoint window with Conditions Box checked.

    Istnieją trzy opcje warunków: wyrażenie warunkowe, filtr i liczba trafień.

Punkty śledzenia można ustawić, określając ciąg wyjściowy w polu wyboru Akcja w oknie Ustawienia punktu przerwania.

  1. Aby zainicjować punkt śledzenia, najpierw kliknij rynnę po lewej stronie numeru wiersza, w którym chcesz ustawić punkt śledzenia.

    Screenshot showing the Breakpoint Initialization in the sample code.

  2. Umieść kursor na czerwonym okręgu i kliknij ikonę koła zębatego, aby otworzyć okno punktu przerwania Ustawienia.

    Screenshot showing Breakpoint Window.

  3. Zaznacz pole wyboru Akcja.

    Screenshot of breakpoint window with Actions Box checked.

    Zwróć uwagę, że czerwone kółko zmienia się na romb wskazujący, że punkt przerwania został przełączony z punktu przerwania na punkt śledzenia.

  4. Wprowadź komunikat, który chcesz zalogować do pola tekstowego Pokaż komunikat w oknie danych wyjściowych (aby uzyskać szczegółowe informacje, zobacz sekcje w dalszej części tego artykułu).

    Punkt śledzenia jest teraz ustawiony. Naciśnij przycisk "Zamknij", jeśli wszystko, co chcesz zrobić, to zarejestrować niektóre informacje w oknie danych wyjściowych.

  5. Jeśli chcesz dodać warunki określające, czy komunikat jest wyświetlany, zaznacz pole wyboru Warunki .

    Screenshot of breakpoint window with Conditions Box checked.

    Istnieją trzy opcje warunków: wyrażenie warunkowe, filtr i liczba trafień.

Menu Akcje

To menu umożliwia rejestrowanie komunikatu w oknie Dane wyjściowe. Wpisz ciągi, które mają zostać wyświetlone w polu komunikatu (bez cudzysłowów). Jeśli chcesz wyświetlić wartości zmiennych, upewnij się, że ujęto je w nawiasy klamrowe.

Jeśli na przykład chcesz wyświetlić wartość counter zmiennej w konsoli wyjściowej, wpisz {counter} w polu tekstowym wiadomości.

Screenshot showing Counter Output Message.

Jeśli klikniesz przycisk Zamknij , a następnie debugujesz program (F5), w oknie Dane wyjściowe zostaną wyświetlone następujące dane wyjściowe.

Screenshot showing Actions Message In Output Window.

Możesz również użyć specjalnych słów kluczowych, aby wyświetlić bardziej szczegółowe informacje. Wprowadź słowo kluczowe dokładnie tak, jak pokazano poniżej (użyj słowa kluczowego "$" przed każdym słowem kluczowym i wszystkimi limitami dla samego słowa kluczowego).

Słowo kluczowe Co to jest wyświetlane
$ADDRESS Bieżąca instrukcja
$CALLER Wywoływanie nazwy funkcji
$CALLSTACK Stos wywołań
$FUNCTION Bieżąca nazwa funkcji
$PID Process ID
$PNAME Nazwa procesu
$TID Identyfikator wątku
$TNAME Nazwa wątku
$TICK Liczba znaczników (z funkcji GetTickCount systemu Windows)

To menu umożliwia rejestrowanie komunikatu w oknie Dane wyjściowe. Wpisz ciągi, które mają zostać wyświetlone w polu komunikatu (bez cudzysłowów). Jeśli chcesz wyświetlić wartości zmiennych, upewnij się, że ujęto je w nawiasy klamrowe.

Jeśli na przykład chcesz wyświetlić wartość counter zmiennej w konsoli wyjściowej, wpisz {counter} w polu tekstowym komunikatu.

Screenshot showing Counter Output Message.

Jeśli klikniesz przycisk Zamknij , a następnie debugujesz program (F5), w oknie Dane wyjściowe zostaną wyświetlone następujące dane wyjściowe.

Screenshot showing Actions Message In Output Window.

Możesz również użyć specjalnych słów kluczowych, aby wyświetlić bardziej szczegółowe informacje. Wprowadź słowo kluczowe dokładnie tak, jak pokazano poniżej (użyj słowa kluczowego "$" przed każdym słowem kluczowym i wszystkimi limitami dla samego słowa kluczowego).

Słowo kluczowe Co to jest wyświetlane
$ADDRESS Bieżąca instrukcja
$CALLER Wywoływanie nazwy funkcji
$CALLSTACK Stos wywołań
$FUNCTION Bieżąca nazwa funkcji
$PID Process ID
$PNAME Nazwa procesu
$TID Identyfikator wątku
$TNAME Nazwa wątku
$TICK Liczba znaczników (z funkcji GetTickCount systemu Windows)

Menu Warunki

Warunki umożliwiają filtrowanie komunikatów wyjściowych, więc są one wyświetlane tylko w niektórych scenariuszach. Dostępne są trzy główne rodzaje warunków.

Wyrażenie warunkowe

W przypadku wyrażenia warunkowego komunikat wyjściowy jest wyświetlany tylko wtedy, gdy zostaną spełnione określone warunki.

W przypadku wyrażeń warunkowych można ustawić punkt śledzenia, aby wyświetlić komunikat, gdy określony warunek ma wartość true lub gdy uległ zmianie. Jeśli na przykład chcesz wyświetlić tylko wartość licznika podczas nawet iteracji for pętli, możesz wybrać opcję Jest prawdziwe , a następnie wpisać i%2 == 0 w polu tekstowym wiadomości.

Screenshot showing Conditional Expression Is True.

Jeśli chcesz wydrukować wartość licznika po zmianie iteracji for pętli, wybierz opcję Po zmianie i wpisz i w polu tekstowym wiadomości.

Screenshot showing when Conditional Expression is Changed.

Zachowanie opcji Po zmianie różni się w przypadku różnych języków programowania.

  • W przypadku kodu natywnego debuger nie uwzględnia pierwszej oceny warunku jako zmiany, więc nie osiąga punktu śledzenia w pierwszej ocenie.
  • W przypadku kodu zarządzanego debuger osiąga punkt śledzenia w pierwszej ocenie po wybraniu opcji Po zmianie .

Aby uzyskać bardziej kompleksowe omówienie prawidłowych wyrażeń, których można użyć podczas ustawiania warunków, zobacz Wyrażenia w debugerze.

W przypadku wyrażenia warunkowego komunikat wyjściowy jest wyświetlany tylko wtedy, gdy zostaną spełnione określone warunki.

W przypadku wyrażeń warunkowych można ustawić punkt śledzenia, aby wyświetlić komunikat, gdy określony warunek ma wartość true lub gdy uległ zmianie. Jeśli na przykład chcesz wyświetlić tylko wartość licznika podczas nawet iteracji for pętli, możesz wybrać opcję Jest prawdziwe , a następnie wpisać i%2 == 0 w polu tekstowym wiadomości.

Screenshot showing Conditional Expression Is True.

Jeśli chcesz wydrukować wartość licznika po zmianie iteracji for pętli, wybierz opcję Po zmianie i wpisz i w polu tekstowym wiadomości.

Screenshot showing when Conditional Expression is Changed.

Zachowanie opcji Po zmianie różni się w przypadku różnych języków programowania.

  • W przypadku kodu natywnego debuger nie uwzględnia pierwszej oceny warunku jako zmiany, więc nie osiąga punktu śledzenia w pierwszej ocenie.
  • W przypadku kodu zarządzanego debuger osiąga punkt śledzenia w pierwszej ocenie po wybraniu opcji Po zmianie .

Można również ustawić warunek, gdy punkt śledzenia można włączyć, wstawiając punkt przerwania do dowolnej konkretnej sekcji kodu i zaznaczając pole wyboru Włącz tylko po trafieniu następującego punktu przerwania: opcja w menu punkt przerwania Ustawienia. Z listy opcji można wybrać dowolny punkt przerwania.

Screenshot showing enable when a breakpoint is hit checked.

Aby uzyskać bardziej kompleksowe omówienie prawidłowych wyrażeń, których można użyć podczas ustawiania warunków, zobacz Wyrażenia w debugerze.

Liczba trafień

Warunek liczby trafień umożliwia wysyłanie danych wyjściowych tylko po wierszu kodu, w którym ustawiono punkt śledzenia, wykonał określoną liczbę razy.

W przypadku liczby trafień można wybrać opcję wyprowadzenia komunikatu, gdy wiersz kodu, w którym ustawiono punkt śledzenia, został wykonany określoną liczbę razy. Na podstawie wymagania może być równa lub jest wielokrotna lub jest większa lub równa określonej wartości liczby trafień. Wybierz opcję, która najlepiej odpowiada Twoim potrzebom, i wpisz wartość całkowitą w polu (na przykład 5), która reprezentuje iterację zainteresowania.

Screenshot showing Conditional Expression Hit Count.

Warunek liczby trafień umożliwia wysyłanie danych wyjściowych tylko po wierszu kodu, w którym ustawiono punkt śledzenia, wykonał określoną liczbę razy.

W przypadku liczby trafień można wybrać opcję wyprowadzenia komunikatu, gdy wiersz kodu, w którym ustawiono punkt śledzenia, został wykonany określoną liczbę razy. Na podstawie wymagania może być równa lub jest wielokrotna lub jest większa lub równa określonej wartości liczby trafień. Wybierz opcję, która najlepiej odpowiada Twoim potrzebom, i wpisz wartość całkowitą w polu (na przykład 5), która reprezentuje iterację zainteresowania.

Screenshot showing Conditional Expression Hit Count.

Punkt przerwania można również usunąć po pierwszym trafieniu, włączając pole wyboru Usuń punkt przerwania po trafieniu.

Screenshot showing Remove breakpoint on first hit.

Filtr

W przypadku warunku filtru określ, dla których urządzeń, procesów lub wątków są wyświetlane dane wyjściowe.

Screenshot showing Conditional Expression Filter.

Lista wyrażeń filtru:

  • MachineName = "name"
  • ProcessId = wartość
  • ProcessName = "name"
  • ThreadId = wartość
  • ThreadName = "name"

Ujmij ciągi (takie jak nazwy) w cudzysłowach podwójnych. Wartości można wprowadzać bez cudzysłowów. Klauzule można łączyć przy użyciu & nawiasów (AND), || (OR), ! (NOT) i nawiasów.

W przypadku warunku filtru określ, dla których urządzeń, procesów lub wątków są wyświetlane dane wyjściowe.

Screenshot showing Conditional Expression Filter.

Lista wyrażeń filtru:

  • MachineName = "name"
  • ProcessId = wartość
  • ProcessName = "name"
  • ThreadId = wartość
  • ThreadName = "name"

Ujmij ciągi (takie jak nazwy) w cudzysłowach podwójnych. Wartości można wprowadzać bez cudzysłowów. Klauzule można łączyć przy użyciu & nawiasów (AND), || (OR), ! (NOT) i nawiasów.

Kwestie wymagające rozważenia

Punkty śledzenia są przeznaczone do debugowania czystszego i bardziej płynnego środowiska. Istnieją pewne zagadnienia, o których należy pamiętać, jeśli chodzi o ich używanie.

Czasami podczas inspekcji właściwości lub atrybutu obiektu jego wartość może ulec zmianie. Jeśli wartość zmienia się podczas inspekcji, nie jest to usterka spowodowana samą funkcją punktu śledzenia. Jednak używanie punktów śledzenia do inspekcji obiektów nie pozwala uniknąć tych przypadkowych modyfikacji.

Sposób, w jaki wyrażenia są oceniane w polu komunikatu Akcja , może być inny niż język, którego obecnie używasz do programowania. Na przykład, aby wygenerować ciąg, nie musisz opakowywać komunikatu w cudzysłowie, nawet jeśli zwykle używasz polecenia Debug.WriteLine() lub console.log(). Ponadto składnia nawiasu klamrowego ({ }) do wyrażeń wyjściowych może być również inna niż konwencja wyprowadzania wartości w języku programowania. (Jednak zawartość w nawiasach klamrowych ({ }) powinna być nadal zapisywana przy użyciu składni języka deweloperskiego.

Jeśli próbujesz debugować aplikację na żywo i szukasz podobnej funkcji, zapoznaj się z naszą funkcją punktu dziennika w debugerze migawki. Debuger migawek to narzędzie służące do badania problemów w aplikacjach produkcyjnych. Punkty dziennika umożliwiają również wysyłanie komunikatów do okna danych wyjściowych bez konieczności modyfikowania kodu źródłowego i nie mają wpływu na uruchomioną aplikację. Aby uzyskać więcej informacji, zobacz Debugowanie aktywnej aplikacji platformy Azure.