2010-02-23 16 views
5

Pracuję nad wielowątkową aplikacją WinForm z C#. Czasami zdarza się, że moja aplikacja zawiesza się lub zawiesza się lub blokuje.Wiedza W jakim momencie aplikacja zamarza

Kiedy to się dzieje, a ja działam w trybie DEBUG, czy mimo to rozumiem, w jakim wierszu kodu znajduje się moja aplikacja? Ponieważ jest zamrożony, spodziewam się znaleźć punkt, w którym aplikacja jest zablokowana lub zablokowana lub cokolwiek innego. Czy to możliwe?

Po zamrożeniu próbuję otworzyć okno CALL STACK, ale nie wyświetlają żadnych informacji; czy jest coś, co mógłbym zrobić? Niektóre "wstrzymaj i sprawdź" czy cokolwiek?

Odpowiedz

5

Może być konieczne otwarcie okna Threads i zmiana bieżącego wątku. Podczas debugowania wybierz Debuguj -> Przerwij wszystko i otwórz okno Threads. Jeśli przejdziesz przez każdy wątek, dwukrotnie klikając na wątku, powinieneś być w stanie zbadać stos wywołań dla każdego wątku.

To powiedziawszy, jeśli możesz uruchomić swój program w VS 2010 - to jest o wiele łatwiejsze. W VS 2010 można korzystać z nowego Profilowania Współbieżności i uruchamiać swój kod w Profilu Współzależności z opcją Wizualizacja zachowania wielowątkowej aplikacji. Po zamknięciu aplikacji zabij ją i pozwól profilerowi odejść -

Ostatecznie otrzymasz diagram, który pokazuje każdy wątek w twoim programie i kiedy są zablokowane. Zostanie pokazany callstack dla każdego zablokowanego wątku, a także blokada (linia kodu źródłowego). Dzięki temu bardzo łatwo wyśledzić martwego zamka.

+0

Cześć Reed! Dziękuję bardzo za wspaniałą odpowiedź! Jeszcze jedna mała rzecz, jeśli nadal jesteś w pobliżu. Nie mam VS 2010 i nadal używam VS 2008. Czy wiesz, czy istnieje jakieś dobre darmowe narzędzie produkujące mniej więcej to samo, co właśnie opisałeś dla schematów wątków? Dzięki za pomoc. –

+0

Nie - nie znam niczego wolnego, co jest bliskie. Zestaw narzędzi do gwintowania Intela działa (ale jest bardzo drogi). Możesz pobrać VS 2010 RC Ultimate za darmo już teraz i uruchomić go na swoich projektach, choć ... –

+0

Cześć Reed! Bardzo dziękuję za pomoc! Miłego dnia! –

2

Po podłączeniu debugera przejdź do menu Debuguj i wybierz "Przerwij wszystko" ... Następnie możesz sprawdzić stosy połączeń dla wszystkich wątków.

+0

Super! Dzięki! –

2

Możesz nacisnąć pauzę i zobaczyć, gdzie się kończy (użyj wyżej wymienionego okna stosu wywołań). Istnieje jednak szansa, że ​​skończysz z natywnym kodem. Możesz spróbować wyjść nieco lub po prostu spojrzeć na stos dla funkcji zarządzanej do debugowania.

Alternatywnie można umieścić punkt przerwania po "zamrożeniu" aplikacji i spróbować wskazać pętlę, która się nie kończy.

Obie powyższe zasady zakładają, że aplikacja jest zajęta (100% użycia procesora). Jeśli twoja aplikacja zostanie zablokowana lub po prostu czeka na muteksa, który nie będzie zaznaczał, będziesz musiał ręcznie ponownie przeczytać swój kod i spróbować go samodzielnie.

+0

Auch! Naprawdę? Czytanie kodu w trybie ręcznym jest jedynym sposobem na ustalenie, gdzie mam zakleszczenie? Czasy temu czytałem o potężnym narzędziu o nazwie WinDbg. Czy kiedykolwiek używałeś i czy wiesz, czy ten stół jest w stanie mi pomóc w wykryciu, w którym kawałku kodu aplikacja jest zablokowana? –

+0

Cóż, jeśli jesteś w impasie, twoja nić utknie w funkcji gdzieś głęboko w bibliotece rtl dll dopóki warunek nie zostanie spełniony przez program planujący. Stos wywołań nie określi, na jaki stan jest oczekiwany. – Blindy