2010-10-10 18 views
93

Mam aplikację z 4 wątkami działającymi w tym samym kodzie. Jednak, gdy go przeskakuję, przeskakuję pomiędzy różnymi wątkami. Jak mogę zablokować go do jednego wątku, aby inne wątki były ignorowane do debugowania?Visual Studio, debugowanie jednego z wielu wątków

+0

której wersji Visual Studio używasz? Express, Pro, Ultimate ..? – Mark

+0

@ Mark Używam ostatecznego –

+0

, a następnie link jeffamaphone pomoże i może to również dla dalszych informacji, aby przejść do innego wątku podczas debugowania http://msdn.microsoft.com/en-us/library/bb157786.aspx – Mark

Odpowiedz

85

Tak.

W oknie wątków (Debuguj -> Windows -> Tematy) kliknij prawym przyciskiem myszy żądany wątek i wybierz "przełącz na wątek".

Możesz także wybrać "zamrożenie" na wątkach, których nie chcesz debugować, aby nie były uruchomione. Nie zapomnij ich "odtajać", jeśli oczekujesz od nich wykonywania pracy.

Further reading.

+14

I Jestem zdezorientowany. Czy odpowiedź brzmi "nie da się zrobić?" Pytanie pyta, jak zostać zablokowanym na określony wątek, aby debugger nie przeskakiwał między nimi. Przejście do wątku jest w porządku, ale gdy tylko inny wątek coś zrobi, wtedy debugger przeskakuje do niego. Jeśli nie mogę zatrzymać drugiego wątku, ponieważ musi on coś zrobić, to w jaki sposób mam pozostać zablokowany tylko w wątku, który mnie interesuje? – bubbleking

+0

Incomeplete: | musisz zawsze klikać przełącznik, za każdym razem, gdy coś się stanie – deadManN

9

Można również umieścić warunkową przerwania w kodzie i umieścić thread.Id == [someValue] lub Thread.Name == "[Somename]" w stanie punktu przerwania ...

+0

Dzięki Charles, to było pomocne (nie wiedziałem, że możesz to zrobić). Jednak najbardziej efektywnym sposobem debugowania jest ten, który napisał Jeff, ponieważ nie znam nazwy zanim trafi w punkt przerwania i widzi pewne wartości. –

2

Ten silnie przypomina bardzo podobny problem w programie Visual Studio     2008 SP1. Zostało to naprawione za pomocą poprawki po SP. Ale są też inne dowody na to, że poprawka nie została włączona do bazy kodu, ten problem dotyczył także tego feedback item. To nie jest tak niezwykłe, że poprawki nie zostaną zintegrowane z powrotem.

Brak elementu opinii, który dokładnie opisuje Twój problem, przynajmniej taki, jaki mogę znaleźć. Zaleciłbym, abyś to zrobił. Biorąc pod uwagę zwykłe problemy z reprodukcją takich błędów, zdecydowanie zalecam uwzględnienie projektu reprodukcji, który wykazuje ten problem wraz z instrukcjami, jak odtworzyć problem.

Istnieje obejście tego problemu, możesz przejść do Debug + Windows + Threads, kliknąć prawym przyciskiem myszy wątki, których nie chcesz debugować, i wybrać Zablokuj. Nie zapomnij później ich rozmrozić.

Te błędy zostały ponownie ustalone w Visual Studio 2010 z dodatkiem Service Pack 1.

14

pojedyncze stepping przez jeden wątek wydaje się być przede wszystkim stałe w VS 2012 (z pewnymi zastrzeżeniami można zobaczyć w moim linku poniżej). Punkty przerywania to ból.

Nici zamrażające i rozmrażające to typowe obejście problemu, jak podają poprzednie odpowiedzi, ale jest to nużące i może powodować zawieszanie się, gdy wątek czeka na inny wątek, który jest zamrożony. Może to być trudne do odzyskania od bez utraty miejsca w wątku zainteresowania.

Innym przydatnym pracy jest zastosowanie filtra wątek na swoje pułapki, a także określonych w niektóre odpowiedzi:

Tworzenie przerwania, kliknij prawym przyciskiem na przerwania, kliknij filtr, a następnie wprowadź ThreadID = 7740 (Twój wątek id z okna wątków).

Może to być bardzo uciążliwe.

Moja sugestia dla Microsoft polega na naprawieniu pojedynczego kroku (i jego odmian), aby nigdy nie przełączać wątków, chyba że w innym wątku zostanie trafiony jawny punkt przerwania. Powinny również dodać skrót (być może Ctrl-F9), aby utworzyć punkt przerwania z bieżącym identyfikatorem wątku jako filtrem. To sprawiłoby, że drugi przepływ pracy byłby o wiele wygodniejszy.

Zagłosuj się z sugestią, jeśli zgadzasz to byłoby przydatne, lub dodawać własne propozycje:

https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/8543248-make-the-debugger-stick-to-the-current-thread-inst

+0

"Pojedyncze przejście przez pojedynczy wątek wydaje się być w większości naprawione w VS 2012" - niezupełnie, nadal jest uszkodzony w VS2017. – user626528

0

Znacznie szybciej obejście istnieje dla prostych przypadkach - patrz komentarze w linku Steve'a.

debugger wykona tylko krok na wątku, z którego powstał krok. Więc jeśli trafisz punkt przerwania, wyłącz go, a następnie zacznij kroczyć, nie powinieneś zatrzymywać się na innym wątku. Jeśli masz inne punkty przerwania w aplikacji i inny wątek uderza jedno, wtedy będzie debugowanie w mieszanym stanie nici jak opisano

Więc w moim przypadku gdy różne wątki rozpoczęte uderzenie mojego przerwania po prostu hit dalej kilka razy, dopóki nie zidentyfikowałem połączenia, którego szukałem - następnie usunąłem punkt przerwania i przeszedłem przez resztę kodu, pozostając w tej samej wątku bez ingerencji ze strony pozostałych.

To oczywiście staje się problemem, jeśli masz wiele punktów zatrzymania, które chcesz zachować, itd. - ale znowu w prostych przypadkach jest to znacznie łatwiejsze.

Powiązane problemy