Mam rozwiązanie z niektórymi projektami. Istnieje kilka punktów krytycznych w różnych projektach. Chcę prześledzić pierwszy wątek trafiony w jeden z tych punktów przerwania i kontynuować śledzenie tego pojedynczego wątku, mimo że inne wątki wprowadzają te same bloki kodu.
Wiem, że jest to możliwe poprzez zdefiniowanie warunku w punkcie przerwania, to znaczy nazwa wątku = ... lub identyfikator wątku = ... ale moja sprawa jest mocno obciążoną aplikacją ASP.NET i jak tylko dołączę do w3wp.exe
wielu wątki uderzą w punkty przerwania. Potrzebuję czegoś takiego jak ThreadLocal<break-point>
.
Czy to możliwe? Jeśli tak to jak?
Odpowiedzi:
Wątki Freeze / Thaw to niepoprawny sposób, ponieważ inne wątki nie wykonują żadnego kodu.
Najbardziej poprawnym i użytecznym sposobem jest:
W programie Visual Studio 2015 i nowszych proces jest podobny:
Wszystkie wątki są wykonywane, ale debugger trafia tylko do bieżącego wątku.
źródło
System.Threading.Thread.CurrentThread.ManagedThreadId
czy coś?Oto co zrobiłem:
Ustaw warunkowy punkt przerwania, o którym wiedziałem, że trafi tylko w poszukiwany wątek.
Po osiągnięciu punktu przerwania i przejściu do żądanego wątku, w oknie Wątki programu Visual Studio (podczas debugowania, Debuguj -> Windows -> Wątki), Ctrl+ A(aby wybrać wszystkie wątki), a następnie Ctrl+ kliknij wątek, w którym aktualnie się znajdujesz . Powinieneś mieć wszystkie wątki oprócz tego, który chcesz debugować.
Teraz Visual Studio będzie tylko przechodzić przez rozmrożony wątek. Wydaje się, że robi się to znacznie wolniej, prawdopodobnie dlatego, że musi przechodzić przez wszystkie zamrożone wątki, ale przyniosło pewne zdrowie psychiczne podczas mojego wielowątkowego debugowania.
źródło
Właśnie wydałem rozszerzenie Visual Studio 2010+, które robi dokładnie to, czego szukasz. I to za darmo :).
Sprawdź to tutaj w galerii , na oficjalnej stronie lub w repozytorium Github .
źródło
Jeśli spawanych jest wiele wątków, jak w przypadku aplikacji internetowej, odpowiedzi @MattFaus nie będą działać. Zamiast tego zrobiłem to
źródło
Nieco inne podejście, które użyłem:
Zakłada się, że masz czas na wykonanie powyższych czynności, zanim drugi wątek osiągnie punkt przerwania. Jeśli nie, a inne wątki osiągną punkt przerwania, zanim zrobisz powyższe, możesz kliknąć je prawym przyciskiem myszy w oknie wątków i wybrać opcję zamrożenia.
źródło
lock(m_someObject) { ; }
W VS 2019:
źródło
Sugeruję dodanie innej instancji aplikacji na serwerze na żywo, na tym samym sprzęcie lub na nowym komputerze (klastrowanie), a następnie debugowanie tylko tej instancji. Nie dodałbym punktu przerwania w kodzie, który uruchamiają użytkownicy. Jeśli to nie jest opcja, dodałbym więcej śledzenia.
Jeśli jednak jest to absolutnie konieczne i potrzebujesz statystyki rozwiązania, jestem pewien, że możesz dodać punkt przerwania, który pęka tylko wtedy, gdy żądanie pochodzi z twojego adresu IP. Zrobiłbyś to, dodając warunkowy punkt przerwania, który sprawdza
HttpContext.Request.UserHostAddress
. Pamiętaj jednak, że znacznie spowalnia to działanie aplikacji.źródło
Jeśli nie chcesz zatrzymać wszystkich innych wątków (być może dołączasz debuger programu Visual Studio do działającej aplikacji, która musi odpowiadać na żądania), możesz użyć makra, które automatycznie tworzy i usuwa punkty przerwania.
Jest to sugerowane w odpowiedzi na pytanie Przepełnienie stosu „Krok ponad” podczas debugowania programów wielowątkowych w Visual Studio .
Jednak link wyjaśnia tylko, jak debugować wiersz po wierszu. Sugeruję zmodyfikowanie makra (jeśli czujesz się swobodnie), aby zmodyfikować wszystkie punkty przerwania (na przykład w danym zakresie linii), aby zatrzymać tylko w bieżącym wątku.
źródło
Myślę, że jest to nieco inne w Visual Studio 2015. Zmienili kilka rzeczy w punktach przerwania, ale oto jak zastosować zaakceptowaną odpowiedź z hzdbyte (powyżej):
W punkcie przerwania na marginesie kodowania kliknij prawym przyciskiem myszy> Warunki> Zmień z „Wyrażenie warunkowe” na „Filtruj”. Pozwala to na filtrowanie według ThreadId.
Alternatywnie w punkcie przerwania w oknie Punkty przerwania kliknij prawym przyciskiem myszy> Ustawienia> zaznacz pole Warunki i wykonaj powyższe czynności.
źródło
Ustaw warunek punktu przerwania, klikając prawym przyciskiem myszy boczny pasek linii. Wybierz „Warunek” i wprowadź w cudzysłowie:
System.Threading.Thread.CurrentThread.Name == "nazwa_wątku”
Alternatywnie możesz zrobić to samo, pobierając „Zarządzany identyfikator” wątku z okna „Wątki” i użyć:
System.Threading.Thread.CurrentThread.ManagedThreadId == your_managed_thread_id
źródło