Przewodnik: debugowanie wielowątkowej aplikacji przy użyciu okna Wątki (C#, Visual Basic, C++)

Kilka elementów interfejsu użytkownika programu Visual Studio ułatwia debugowanie wielowątków aplikacji. W tym artykule przedstawiono funkcje debugowania wielowątkowego w oknie edytora kodu, pasek narzędzi Lokalizacja debugowania i okno Wątki . Aby uzyskać informacje o innych narzędziach do debugowania aplikacji wielowątkowych, zobacz Wprowadzenie do debugowania aplikacji wielowątkowych.

Ukończenie tego samouczka zajmuje zaledwie kilka minut i zapoznaje się z podstawami debugowania aplikacji wielowątkowych.

Tworzenie wielowątkowego projektu aplikacji

Utwórz następujący wielowątkowy projekt aplikacji do użycia w tym samouczku:

  1. Otwórz program Visual Studio i utwórz nowy projekt.

    Jeśli okno uruchamiania nie jest otwarte, wybierz pozycję Okno uruchamiania pliku>.

    W oknie startowym wybierz pozycję Nowy projekt.

    W oknie uruchamiania wybierz pozycję Utwórz nowy projekt.

    W oknie Tworzenie nowego projektu wprowadź lub wpisz konsolę w polu wyszukiwania. Następnie wybierz pozycję C# lub C++ z listy Język, a następnie wybierz pozycję Windows z listy Platforma.

    Po zastosowaniu filtrów języka i platformy wybierz pozycję Aplikacja konsolowa dla platformy .NET Core, .NET 5 lub C++, a następnie wybierz przycisk Dalej.

    Uwaga

    Jeśli nie widzisz poprawnego szablonu, przejdź do pozycji Narzędzia Pobierz narzędzia>i funkcje..., co spowoduje otwarcie Instalator programu Visual Studio. Wybierz pakiet roboczy Programowanie aplikacji klasycznych .NET lub Programowanie aplikacji klasycznych przy użyciu języka C++, a następnie wybierz pozycję Modyfikuj.

    W oknie Konfigurowanie nowego projektu wpisz nazwę lub użyj nazwy domyślnej w polu Nazwa projektu. Następnie wybierz pozycję Dalej lub Utwórz, niezależnie od dostępnej opcji.

    W przypadku platformy .NET Core lub .NET 5+wybierz zalecaną platformę docelową lub platformę .NET 8, a następnie wybierz pozycję Utwórz.

    Zostanie wyświetlony nowy projekt konsoli. Po utworzeniu projektu zostanie wyświetlony plik źródłowy. W zależności od wybranego języka plik źródłowy może mieć nazwę Program.cs lub MyThreadWalkthroughApp.cpp.

  2. Zastąp kod w pliku źródłowym przykładowym kodem C# lub C++ z sekcji Wprowadzenie do debugowania wielowątków aplikacji.

  3. Wybierz pozycję Plik>Zapisz wszystko.

Rozpocznij debugowanie

  1. Znajdź następujące wiersze w kodzie źródłowym:

    Thread.Sleep(3000);
    Console.WriteLine();
    
  2. Ustaw punkt przerwania w Console.WriteLine(); wierszu, klikając lewą rynnę lub wybierając wiersz i naciskając klawisz F9.

    Punkt przerwania jest wyświetlany jako czerwony okrąg w lewym rynnie obok wiersza kodu.

  3. Wybierz pozycję Debuguj>Rozpocznij debugowanie lub naciśnij klawisz F5.

    Aplikacja jest uruchamiana w trybie debugowania i wstrzymuje się w punkcie przerwania.

  4. W trybie przerwania otwórz okno Wątki, wybierając pozycję Debuguj>wątki systemu Windows.> Musisz być w sesji debugowania, aby otworzyć lub wyświetlić wątki i inne okna debugowania.

Sprawdzanie znaczników wątku

  1. W kodzie źródłowym Console.WriteLine(); znajdź wiersz.

    1. Kliknij prawym przyciskiem myszy w oknie Wątki i wybierz polecenie Pokaż wątki w źródleShow Threads in Source z menu.

    Rynna obok wiersza kodu źródłowego wyświetla teraz ikonę Thread Markerznacznika wątku . Znacznik wątku wskazuje, że w tej lokalizacji zatrzymano wątek. Jeśli w lokalizacji znajduje się więcej niż jeden wątek zatrzymany, zostanie wyświetlona ikona multiple threads .

  2. Umieść wskaźnik na znaczniku wątku. Zostanie wyświetlona etykietka danych przedstawiająca nazwę i numer identyfikatora wątku dla zatrzymanego wątku lub wątków. Nazwy wątków mogą mieć wartość <No Name>.

    Napiwek

    Aby ułatwić identyfikowanie wątków bez nazw, możesz zmienić ich nazwy w oknie Wątki . Kliknij prawym przyciskiem myszy wątek i wybierz polecenie Zmień nazwę.

  3. Kliknij prawym przyciskiem myszy znacznik wątku w kodzie źródłowym, aby wyświetlić dostępne opcje w menu skrótów.

Oflagowanie i usuwanie oflagowania wątków

Możesz flagować wątki, aby śledzić wątki, do których chcesz zwrócić szczególną uwagę.

Flaguj i usuń opóźnienie wątków z edytora kodu źródłowego lub z okna Wątki . Wybierz, czy mają być wyświetlane tylko oflagowane wątki, czy wszystkie wątki, na paskach narzędzi okna Lokalizacja debugowania lub Wątki . Wybory dokonane z dowolnej lokalizacji mają wpływ na wszystkie lokalizacje.

Flaguj i usuń opóźnienie wątków w kodzie źródłowym

  1. Otwórz pasek narzędzi Lokalizacja debugowania, wybierając pozycję Wyświetl>paski narzędzi>Debuguj lokalizację. Możesz również kliknąć prawym przyciskiem myszy obszar paska narzędzi i wybrać pozycję Lokalizacja debugowania.

  2. Pasek narzędzi Lokalizacja debugowania zawiera trzy pola: Proces, Wątek i Ramka stosu. Listę wątków można wyświetlić i zanotować liczbę wątków. Na liście Wątki aktualnie wykonywany wątek jest oznaczony symbolem>.

  3. W oknie kodu źródłowego umieść kursor nad ikoną znacznika wątku w rynnie i wybierz ikonę flagi (lub jedną z pustych ikon flagi) w etykietce danych. Ikona flagi zmieni kolor na czerwony.

    Możesz również kliknąć prawym przyciskiem myszy ikonę znacznika wątku, wskazać pozycję Flaga, a następnie wybrać wątek do flagi z menu skrótów.

  4. Na pasku narzędzi Lokalizacja debugowania wybierz ikonę Show Flagged ThreadsPokaż tylko oflagowane wątki z prawej strony pola Wątki. Ikona jest wyszarana, chyba że co najmniej jeden wątek jest oflagowany.

    Tylko oflagowany wątek jest teraz wyświetlany na liście rozwijanej Wątki na pasku narzędzi. Aby ponownie wyświetlić wszystkie wątki, ponownie wybierz ikonę Pokaż tylko oflagowane wątki .

    Napiwek

    Po oflagowanych niektórych wątkach możesz umieścić kursor w edytorze kodu, kliknąć prawym przyciskiem myszy i wybrać polecenie Uruchom oflagowane wątki na kursor. Upewnij się, że wybrano kod, z którym będą dostępne wszystkie oflagowane wątki. Uruchamianie oflagowanych wątków do kursora spowoduje wstrzymanie wątków w wybranym wierszu kodu, co ułatwia sterowanie kolejnością wykonywania przez zamrażanie i odmrażanie wątków.

  5. Aby przełączyć stan oflagowanych lub nieoznakowanych aktualnie wykonywanych wątków, wybierz przycisk paska narzędzi Bieżący wątek Oflagowany bieżący wątek z lewej strony przycisku Pokaż tylko oflagowane wątki . Flagowanie bieżącego wątku jest przydatne do lokalizowania bieżącego wątku, gdy wyświetlane są tylko oflagowane wątki.

  6. Aby cofnąć opóźnienie wątku, umieść kursor nad znacznikiem wątku w kodzie źródłowym i wybierz ikonę czerwonej flagi, aby ją wyczyścić, lub kliknij prawym przyciskiem myszy znacznik wątku i wybierz polecenie Usuń opóźnienie.

Flaga i usuwanie opóźnień wątków w oknie Wątki

W oknie Wątki oflagowane wątki mają obok nich ikony czerwonej flagi, podczas gdy niefłoszone wątki, jeśli są wyświetlane, mają puste ikony konspektu.

Threads Window

Wybierz ikonę flagi, aby zmienić stan wątku na oflagowany lub unflagged w zależności od bieżącego stanu.

Możesz również kliknąć prawym przyciskiem myszy wiersz i wybrać pozycję Flaga, Usuń opóźnienie lub Usuń opóźnienie wszystkich wątków z menu skrótów.

Pasek narzędzi okna Wątki ma również przycisk Pokaż oflagowane wątki tylko, który jest po prawej stronie jedną z dwóch ikon flagi. Działa tak samo jak przycisk na pasku narzędzi Lokalizacja debugowania, a przycisk kontroluje wyświetlanie w obu lokalizacjach.

Inne funkcje okna wątków

W oknie Wątki wybierz nagłówek dowolnej kolumny, aby posortować wątki według tej kolumny. Wybierz ponownie, aby odwrócić kolejność sortowania. Jeśli wszystkie wątki są wyświetlane, wybranie kolumny ikony flagi sortuje wątki według stanu oflagowanych lub nieoznakowanych.

Druga kolumna okna Wątki (bez nagłówka) to kolumna Bieżący wątek . Żółta strzałka w tej kolumnie oznacza bieżący punkt wykonywania.

Kolumna Lokalizacja pokazuje, gdzie każdy wątek pojawia się w kodzie źródłowym. Wybierz strzałkę rozwijania obok pozycji Lokalizacja lub umieść kursor nad wpisem, aby wyświetlić częściowy stos wywołań dla tego wątku.

Napiwek

Aby uzyskać graficzny widok stosów wywołań dla wątków, użyj okna Stosy równoległe . Aby otworzyć okno, podczas debugowania wybierz pozycję Debuguj>stosy równoległe systemu Windows.>

Oprócz opcji Flaga, Coflaguj i Coflaguj wszystkie wątki, menu kontekstowe kliknij prawym przyciskiem myszy dla elementów okna wątku:

  • Przycisk Pokaż wątki w źródle .
  • Wyświetlacz szesnastkowy, który zmienia identyfikatorwątku w oknie Wątki z formatu dziesiętnego na szesnastkowy.
  • Przełącz na wątek, który natychmiast przełącza wykonywanie do tego wątku.
  • Zmień nazwę, co umożliwia zmianę nazwy wątku.
  • Blokowanie i odmrażanie poleceń.

Blokowanie i rozmrażanie wykonania wątku

Można zablokować i rozmrozić lub zawiesić i wznowić, wątki, aby kontrolować kolejność, w której wątki wykonują pracę. Mroźne i rozmrażające wątki mogą pomóc w rozwiązaniu problemów ze współbieżnością, takich jak zakleszczenia i warunki wyścigu.

Napiwek

Aby postępować zgodnie z pojedynczym wątkiem bez zamrażania innych wątków, co jest również typowym scenariuszem debugowania, zobacz Wprowadzenie do debugowania wielowątków aplikacji.

Aby zablokować i odblokować wątki:

  1. W oknie Wątki kliknij prawym przyciskiem myszy dowolny wątek, a następnie wybierz pozycję Zablokuj. Ikona Wstrzymanie w kolumnie Bieżący wątek wskazuje, że wątek jest zamrożony.

  2. Wybierz pozycję Kolumny na pasku narzędzi okna Wątki, a następnie wybierz pozycję Wstrzymana liczba, aby wyświetlić kolumnę Wstrzymana liczba. Wstrzymana wartość licznika dla zamrożonego wątku wynosi 1.

  3. Kliknij prawym przyciskiem myszy zamrożony wątek i wybierz polecenie Thaw.

    Ikona Wstrzymanie zniknie, a wartość Wstrzymana liczba zmieni się na 0.

Przełącz do innego wątku

Gdy próbujesz przełączyć się do innego wątku, aplikacja jest w oknie trybu przerwania. To okno informuje, że wątek nie ma żadnego kodu, który może wyświetlić bieżący debuger. Na przykład możesz debugować kod zarządzany, ale wątek jest kodem natywnym. Okno zawiera sugestie dotyczące rozwiązania problemu.

Aby przełączyć się do innego wątku:

  1. W oknie Wątki zanotuj bieżący identyfikator wątku, który jest wątkiem z żółtą strzałką w kolumnie Bieżący wątek. Aby kontynuować aplikację, wróć do tego wątku.

  2. Kliknij prawym przyciskiem myszy inny wątek i wybierz polecenie Przełącz do wątku z menu kontekstowego.

  3. Zwróć uwagę, że żółta lokalizacja strzałki zmieniła się w oknie Wątki . Oryginalny znacznik bieżącego wątku również pozostaje jako konspekt.

    Przyjrzyj się etykietce narzędzia na znaczniku wątku w edytorze źródła kodu i na liście rozwijanej Wątki na pasku narzędzi Lokalizacja debugowania . Zwróć uwagę, że bieżący wątek również uległ zmianie.

  4. Na pasku narzędzi Lokalizacja debugowania wybierz inny wątek z listy Wątki. Należy pamiętać, że bieżący wątek zmienia się również w dwóch pozostałych lokalizacjach.

  5. W edytorze kodu źródłowego kliknij prawym przyciskiem myszy znacznik wątku, wskaż polecenie Przełącz do wątku i wybierz inny wątek z listy. Zwróć uwagę, że bieżący wątek zmienia się we wszystkich trzech lokalizacjach.

Znacznik wątku w kodzie źródłowym umożliwia przełączenie tylko do wątków zatrzymanych w tej lokalizacji. Za pomocą okna Wątki i paska narzędzi Lokalizacja debugowania można przełączyć się na dowolny wątek.

Znasz już podstawy debugowania aplikacji wielowątkowych. Możesz obserwować, flagować i usuwać opóźnienie oraz blokować i rozmrażać wątki za pomocą okna Wątki, listy Wątki na pasku narzędzi Lokalizacja debugowania lub znaczniki wątków w edytorze kodu źródłowego.