Nawigowanie po kodzie przy użyciu debugera programu Visual Studio

Debuger programu Visual Studio może ułatwić przechodzenie przez kod w celu sprawdzenia stanu aplikacji i pokazania przepływu wykonywania, który jest również znany jako krok po kodzie. Możesz użyć skrótów klawiaturowych, poleceń debugowania, punktów przerwania i innych funkcji, aby szybko uzyskać dostęp do kodu, który chcesz zbadać. Dzięki zapoznaniu się z poleceniami i skrótami nawigacji debugera można znaleźć i rozwiązać problemy z aplikacjami szybciej i łatwiej. Aby uzyskać listę najczęściej używanych skrótów klawiaturowych związanych z nawigacją i debugowaniem kodu, zobacz sekcję Debugowanie w skrótach klawiaturowych.

Uwaga

Jeśli dopiero zaczynasz debugować kod, możesz przeczytać artykuł Debugowanie dla początkujących i technik debugowania oraz narzędzi przed przeczytaniem tego artykułu.

Rozpocznij debugowanie i wprowadź tryb przerwania

Niektóre polecenia nawigacji uruchamiają aplikację i automatycznie dołączają debuger. Aplikacja wstrzymuje się w określonym wierszu kodu na podstawie polecenia użytego do uruchomienia nawigacji, a następnie wprowadza tryb przerwania (czyli aplikacja jest wstrzymana w debugerze).

W trybie przerwania wykonywanie aplikacji jest zawieszone, gdy funkcje, zmienne i obiekty pozostają w pamięci. Gdy debuger jest w trybie przerwania, możesz przejść przez kod. Istnieją dwa bardzo typowe sposoby szybkiego wprowadzania trybu przerwania:

  • Ustaw punkt przerwania i uruchom aplikację.

  • Uruchom polecenie w określonej lokalizacji lub funkcji.

    Na przykład w edytorze kodu w programie Visual Studio możesz użyć polecenia Uruchom do kursora , aby uruchomić aplikację z dołączonym debugerem i wprowadzić tryb przerwania. Następnie możesz użyć poleceń kroków, aby nawigować po kodzie.

    Animation that shows selecting Run To Cursor and then F11.

    Animation that shows selecting Run To Cursor and then F11.

Polecenia kroku kodu mogą służyć do uruchamiania aplikacji, ale są częściej używane po wprowadzeniu trybu przerwania.

Niektóre polecenia nawigacji są najczęściej używane w trybie przerwania (czyli podczas wstrzymania w debugerze).

Tryb debugowania i przerwania

W trybie przerwania możesz użyć różnych poleceń do nawigowania po kodzie. Możesz sprawdzić wartości zmiennych, aby wyszukać naruszenia lub błędy. W przypadku niektórych typów projektów można również wprowadzić zmiany w aplikacji w trybie przerwania.

Większość okien debugera, takich jak moduły i okna Watch , jest dostępna tylko wtedy, gdy debuger jest dołączony do aplikacji. Niektóre funkcje debugera, takie jak wyświetlanie wartości zmiennych w oknie Ustawienia lokalne lub ocenianie wyrażeń w oknie Watch , są dostępne tylko wtedy, gdy debuger jest wstrzymany (czyli w trybie przerwania).

Uwaga

Jeśli podzielisz się na kod, który nie ma załadowanych plików źródłowych lub symboli (.pdb), debuger wyświetli stronę Nie znaleziono plików źródłowych lub Nie znaleziono symboli, która może pomóc w znalezieniu i załadowaniu plików. Zobacz Określanie symboli (.pdb) i plików źródłowych. Jeśli nie możesz załadować symbolu lub plików źródłowych, nadal możesz debugować instrukcje dotyczące zestawu w oknie Dezasemblacji .

Krok po kodzie

Krok kodu odnosi się do wykonywania kodu aplikacji po jednej instrukcji naraz z dołączonym debugerem. Polecenia kroku debugera ułatwiają obserwowanie efektów każdej instrukcji i dowiedz się więcej o przepływie wykonywania.

Przechodzenie do kodu

Aby zatrzymać się na każdej instrukcji podczas debugowania, użyj pozycji Debuguj>krok do lub wybierz klawisz F11.

Debuger przechodzi przez instrukcje kodu, a nie wiersze fizyczne. Na przykład klauzula może być napisana if w jednym wierszu:

int x = 42;
string s = "Not answered";
if( int x == 42) s = "Answered!";

Jednak po wejściu do tego wiersza debuger traktuje warunek jako jeden krok i konsekwencję jako inny. W poprzednim przykładzie warunek ma wartość true.

W wywołaniu zagnieżdżonej funkcji przejdź do kroków do najbardziej głęboko zagnieżdżonej funkcji. Jeśli na przykład użyjesz polecenia Step Into w wywołaniu, na przykład Func1(Func2()), debuger wykona kroki w funkcji Func2.

Napiwek

