Parallel debugging, czyli jak radzić sobie z wieloma wątkami

Ostatnio w projekcie zdarzyło się, że musiałem debugować skomplikowany proces wyliczania, który był zrównoleglony przy pomocy metody Parallel.ForEach(). Moja konfiguracja sprzętowa pozwoliła na uruchomienie kilku wątków naraz co sprawiło, że proces debugowania stał się dość uciążliwy. W różnych, bliżej nieokreślonych momentach, byłem przerzucany pomiędzy różnymi wątkami, a co za tym idzie pomiędzy różnymi kontekstami i miejscami w kodzie.

Szukając rozwiązania w pierwszej kolejności wpisałem odpowiednią frazę w wyszukiwarkę. Znalazłem informację, że zespół pracujący nad środowiskiem Visual Studio od 2016 roku ocenia czy będzie w stanie dostarczyć funkcjonalność “przypięcia do wątku” w następnej wersji IDE (źródło informacji). Zawiedziony musiałem szukać dalej. Kolejne pozycje wyników wyszukiwarki kierowały do portalu Stack Overflow. Przeczytałem o kilku różnych sposobach radzenia sobie z problemem. Dla mnie najlepszym rozwiązaniem okazało się zatrzymanie wszystkich wątków poza jednym, tym który mnie interesował. Oto mój sposób postępowania:

  • Wyłączam/usuwam wszystkie pułapki (breakpointy).
  • Stawiam nową pułapkę w miejscu, które mnie interesuje.
  • (Dodaję warunki zatrzymania – Conditional breakpoint.)
  • Kiedy debugger zatrzyma się w moim miejscu, to w okienku z wątkami (Debug -> Windows -> Threads) zaznaczam wszystkie wątki (Ctrl+A) oraz odznaczam wątek w którym obecnie się znajduję.
  • Klikam w przycisk Freeze Threads w celu zatrzymania wątków.

Threads Freeze

Dzięki temu zabiegowi aktywny był tylko jeden wątek, co w konsekwencji przyczyniło się do braku skoków pomiędzy różnymi kontekstami i miejscami w kodzie.

Debug Single Thread

W dalszych wynikach zwróconych przez wyszukiwarkę znalazłem wtyczkę Debug Single Thread, która robi dokładnie to, co właśnie opisałem – wstrzymuje wszystkie wątki poza jednym. Zawsze to trochę szybciej.

Threads Freeze 2

Podbij ↑

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *