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.
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.