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?
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?
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.
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:
Możesz również umieścić warunkowy punkt przerwania w swoim kodzie i umieścić thread.Id == [someValue]
lub Thread.Name == "[Somename]"
w warunku punktu przerwania ...
W prostych przypadkach istnieje znacznie szybsze obejście - zobacz komentarze w łączu Steve'a.
debugger wykona tylko krok w wątku, z którego został utworzony. Więc jeśli trafisz w punkt przerwania, wyłącz go, a następnie zacznij przechodzić, nie powinieneś zatrzymywać się w innym wątku. Jeśli masz inne punkty przerwania w aplikacji, a inny wątek trafi jeden, będziesz debugować w stanie mieszanego wątku zgodnie z opisem
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.
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.
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.
5. Przejdź przez pojedynczą nitkę bez skakania
Jak często debugujesz kod wielowątkowy, kiedy trafiasz w pierwszy punkt przerwania, robisz krok, a potem nagle zatrzymuje się żółta strzałka w innym wątku? Nieoczekiwane zachowanie jest spowodowane ustawieniem punktu przerwania, który w konsekwencji został trafiony. Domyślnie debugger zatrzyma się na punkcie przerwania za każdym razem, gdy zostanie trafiony. Oznacza to, że po wykonaniu kroku wszystkie wątki mogą działać, a jeden z uruchomionych wątków osiągnął ten punkt przerwania, zanim krok zakończy się w bieżącym wątku. Następnym razem, gdy znajdziesz się w takiej sytuacji, spróbuj tego:
- Wyłącz lub usuń punkt przerwania, który został uderzony przez nowy wątek, do którego został przełączony debuger.
- Naciśnij Kontynuuj (F5)
- Obserwuj, jak kończy się twój pierwszy początkowy krok w tym pierwszym wątku i teraz jest aktywnym kontekstem debugowania.
- Ponieważ punkty przerwania zostały usunięte lub wyłączone, możesz kontynuować przechodzenie po tym pojedynczym wątku bez przerywania.
7 mniej znanych hacków do debugowania w programie Visual Studio