Użyj odpowiedniego typu punktu przerwania
W tym artykule pokazano, jak używać różnych typów punktów przerwania w programie Visual Studio w celu zwiększenia wydajności debugowania. Obejmuje ona różne scenariusze, w których można zastosować punkty przerwania, takie jak wstrzymanie wykonywania kodu, rejestrowanie informacji i śledzenie zmian w stanach zmiennych. W tym artykule wyjaśniono, jak ustawić warunkowe punkty przerwania, punkty śledzenia, punkty przerwania danych, zależne punkty przerwania i tymczasowe punkty przerwania. Zawiera również szczegółowe instrukcje dotyczące ustawiania punktów przerwania funkcji. Ten przewodnik jest niezbędny dla deweloperów, którzy chcą wykorzystać punkty przerwania do efektywnego debugowania w programie Visual Studio.
Jeśli nie znasz używania punktów przerwania w programie Visual Studio, zobacz Rozpoczynanie pracy z punktami przerwania przed przejściem do tego artykułu.
Aby uzyskać najlepsze doświadczenie w tej dokumentacji, wybierz preferowany język programowania lub środowisko uruchomieniowe z listy w górnej części artykułu.
Scenariuszy
W poniższej tabeli przedstawiono typowe scenariusze debugowania punktów przerwania i zalecany typ punktu przerwania dla scenariusza.
Scenariusz | Opis |
---|---|
Jak wstrzymać uruchamianie kodu w celu sprawdzenia wiersza kodu, który może zawierać usterkę? | Ustaw punkt przerwania. Aby uzyskać więcej informacji, zobacz Rozpocznij pracę z punktami przerwania. |
Czy moja zmienna ma nieoczekiwaną wartość? Czy też chcę sprawdzić moją aplikację, gdy osiągnie określony stan? | Spróbuj użyć warunkowego punktu przerwania, aby określić, gdzie i kiedy punkt przerwania zostanie aktywowany przy użyciu logiki warunkowej. Kliknij prawym przyciskiem myszy na punkt przerwania, aby dodać warunki. Ustaw warunek na wartość true, gdy zmienna jest równa nieoczekiwanej wartości. Aby uzyskać więcej informacji, zapoznaj się z warunkami punktu przerwania . |
Jak mogę rejestrować informacje w oknie Dane wyjściowe w konfigurowalnych warunkach bez modyfikowania lub zatrzymywania kodu? | Punkty śledzenia umożliwiają rejestrowanie informacji w oknie Wyjście zgodnie z konfigurowalnymi warunkami, bez konieczności modyfikowania lub zatrzymywania kodu. Aby uzyskać więcej informacji, zobacz Używanie punktów śledzenia w debugerze Visual Studio. |
Jak sprawdzić, kiedy zmienia się wartość zmiennej? | W przypadku języka C++ustaw punkt przerwania danych . W przypadku aplikacji korzystających z platformy .NET Core 3 lub nowszej można również ustawić punkt przerwania danych . W przeciwnym razie tylko w przypadku języka C# i F# można śledzić identyfikator obiektu przy użyciu warunkowego punktu przerwania. |
Jak mogę przerwać wykonywanie tylko wtedy, gdy zostanie osiągnięty inny punkt przerwania? | Ustaw zależny punkt przerwania, który przerywa wykonywanie tylko wtedy, gdy inny punkt przerwania zostanie najpierw osiągnięty. Aby uzyskać więcej informacji, zobacz Zależny Punkt Przerwania. |
Czy mogę trafić do punktu przerwania tylko raz? | Ustaw tymczasowy punkt przerwania, który umożliwia przerwanie kodu tylko raz. Aby uzyskać więcej informacji, zobacz Tymczasowy Punkt Przerwania. |
Czy mogę wstrzymać kod wewnątrz pętli w określonej iteracji? | Ustaw zależny punkt przerwania, który przerywa wykonywanie tylko wtedy, gdy inny punkt przerwania został wcześniej osiągnięty. Aby uzyskać więcej informacji, zobacz Liczba trafień. |
Czy mogę wstrzymać kod na początku funkcji, gdy znam nazwę funkcji, ale nie jej lokalizację? | Można to zrobić za pomocą punktu przerwania funkcji. Aby uzyskać więcej informacji, zobacz Ustawiaj punkty przerwania funkcji. |
Czy mogę wstrzymać kod na początku wielu funkcji o tej samej nazwie? | Jeśli masz wiele funkcji o tej samej nazwie (przeciążone funkcje lub funkcje w różnych projektach), możesz użyć punktu przerwania funkcji . |
Akcje punktu przerwania i punkty śledzenia
Punkt śledzenia to punkt przerwania, który wyświetla komunikat w oknie Dane wyjściowe. Punkt śledzenia może działać jak tymczasowa instrukcja śledzenia w języku programowania i nie wstrzymuje wykonywania kodu. Punkt śledzenia można utworzyć, ustawiając specjalną akcję w oknie Ustawienia punktu przerwania. Aby uzyskać szczegółowe instrukcje, zobacz Używanie punktów śledzenia w debugerze programu Visual Studio.
Warunki punktu przerwania
Możesz kontrolować, kiedy i gdzie jest wykonywany punkt przerwania, ustawiając warunki. Warunek może być dowolnym prawidłowym wyrażeniem rozpoznawany przez debuger. (Aby uzyskać więcej informacji na temat prawidłowych wyrażeń, zobacz Wyrażenia w debugerze.)
Aby ustawić warunek punktu przerwania:
Kliknij prawym przyciskiem myszy symbol punktu przerwania i wybierz pozycję Warunki (lub naciśnij + , C). Możesz też umieścić kursor nad symbolem punktu przerwania, wybrać ikonę Ustawienia , a następnie wybrać pozycję Warunki w oknie Ustawienia punktu przerwania.
Możesz również kliknąć prawym przyciskiem myszy lewy margines obok wiersza kodu i wybrać polecenie Wstaw warunkowy punkt przerwania z menu kontekstowego, aby ustawić nowy warunkowy punkt przerwania.
Warunki można również ustawić w oknie Punkty przerwania, klikając prawym przyciskiem myszy punkt przerwania i wybierając pozycję Ustawienia, a następnie wybierając pozycję Warunki
Na liście rozwijanej wybierz pozycję Wyrażenie warunkowe, Liczba trafień lub Filtr i ustaw odpowiednio wartość.
Wybierz pozycję Zamknij lub naciśnij +Enter, aby zamknąć okno Ustawienia punktu przerwania. Lub w oknie Punkty przerwania wybierz przycisk OK , aby zamknąć okno dialogowe.
Punkty przerwania z ustawionymi warunkami są wyświetlane z symbolem w kodzie źródłowym + i oknach punktów przerwania .
Tworzenie wyrażenia warunkowego
Po wybraniu opcji Wyrażenie warunkowe można wybrać między dwoma warunkami: Czy wartość true lub Po zmianie. Wybierz pozycję Prawda, aby przerwać, gdy wyrażenie jest spełnione, lub Gdy zmieniono wartość , aby przerwać, gdy wartość wyrażenia uległa zmianie.
W poniższym przykładzie punkt przerwania jest osiągany tylko wtedy, gdy wartość testInt
to 4:
W poniższym przykładzie punkt przerwania jest osiągany tylko wtedy, gdy wartość testInt
zmian:
Jeśli ustawisz warunek punktu przerwania z nieprawidłową składnią, zostanie wyświetlony komunikat ostrzegawczy. Jeśli określisz warunek punktu przerwania z prawidłową składnią, ale nieprawidłową semantyczną, zostanie wyświetlony komunikat ostrzegawczy przy pierwszym trafieniu punktu przerwania. W obu przypadkach debuger przerywa działanie po osiągnięciu nieprawidłowego punktu przerwania. Punkt przerwania jest pomijany tylko wtedy, gdy warunek jest prawidłowy i zwraca wartość .false
Uwaga
W przypadku pola Po zmianie debuger nie uwzględnia pierwszej oceny warunku jako zmiany, więc nie osiąga punktu przerwania w pierwszej ocenie.
Używanie identyfikatorów obiektów w wyrażeniach warunkowych (tylko C# i F#)
Czasami chcesz obserwować zachowanie określonego obiektu. Na przykład możesz sprawdzić, dlaczego obiekt został wstawiony do kolekcji więcej niż raz. W językach C# i F#można tworzyć identyfikatory obiektów dla określonych wystąpień typów odwołań i używać ich w warunkach punktu przerwania. Identyfikator obiektu jest generowany przez usługi debugowania środowiska uruchomieniowego języka wspólnego (CLR) i skojarzone z obiektem.
Aby utworzyć identyfikator obiektu:
Ustaw punkt przerwania w kodzie po utworzeniu obiektu.
Rozpocznij debugowanie, a po wstrzymaniu wykonywania w punkcie przerwania wybierz pozycję Debuguj>ustawienia lokalne systemu Windows>(lub naciśnij Ctrl + , L), aby otworzyć okno Ustawienia lokalne.
Znajdź określone wystąpienie obiektu w oknie Ustawienia lokalne , kliknij go prawym przyciskiem myszy i wybierz pozycję Ustaw identyfikator obiektu.
W oknie Ustawienia lokalne powinien zostać wyświetlony $ znak plus. Jest to identyfikator obiektu.
Dodaj nowy punkt przerwania w punkcie, który chcesz zbadać; na przykład gdy obiekt ma zostać dodany do kolekcji. Kliknij prawym przyciskiem myszy punkt przerwania i wybierz pozycję Warunki.
Użyj identyfikatora obiektu w polu Wyrażenie warunkowe. Jeśli na przykład zmienna
item
jest obiektem, który ma zostać dodany do kolekcji, wybierz pozycję Jest prawdziwe i wpisz element == $<n>, gdzie <n> jest numerem identyfikatora obiektu.Wykonanie spowoduje przerwanie w momencie dodania tego obiektu do kolekcji.
Aby usunąć identyfikator obiektu, kliknij prawym przyciskiem myszy zmienną w oknie Ustawienia lokalne i wybierz polecenie Usuń identyfikator obiektu.
Uwaga
Identyfikatory obiektów tworzą słabe odwołania i nie uniemożliwiają zbierania pamięci obiektu. Są one prawidłowe tylko dla bieżącej sesji debugowania.
Ustawianie warunku liczby trafień
Jeśli podejrzewasz, że pętla w kodzie zaczyna działać nieprawidłowo po określonej liczbie iteracji, możesz ustawić punkt przerwania, aby zatrzymać wykonywanie po tej liczbie trafień, zamiast wielokrotnie naciskać F5 , aby osiągnąć iterację.
W obszarze Warunki w oknie Ustawienia punktu przerwania wybierz pozycję Liczba trafień, a następnie określ liczbę iteracji. W poniższym przykładzie punkt przerwania jest ustawiony tak, aby został trafiony na każdą inną iterację:
Ustawianie warunku filtru
Punkt przerwania można ograniczyć do wyzwalania tylko na określonych urządzeniach lub w określonych procesach i wątkach.
W obszarze Warunki w oknie Ustawienia punktu przerwania wybierz pozycję Filtr, a następnie wprowadź co najmniej jedno z następujących wyrażeń:
- MachineName = "name"
- ProcessId = wartość
- ProcessName = "name"
- ThreadId = wartość
- ThreadName = "name"
Ujmij wartości ciągu w cudzysłowie podwójnym. Klauzule można łączyć przy użyciu &
(AND), ||
(OR), !
(NOT) i nawiasów.
Ustawianie punktów przerwania funkcji
Wykonywanie można przerwać po wywołaniu funkcji. Jest to przydatne, na przykład, gdy znasz nazwę funkcji, ale nie jej lokalizację. Jest to również przydatne, jeśli masz funkcje o tej samej nazwie i chcesz przerwać na nich wszystkie (takie jak przeciążone funkcje lub funkcje w różnych projektach).
Aby ustawić punkt przerwania funkcji:
Wybierz pozycję >lub naciśnij Ctrl + K, B.
Możesz również wybrać pozycję Nowy>punkt przerwania funkcji w oknie Punkty przerwania.
W oknie dialogowym Nowy punkt przerwania funkcji wprowadź nazwę funkcji w polu Nazwa funkcji.
Aby zawęzić specyfikację funkcji:
Użyj w pełni kwalifikowanej nazwy funkcji.
Przykład:
Namespace1.ClassX.MethodA()
Dodaj typy parametrów przeciążonej funkcji.
Przykład:
MethodA(int, string)
Użyj symbolu "!", aby określić moduł.
Przykład:
App1.dll!MethodA
Użyj operatora kontekstu w natywnym języku C++.
{function, , [module]} [+<line offset from start of method>]
Przykład:
{MethodA, , App1.dll}+2
Na liście rozwijanej Język wybierz język funkcji.
Wybierz przycisk OK.
Ustawianie punktu przerwania funkcji przy użyciu adresu pamięci (tylko natywny język C++)
Możesz użyć adresu obiektu, aby ustawić punkt przerwania funkcji w metodzie wywoływanej przez określone wystąpienie klasy. Na przykład, biorąc pod uwagę adresowalny obiekt typu my_class
, można ustawić punkt przerwania funkcji w metodzie my_method
, która wywołuje wystąpienie.
Ustaw punkt przerwania gdzieś po utworzeniu wystąpienia klasy.
Znajdź adres wystąpienia (na przykład
0xcccccccc
).Wybierz pozycję >lub naciśnij Ctrl + K, B.
Dodaj następujący kod do pola Nazwa funkcji, a następnie wybierz pozycję Język C++ .
((my_class *) 0xcccccccc)->my_method
Ustawianie punktów przerwania danych (.NET Core 3.x lub .NET 5+)
Punkty przerwania danych przerywają wykonywanie po zmianie właściwości określonego obiektu.
Aby ustawić punkt przerwania danych:
W projekcie .NET Core lub .NET 5+ rozpocznij debugowanie i poczekaj na osiągnięcie punktu przerwania.
W oknie Autos, Watch lub Locals (Ustawienia automatyczne) kliknij prawym przyciskiem myszy właściwość i wybierz polecenie Break when value changes in the context menu (Przerwij po zmianie wartości w menu kontekstowym).
Punkty przerwania danych dla platform .NET Core i .NET 5+ nie będą działać dla:
- Właściwości, które nie można rozwinąć w etykietce narzędzia, ustawieniach lokalnych, autos lub oknie Czujka
- Zmienne statyczne
- Klasy z atrybutem DebuggerTypeProxy
- Pola wewnątrz struktur
Aby uzyskać maksymalną liczbę, którą można ustawić, zobacz Limity sprzętu punktu przerwania danych.
Ustawianie punktów przerwania danych (tylko natywny język C++)
Punkty przerwania danych przerywają wykonywanie, gdy zmienia się wartość przechowywana na określonym adresie pamięci. Jeśli wartość jest odczytywana, ale nie zmieniana, wykonanie nie powoduje przerwania.
Aby ustawić punkt przerwania danych:
W projekcie języka C++ rozpocznij debugowanie i poczekaj na osiągnięcie punktu przerwania. W menu Debugowanie wybierz pozycję >.
Możesz również wybrać pozycję Nowy>punkt przerwania danych w oknie Punkty przerwania lub kliknąć prawym przyciskiem myszy element w oknie Autos, Watch lub Locals i wybrać polecenie Break when value changes in the context menu (Autos, Watch, or Locals) i wybrać polecenie Break when value changes in the context menu (Podział po zmianie wartości w menu kontekstowym).
W polu Adres wpisz adres pamięci lub wyrażenie, które daje w wyniku adres pamięci. Na przykład wpisz
&avar
, aby przerwać, gdy zawartość zmiennejavar
ulegnie zmianie.Na liście rozwijanej Liczba bajtów wybierz liczbę bajtów, które mają być obserwowane przez debuger. Jeśli na przykład wybierzesz wartość 4, debuger będzie obserwować cztery bajty rozpoczynające się od
&avar
i przerywać, jeśli którakolwiek z tych bajtów zmieni wartość.
Punkty przerwania danych nie działają w następujących warunkach:
- Proces, który nie jest debugowany, zapisuje w lokalizacji pamięci.
- Lokalizacja pamięci jest współdzielona między co najmniej dwoma procesami.
- Lokalizacja pamięci jest aktualizowana w jądrze. Jeśli na przykład pamięć zostanie przekazana do 32-bitowej funkcji systemu Windows
ReadFile
, pamięć zostanie zaktualizowana z trybu jądra, więc debuger nie zostanie przerwany w aktualizacji. - Gdzie wyrażenie zegarka jest większe niż 4 bajty na sprzęcie 32-bitowym i 8 bajtów na sprzęcie 64-bitowym. Jest to ograniczenie architektury x86.
Uwaga
Punkty przerwania danych zależą od określonych adresów pamięci. Adres zmiennej zmienia się z jednej sesji debugowania na następną, więc punkty przerwania danych są automatycznie wyłączone na końcu każdej sesji debugowania.
Jeśli ustawisz punkt przerwania danych w zmiennej lokalnej, punkt przerwania pozostanie włączony po zakończeniu funkcji, ale adres pamięci nie ma już zastosowania, więc zachowanie punktu przerwania jest nieprzewidywalne. Jeśli ustawisz punkt przerwania danych w zmiennej lokalnej, należy usunąć lub wyłączyć punkt przerwania przed zakończeniem funkcji.
Limity sprzętowe punktu przerwania danych
Jądro systemu Windows i podstawowy sprzęt mają następujące limity podczas ustawiania punktów przerwania danych. Limit odnosi się do maksymalnej liczby punktów przerwania danych, które można ustawić.
Architektura procesora | Limit punktu przerwania danych |
---|---|
x64 i x86 | 100 |
ARM64 | 2 |
ARM | 1 |
Ustawianie zależnego punktu przerwania
Zależne punkty przerwania przerywają wykonywanie tylko wtedy, gdy pierwszy punkt przerwania zostanie osiągnięty. Dlatego w złożonym scenariuszu, takim jak debugowanie aplikacji wielowątkowej, można skonfigurować dodatkowe punkty przerwania po pierwszym trafieniu kolejnego punktu przerwania. Może to znacznie ułatwić debugowanie kodu w typowych ścieżkach, takich jak pętla gry lub interfejs API narzędzia, ponieważ punkt przerwania w tych funkcjach można skonfigurować tak, aby był włączany tylko wtedy, gdy funkcja jest wywoływana z określonej części aplikacji.
Aby ustawić zależny punkt przerwania:
Umieść kursor na symbolu punktu przerwania, wybierz ikonę Ustawienia , a następnie wybierz pozycję Włącz tylko po naciśnięciu następującego punktu przerwania w oknie Ustawienia punktu przerwania.
Z listy rozwijanej wybierz punkt przerwania wymagań wstępnych, od którego ma zależeć bieżący punkt przerwania.
Wybierz pozycję Zamknij lub naciśnij Ctrl+Enter , aby zamknąć okno Ustawienia punktu przerwania. Ewentualnie w oknie Punkty przerwania wybierz przycisk OK , aby zamknąć okno dialogowe.
Możesz również użyć menu kontekstowego kliknij prawym przyciskiem myszy, aby ustawić zależny punkt przerwania.
Kliknij prawym przyciskiem myszy lewy margines obok wiersza kodu i wybierz pozycję Wstaw zależny punkt przerwania z menu kontekstowego.
- Zależne punkty przerwania nie działają, jeśli w aplikacji istnieje tylko jeden punkt przerwania.
- Zależne punkty przerwania są konwertowane na normalny punkt przerwania wiersza, jeśli zostanie usunięty wstępnie wymagany punkt przerwania.
Ustawianie tymczasowego punktu przerwania
Ten punkt przerwania umożliwia przerwanie kodu tylko raz. Podczas debugowania debuger programu Visual Studio wstrzymuje uruchomioną aplikację tylko raz dla tego punktu przerwania, a następnie usuwa go natychmiast po jego trafieniu.
Aby ustawić tymczasowy punkt przerwania:
Umieść kursor na symbolu punktu przerwania, wybierz ikonę Ustawienia , a następnie wybierz pozycję Usuń punkt przerwania po trafieniu w oknie Ustawienia punktu przerwania.
Wybierz pozycję Zamknij lub naciśnij Ctrl+Enter , aby zamknąć okno Ustawienia punktu przerwania. Ewentualnie w oknie Punkty przerwania wybierz przycisk OK , aby zamknąć okno dialogowe.
Możesz również użyć menu kontekstowego kliknij prawym przyciskiem myszy, aby ustawić tymczasowy punkt przerwania.
Kliknij prawym przyciskiem myszy lewy margines obok wiersza kodu i wybierz polecenie Wstaw tymczasowy punkt przerwania z menu kontekstowego.
Możesz też po prostu użyć skrótu F9 + Shift + Alt, T i ustawić tymczasowy punkt przerwania w żądanym wierszu.