Mam aplikację z 4 wątkami działającymi na tym samym kodzie. Jednak kiedy stąpam, przeskakuje między różnymi wątkami. Jak mogę zablokować go w jednym wątku, aby inne wątki były ignorowane podczas debugowania?
c#
multithreading
visual-studio-2010
Oskar Kjellin
źródło
źródło
Odpowiedzi:
Tak.
W oknie Wątki (Debuguj -> Windows -> Wątki) kliknij prawym przyciskiem myszy żądany wątek i wybierz „Przełącz na wątek”.
Możesz także wybrać opcję „zamrożenie” wątków, których nie chcesz debugować, aby nie działały. Nie zapomnij jednak ich „rozmrozić”, jeśli oczekujesz od nich pracy.
Dalsza lektura .
źródło
Pojedyncze przejście przez pojedynczy wątek wydaje się być w większości naprawione w VS 2012 (z pewnymi zastrzeżeniami, które można zobaczyć w moim linku poniżej). Punkty przerwania to ból.
Zamrażanie i rozmrażanie wątków jest typowym obejściem, zgodnie z wcześniejszymi odpowiedziami, ale jest to żmudne i może powodować zawieszanie się, gdy wątek oczekuje na inny wątek, który jest zamrożony. Może to być trudne do odzyskania bez utraty miejsca w wątku zainteresowania.
Innym przydatnym przepływem pracy jest zastosowanie filtru wątków w punktach przerwania, co również zostało określone w niektórych odpowiedziach:
Utwórz punkt przerwania, kliknij prawym przyciskiem myszy punkt przerwania, kliknij opcję Filtr i wprowadź ThreadId = 7740 (identyfikator wątku z okna wątków).
To może być bardzo uciążliwe.
Moja sugestia dla firmy Microsoft to naprawienie pojedynczego kroku (i jego odmian), aby nigdy nie przełączać wątków, chyba że jawny punkt przerwania zostanie trafiony w innym wątku. Powinni także dodać skrót (może Ctrl-F9), aby utworzyć punkt przerwania z bieżącym identyfikatorem wątku jako filtrem. Dzięki temu drugi przepływ pracy byłby znacznie wygodniejszy.
Zagłosuj na sugestię, jeśli zgadzasz się, że będzie to przydatne, lub dodaj własne sugestie:
https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/8543248-make-the-debugger-stick-to-the-current-thread-inst
źródło
Możesz również umieścić warunkowy punkt przerwania w swoim kodzie i umieścić
thread.Id == [someValue]
lubThread.Name == "[Somename]"
w warunku punktu przerwania ...źródło
W prostych przypadkach istnieje znacznie szybsze obejście - zobacz komentarze w łączu Steve'a.
Więc w moim przypadku, gdy różne wątki zaczęły uderzać w mój punkt przerwania, po prostu kliknąłem Kontynuuj kilka razy, aż zidentyfikowałem wywołanie, którego szukałem - następnie usunąłem punkt przerwania i przeszedłem przez resztę kodu, pozostając w tym samym wątku bez zakłóceń z reszta.
To oczywiście staje się problemem, jeśli masz wiele punktów przerwania, które chcesz zachować itp. - ale znowu w prostych przypadkach jest to znacznie łatwiejsze do zrobienia.
źródło
To bardzo przypomina bardzo podobny problem w programie Visual Studio 2008 z dodatkiem SP1. Zostało to naprawione poprawką post-SP. Ale są inne dowody na to, że poprawka nie została włączona do bazy kodu, ten element opinii również był problemem. Nie jest tak niezwykłe, że poprawki nie są ponownie zintegrowane.
Nie ma pozycji opinii, która dokładnie opisywałaby Twój problem, przynajmniej taką mogę znaleźć. Poleciłbym złożyć jeden. Biorąc pod uwagę zwykłe problemy z odtwarzaniem takich błędów, zdecydowanie zalecam dołączenie projektu reprodukcji, w którym występuje ten problem, wraz z instrukcjami, jak odtworzyć problem.
Istnieje sposób obejścia problemu, możesz przejść do Debug + Windows + Threads, kliknąć prawym przyciskiem myszy wątki, których nie chcesz debugować i wybrać Zablokuj. Nie zapomnij ich później rozmrozić.
Te błędy zostały ponownie naprawione w dodatku Service Pack 1 dla programu Visual Studio 2010.
źródło
Używam programu Visual Studio Professional 2017 i używam okna wątków do selektywnego zamrażania i odblokowywania wątków. Zwykle mam wiele wątków tego samego kodu i chcę tylko je zamrozić, a nie inne. Właściwie podoba mi się okno MS Threads, ponieważ mogę wybrać podzbiór wątków do zamrożenia. Grupuję wątki według nazwy, a następnie mogę zamrozić wszystkie działające z tym samym kodem, co debugowanie, jednocześnie pozwalając na działanie pozostałych wątków. Próbowałem użyć rozszerzenia Erwin Mayer i działało bardzo dobrze, ale zawiesza wszystkie wątki oprócz tego, który uruchamiam, i czasami wpadam w sytuację, gdy debugowanie nie osiąga punktu przerwania, które myślę, że powinno, ponieważ wszystkie inne wątki są zatrzymywane, a aplikacja wygląda na zatrzymaną. Naciśnięcie przycisku pauzy i odblokowanie wątków w oknie wątków rozwiązuje ten problem.
źródło
7 mniej znanych hacków do debugowania w programie Visual Studio
źródło