Podczas uruchamiania każdego wiersza kodu możesz umieścić kursor na zmiennych, aby wyświetlić ich wartości, lub użyć okien Locals and Watch , aby obserwować zmianę wartości. Możesz również wizualnie śledzić stos wywołań podczas przechodzenia do funkcji. (Tylko w przypadku programu Visual Studio Enterprise zobacz Mapowanie metod na stosie wywołań podczas debugowania.

Przechodzenie przez kod i pomijanie niektórych funkcji

Podczas debugowania możesz nie przejmować się funkcją. Możesz też wiedzieć, że kod działa, podobnie jak dobrze przetestowany kod biblioteki. Aby pominąć kod podczas wykonywania kroków kodu, możesz użyć następujących poleceń. Funkcje nadal działają, ale debuger pomija je.

Polecenie klawiatury Polecenie menu Debug (Debugowanie) opis
F10 Przechodzenie do kroku Jeśli bieżący wiersz zawiera wywołanie funkcji, funkcja Step Over uruchamia kod, a następnie zawiesza wykonywanie w pierwszym wierszu kodu po powrocie wywołanej funkcji.
Shift+F11 Wyjście Krok Wychodzący kontynuuje uruchamianie kodu i zawiesza wykonywanie po powrocie bieżącej funkcji. Debuger pomija bieżącą funkcję.

Uruchamianie do określonej lokalizacji lub funkcji

Możesz wolisz uruchomić bezpośrednio do określonej lokalizacji lub funkcji, gdy wiesz dokładnie, jaki kod chcesz sprawdzić lub jeśli wiesz, gdzie chcesz rozpocząć debugowanie.

  • Ustawienie punktu przerwania jest najlepsze, jeśli uważasz, że warto ponownie użyć punktu przerwania.
  • Inne metody są dla wygody i są podobne do ustawiania tymczasowego punktu przerwania.

Uruchamianie do punktu przerwania w kodzie

Aby ustawić prosty punkt przerwania w kodzie, wybierz lewy margines obok wiersza kodu, w którym chcesz wstrzymać wykonywanie. Możesz również wybrać wiersz, a następnie wybrać klawisz F9, wybrać polecenie Debuguj>przełącz punkt przerwania lub kliknąć prawym przyciskiem myszy i wybrać pozycję Punkt przerwania Wstaw punkt> przerwania. Punkt przerwania jest wyświetlany jako czerwona kropka na lewym marginesie obok wiersza kodu. Debuger zawiesza wykonywanie tuż przed uruchomieniem wiersza.

Screenshot that shows how to set a breakpoint.

Screenshot that shows how to set a breakpoint.

Punkty przerwania w programie Visual Studio zapewniają bogaty zestaw funkcji, takich jak warunkowe punkty przerwania i punkty śledzenia. Aby uzyskać szczegółowe informacje, zobacz Używanie punktów przerwania.

Uruchamianie do punktu przerwania funkcji

Debuger można ustawić tak, aby działał, dopóki nie osiągnie określonej funkcji. Możesz określić funkcję według nazwy lub wybrać ją ze stosu wywołań.

Aby określić punkt przerwania funkcji według nazwy:

  1. Wybierz pozycję Debuguj>nowy punkt przerwania funkcji punktu>przerwania.

  2. W oknie dialogowym Nowy punkt przerwania funkcji wprowadź nazwę funkcji i wybierz jej język:

    Screenshot that shows the New Function Breakpoint dialog.

    Screenshot that shows the New Function Breakpoint dialog.

  3. Wybierz przycisk OK.

Jeśli funkcja jest przeciążona lub w więcej niż jednej przestrzeni nazw, możesz wybrać odpowiednią funkcję w oknie Punkty przerwania:

Screenshot that shows breakpoints window.

Screenshot that shows breakpoints window.

Aby wybrać punkt przerwania funkcji ze stosu wywołań:

  1. Podczas debugowania otwórz okno Stos wywołań, wybierając pozycję Debuguj>stos wywołań systemu Windows.>

  2. W oknie Stos wywołań kliknij prawym przyciskiem myszy funkcję i wybierz polecenie Uruchom do kursora lub naciśnij klawisze Ctrl+F10.

Aby uzyskać informacje na temat wizualnego śledzenia stosu wywołań, zobacz Mapowanie metod na stosie wywołań podczas debugowania.

Uruchamianie do lokalizacji kursora

Aby uruchomić polecenie do lokalizacji kursora, w kodzie źródłowym lub w oknie stosu wywołań wybierz wiersz, który chcesz przerwać, a następnie kliknij prawym przyciskiem myszy i wybierz polecenie Uruchom do kursora lub naciśnij klawisze Ctrl+F10. Wybranie pozycji Uruchom do kursora jest podobne do ustawienia tymczasowego punktu przerwania.

Wymuszanie uruchomienia do lokalizacji kursora

Aby uruchomić polecenie do lokalizacji kursora, w kodzie źródłowym lub w oknie stosu wywołań wybierz wiersz, który chcesz przerwać, a następnie kliknij prawym przyciskiem myszy i wybierz polecenie Wymuś uruchomienie kursora. Wybranie pozycji Wymuś uruchomienie kursora spowoduje pominięcie wszelkich punktów przerwania i wyjątków pierwszej szansy, dopóki debuger nie osiągnie wiersza kodu, w którym znajduje się kursor.

Uruchom, aby kliknąć

Podczas wstrzymania debugera możesz umieścić wskaźnik myszy na instrukcji w kodzie źródłowym lub w oknie Dezasemblacji i wybrać opcję Uruchom wykonanie, aby znaleźć zieloną strzałkę. Używanie polecenia Uruchom do kliknięcia jest podobne do ustawiania tymczasowego punktu przerwania.

Screenshot that shows Run to Click and the green arrow.

Uwaga

Polecenie Run to Click jest dostępne od programu Visual Studio 2017.

Wymuś uruchomienie, aby kliknąć

Podczas wstrzymania debugera możesz umieścić wskaźnik myszy na instrukcji w kodzie źródłowym, naciskając klawisz Shift , a następnie wybrać pozycję Wymuś uruchomienie wykonania w tym miejscu (podwójna zielona strzałka). Po wybraniu tej opcji aplikacja dołącza debuger programu Visual Studio i wstrzymuje się w lokalizacji kursora. Wszystkie punkty przerwania i wyjątki pierwszej szansy znalezione podczas wykonywania są tymczasowo wyłączone.

Screenshot that shows Force Run to Click.

Uwaga

Wymuszanie uruchomienia do kliknięcia jest dostępne począwszy od programu Visual Studio 2022.

Ręczne podzielenie kodu

Aby podzielić się na następny dostępny wiersz kodu w uruchomionej aplikacji, wybierz pozycję Debuguj>wszystkie lub naciśnij klawisze Ctrl+Alt+Break.

Debugowanie kodu innego niż użytkownik

Domyślnie debuger próbuje debugować tylko kod aplikacji, włączając ustawienie o nazwie Tylko mój kod. Aby uzyskać szczegółowe informacje o sposobie działania tej funkcji dla różnych typów projektów i języków oraz o tym, jak można ją dostosować, zobacz Just My Code (Tylko mój kod).

Aby przyjrzeć się kodowi struktury, kodowi biblioteki innej firmy lub wywołaniom systemowym podczas debugowania, możesz wyłączyć opcję Tylko mój kod. W obszarze Narzędzia (lub Debugowanie) >Opcje>debugowania wyczyść pole wyboru Włącz tylko mój kod. Gdy pozycja Tylko mój kod jest wyłączona, kod nieużytkownika jest wyświetlany w oknach debugera, a debuger może przejść do kodu innego niż użytkownik.

Uwaga

Tylko mój kod nie jest obsługiwany w przypadku projektów urządzeń.

Debugowanie kodu systemu

Jeśli załadowano symbole debugowania dla kodu systemowego firmy Microsoft i wyłączono opcję Just My Code, możesz przejść do wywołania systemu tak samo jak dowolne inne wywołanie.

Począwszy od programu Visual Studio 2022 w wersji 17.7, można automatycznie kompilować kod .NET podczas przechodzenia do kodu zewnętrznego bez konieczności ręcznego ładowania symboli debugowania. Aby uzyskać więcej informacji, zobacz Generowanie kodu źródłowego na podstawie zestawów platformy .NET podczas debugowania.

Aby dowiedzieć się więcej o ładowaniu symboli firmy Microsoft, zobacz Konfigurowanie lokalizacji plików symboli i opcji ładowania.

Aby załadować symbole dla określonego składnika systemu:

  1. Podczas debugowania otwórz okno Moduły, wybierając pozycję Debuguj>moduły systemu Windows>lub naciskając klawisze Ctrl+Alt+U.

  2. W oknie Moduły można określić, które moduły mają symbole załadowane w kolumnie Stan symboli. Kliknij prawym przyciskiem myszy moduł, dla którego chcesz załadować symbole, a następnie wybierz pozycję Załaduj symbole.

Przechodzenie do właściwości i operatorów w kodzie zarządzanym

Debuger kroki dotyczące właściwości i operatorów w kodzie zarządzanym domyślnie. W większości przypadków to zachowanie zapewnia lepsze środowisko debugowania. Aby wyłączyć przechodzenie do właściwości lub operatorów, wybierz pozycję Opcje debugowania>. Na stronie Ogólne debugowania>wyczyść pole wyboru Przekrocznij właściwości i operatory (tylko zarządzane).

Przenieś wskaźnik, aby zmienić przepływ wykonywania

Możesz zmienić kolejną instrukcję, która zostanie uruchomiona, przenosząc żółty wskaźnik wykonywania. Tej funkcji można używać w trybie przerwania.

Jest to zaawansowana funkcja debugera. Aby uzyskać więcej informacji, zobacz Przenoszenie wskaźnika wykonywania.