Visual Studio, debuguj jeden z wielu wątków

128

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?

Oskar Kjellin
źródło
której wersji programu Visual Studio używasz? Express, Pro, Ultimate ..?
Mark
wtedy link jeffamaphone pomoże i może to również dla dalszych informacji, aby przejść do innego wątku podczas debugowania msdn.microsoft.com/en-us/library/bb157786.aspx
Mark
Zobacz powiązaną dyskusję: visualstudio.uservoice.com/forums/121579-visual-studio/ ...
user626528

Odpowiedzi:

109

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 .

i_am_jorf
źródło
25
Jestem zmieszany. Czy odpowiedź brzmi „nie da się tego zrobić”? Pytanie dotyczy tego, jak pozostać zablokowanym w określonym wątku, aby debugger nie przeskakiwał między nimi. Przełączenie na wątek jest w porządku, ale gdy tylko inny wątek coś zrobi, debugger przeskoczy do niego. Jeśli nie mogę zamrozić drugiego wątku, ponieważ musi on coś zrobić, to jak mogę pozostać zablokowany tylko w wątku, który mnie interesuje?
bubbleking
Dochód: | musisz zawsze kliknąć przełącznik, za każdym razem, gdy coś się dzieje
deadManN
16

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

Steve
źródło
2
„Pojedyncze przejście przez jeden wątek wydaje się być w większości naprawione w VS 2012” - nie do końca, w VS2017 nadal jest zepsute.
user626528
10

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

Charles Bretana
źródło
Dzięki Charles, to było pomocne (nie wiedziałem, że możesz to zrobić). Jednak najbardziej wydajnym sposobem debugowania jest dla mnie ten, który napisał jeffamaphone, ponieważ nie znam nazwy, zanim osiągnie punkt przerwania i zobaczy pewne wartości
Oskar Kjellin
3

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.

Boris
źródło
2

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.

Hans Passant
źródło
1

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.

BlueMax
źródło
0

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:

  1. Wyłącz lub usuń punkt przerwania, który został uderzony przez nowy wątek, do którego został przełączony debuger.
  2. Naciśnij Kontynuuj (F5)
  3. Obserwuj, jak kończy się twój pierwszy początkowy krok w tym pierwszym wątku i teraz jest aktywnym kontekstem debugowania.
  4. 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

rebornx
źródło