Udostępnij za pośrednictwem


Debugowanie aplikacji wielowątkowych w programie Visual Studio

Wątek to sekwencja instrukcji, dla których system operacyjny udziela czasu procesora. Każdy proces uruchomiony w systemie operacyjnym składa się z co najmniej jednego wątku. Procesy, które mają więcej niż jeden wątek, są nazywane wielowątkowymi.

Komputery z wieloma procesorami, procesorami wielordzeniowymi lub procesami hiperwątkowymi mogą uruchamiać kilka równoczesnych wątków. Przetwarzanie równoległe przy użyciu wielu wątków może znacznie poprawić wydajność programu, ale może również utrudnić debugowanie, ponieważ śledzisz wiele wątków.

Doskonałe przetwarzanie równoległe nie zawsze jest możliwe. Wątki czasami muszą być synchronizowane. Jeden wątek może wymagać oczekiwania na wynik z innego wątku lub jeden wątek może wymagać wyłącznego dostępu do zasobu używanego przez inny wątek. Problemy z synchronizacją są częstą przyczyną błędów w aplikacjach wielowątkowych. Czasami wątki mogą czekać na zasób, który nigdy nie stanie się dostępny. Spowoduje to wystąpienie warunku o nazwie impas.

Wątki i procesy

Wątki i procesy są powiązanymi pojęciami w dziedzinie informatyki. Oba reprezentują sekwencje instrukcji, które muszą być wykonywane w określonej kolejności. Instrukcje w osobnych wątkach lub procesach mogą jednak być wykonywane równolegle.

Procesy istnieją w systemie operacyjnym i odpowiadają tym, co użytkownicy widzą jako programy lub aplikacje. Z drugiej strony w procesie istnieje wątek. Z tego powodu wątki są czasami nazywane procesami lekkimi. Każdy proces składa się z co najmniej jednego wątku.

Istnienie wielu procesów umożliwia komputerowi wykonywanie więcej niż jednego zadania jednocześnie. Istnienie wielu wątków umożliwia równoległe oddzielenie pracy. Na komputerze z procesorami wieloprocesorowymi procesy lub wątki mogą być uruchamiane na różnych procesorach. Umożliwia to prawdziwe przetwarzanie równoległe.

Narzędzia do debugowania aplikacji wielowątków

Program Visual Studio udostępnia różne narzędzia do użycia w debugowaniu aplikacji wielowątków.

Program Visual Studio udostępnia również zaawansowane punkty przerwania i punkty śledzenia, które mogą być przydatne podczas debugowania wielowątków aplikacji. Użyj warunków i filtrów punktu przerwania, aby umieścić punkty przerwania w poszczególnych wątkach. Punkty śledzenia umożliwiają śledzenie wykonywania programu bez przerywania, aby zbadać problemy, takie jak zakleszczenia. Aby uzyskać więcej informacji, zobacz Akcje punktu przerwania i punkty śledzenia.

Debugowanie wielowątkowej aplikacji, która ma interfejs użytkownika, może być szczególnie trudne. Możesz rozważyć uruchomienie aplikacji na drugim komputerze i użycie zdalnego debugowania. Aby uzyskać więcej informacji, zobacz Debugowanie zdalne.

W poniższej tabeli przedstawiono dostępne informacje i akcje, które można wykonać w każdym z tych miejsc:

Interfejs użytkownika Dostępne informacje Akcje, które można wykonać
Okno dialogowe Dołączanie do procesu Dostępne procesy, do których można dołączyć:

- Nazwa procesu (.exe)
- Numer identyfikatora procesu
- Tytuł paska menu
— Typ (zarządzana wersja 4.0; Zarządzana wersja 2.0, wersja 1.1, wersja 1.0; x86; x64; IA64)
- Nazwa użytkownika (nazwa konta)
- Numer sesji
Wybierz proces dołączania do

Wybieranie komputera zdalnego

Zmiana typu transportu na potrzeby nawiązywania połączenia z komputerami zdalnymi
Okno Procesy Dołączone procesy:

- Nazwa procesu
- Numer identyfikatora procesu
- Ścieżka do przetwarzania .exe
- Tytuł paska menu
— Stan (przerwa). Uruchomiono)
— Debugowanie (natywne, zarządzane itd.)
- Typ transportu (domyślny, natywny bez uwierzytelniania)
- Kwalifikator transportu (komputer zdalny)
Narzędzia:

-Dołączyć
-Odłączyć
-Zakończyć

Menu skrótów:

-Dołączyć
-Odłączyć
— Odłączanie po zatrzymaniu debugowania
-Zakończyć
Okno Wątki Wątki w bieżącym procesie:

- Identyfikator wątku
— Identyfikator zarządzany
- Kategoria (wątek główny, wątek interfejsu, program obsługi wywołania procedury zdalnej lub wątek procesu roboczego)
- Nazwa wątku
— Lokalizacja, w której jest tworzony wątek
-Priorytet
- Maska koligacji
- Liczba wstrzymanych
- Nazwa procesu
- Wskaźnik flagi
- Wskaźnik zawieszony
Narzędzia:

-Szukaj
— Stos wywołań wyszukiwania
- Flaga Tylko mój kod
- Flaga wyboru modułu niestandardowego
- Grupuj według
-Kolumny
- Rozwijanie/zwijanie stosów wywołań
- Rozwijanie/zwijanie grup
- Zamrażanie/odmrażanie wątków

Menu skrótów:

- Pokaż wątki w źródle
- Przełączanie do wątku
- Blokowanie uruchomionego wątku
- Rozmrażanie zamrożonej nici
- Flaga wątku do dodatkowego badania
- Coflaguj wątek
— Zmienianie nazwy wątku
- Pokaż i ukryj wątki

Inne akcje:

— Wyświetlanie stosu wywołań dla wątku w etykietce danych
Okno źródła Wskaźniki wątków w lewej rynnie wskazują jeden lub wiele wątków (domyślnie wyłączone, przy użyciu menu skrótów w oknie Wątki ) Menu skrótów:

- Przełączanie do wątku
- Flaga wątku do dodatkowego badania
- Coflaguj wątek
Pasek narzędzi Lokalizacja debugowania - Bieżący proces
— Wstrzymywanie aplikacji
— Wznów aplikację
— Wstrzymywanie i zamykanie aplikacji
- Bieżący wątek
- Przełącz bieżący stan flagi wątku
— Pokaż tylko oflagowane wątki
— Pokaż tylko bieżący proces
- Bieżąca ramka stosu
- Przełączanie do innego procesu
— Wstrzymywanie, wznawianie lub zamykanie aplikacji
- Przełącz się do innego wątku w bieżącym procesie
- Przełącz się do innej ramki stosu w bieżącym wątku
- Flaga lub cofanie bieżących wątków
— Pokaż tylko oflagowane wątki
— Pokaż tylko bieżący proces
Okno Stosy równoległe - Wywołaj stosy dla wielu wątków w jednym oknie.
- Aktywna ramka stosu dla każdego wątku.
- Metody wywołujące i wywoływane dla dowolnej metody.
- Wykrywanie zakleszczenia
- Odfiltruj określone wątki
- Filtrowanie stosów kodu zewnętrznego
- Przełączanie do widoku Zadania
- Flaga lub anulowanie opóźnienia wątku
-Powiększenia
- Kopiowanie ramek stosu
- Zapisz/eksportuj wszystkie stosy jako obraz
Okno Zegarek równoległy - Kolumna flagi, w której można oznaczyć wątek, do którego chcesz zwrócić szczególną uwagę.
- Kolumna ramki, w której strzałka wskazuje wybraną ramkę.
— Konfigurowalna kolumna, która może wyświetlać maszynę, proces, kafelek, zadanie i wątek.
- Flaga lub anulowanie opóźnienia wątku
— Wyświetlanie tylko oflagowanych wątków
- Przełączanie ramek
- Sortowanie kolumny
- Wątki grupowania
- Zamrażanie lub rozmrażanie wątków
— eksportowanie danych w oknie obserwatora równoległego
Okno Zadania — Wyświetl informacje o Task obiektach, w tym identyfikator zadania, stan zadania (zaplanowane, uruchomione, oczekujące, zakleszczone) i który wątek jest przypisany do zadania.
- Bieżąca lokalizacja w stosie wywołań.
— Delegowanie przekazane do zadania w czasie tworzenia
- Przełącz do bieżącego zadania
- Flaga lub anulowanie opóźnienia zadania
- Blokowanie lub rozmrażanie zadania
Okno Wątki procesora GPU - Kolumna flagi, w której można oznaczyć wątek, do którego chcesz zwrócić szczególną uwagę.
- Bieżąca kolumna wątku, w której żółta strzałka wskazuje bieżący wątek.
- Kolumna Liczba wątków, która wyświetla liczbę wątków w tej samej lokalizacji.
- Kolumna Wiersz , która wyświetla wiersz kodu, w którym znajduje się każda grupa wątków.
- Kolumna Adres , w której jest wyświetlana instrukcja, gdzie znajduje się każda grupa wątków.
- Kolumna Lokalizacja , która jest lokalizacją w kodzie adresu.
— Kolumna Stan , która pokazuje, czy wątek jest aktywny, czy zablokowany.
- Kolumna Kafelek, która pokazuje indeks kafelka dla wątków w wierszu.
- Zmień na inny wątek
— Wyświetlanie określonego kafelka i wątku
- Wyświetlanie lub ukrywanie kolumny
- Sortuj według kolumny
- Wątki grupowania
- Zamrażanie lub rozmrażanie wątków
- Flaga lub anulowanie opóźnienia wątku
— Wyświetlanie tylko oflagowanych wątków