Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc

Automatyczne podłączanie debuggera do procesu - Debugger.Launch();

Od jakiegoś czasu mieliśmy w projekcie jeden dość uciążliwy problem: MasterSolution z blisko trzydziestoma projektami. Jak nie trudno się domyślić było to powodem kilku problemów: długi czas kompilacji, problemy z wydajnością ReSharpera itd. Na szczęście od dziś mogę pracować już tylko z podzbiorem projektów, które mnie interesują, a to wszystko dzięki odpowiedniemu podziałowi MasterSolution.

Rozbicie MasterSolution zmienia niestety sposób w jaki pracowałem do tej pory. Z modelu "Edytuj i F5 (debuguj)" muszę przejść na trochę bardziej skomplikowany "Edytuj, zbuduj, uruchom i podłącz debuggera". Nowy model, choć bardziej skomplikowany, nie będzie bardziej czasochłonny z wyjątkiem jednej monotonnej czynności. Za każdym razem, gdy aplikacja się załaduje, trzeba będzie podłączyć debuggera (Debug->Attach debugger). Jest to o tyle monotonne, że trzeba się trochę naklikać. Pierwsza myśl jaka mi przyszła do głowy to: czy nie da się tego zrobić automatycznie?

Odpowiedź jest częściowo twierdząca, a dokładnie jest nim wywołanie jednej metody klasy System.Diagnostics.Debugger:

Debugger.Launch();

To jedno wywołanie uruchamia debuggera i podłącza go do procesu, z którego pochodzi powyższe wywołanie. Rozwiącanie jest częściowe, ponieważ i tak zmusza nas do kilku kliknięć. Po wywołaniu powyższej linii zobaczymy takie oto znajome okienko wyboru debuggera (po lewej).

Gdy po raz pierwszy mi się to okienko pokazało pomyślałem sobie, że mi się aplikacja wywaliła, ale pokrótce okazało się, że okno jest efektem pożądanym i pozwala wybrać debuggera, którego chcemy użyć. Po tym jak dokonamy wyboru, wybrana przez nas instancja Visual Studio przejdzie w tryb debug, tak jakbyśmy mieli ustawiony breakpoint. I voila! Podpięliśmy się do interesującego nas procesu.

Bardzo mi się to rozwiązanie podoba, gdyż zaoszczędzi mi monotonnego klikania. Wywołanie debuggera można umieścić zaraz przy starcie aplikacji, lub też wstawiać w pożądanym miejscu, tylko na czas debugowania.

Jest jeszcze jedna metoda klasy Debugger, o której chciałbym wspomnieć.

Debugger.Break();

Wywołanie to jest tożsame w ustawieniem breakpointa bezpośrednio w Visual Studio. Zatem czy programowe zatrzymywanie programu może nam się przydać?

Otóż ciekawym zastosowaniem może być sytuacja, gdy w pewnym miejscu programu wiemy, że pewien jego stan jest nieprawidłowy. Jest wiele sposobów na takie miejsca. Możemy na przykład wypisywać komunikat na konsolę. Jeżeli jednak zachowanie to jest niepoprawne, to zwykle będziemy chcieli sprawdzić dlaczego aplikacja znalazła się w danym stanie. Prawdopodobnie wrócimy i ustawimy breakpoint by zbadać stan interesujących nas obiektów. Zatem dlaczego od razu w momencie wystąpienia tego zdarzenia nie zatrzymać programu?

 

Zatem miłego debugowania!

Opublikowane 3 marca 2008 21:07 przez nuwanda

Powiadamianie o komentarzach

Jeżeli chciałbyś otrzymywać email gdy ta wypowiedź zostanie zaktualizowana, to zarejestruj się tutaj

Subskrybuj komentarze za pomocą RSS

Komentarze:

# re: Automatyczne podłączanie debuggera do procesu - Debugger.Launch();

3 marca 2008 21:50 by dario-g

Fajne, fajne. Kurcze, ciekawe czy to będzie tak fajnie działać w przypadku Visual Studio Express? :)

# re: Automatyczne podłączanie debuggera do procesu - Debugger.Launch();

3 marca 2008 22:00 by nuwanda

Ciekawe. Wydaje się, że powinno działać. Jak sprawdzisz to daj znać!

# re: Automatyczne podłączanie debuggera do procesu - Debugger.Launch();

4 marca 2008 11:15 by mgrzeg

Ta metoda jest szczegolnie uzyteczna, gdy nie bardzo jest mozliwosc debuggowania kodu w sposob klasyczny - z poziomu vs, czyli we wszelkich skryptach, czy kodzie kompilowanym w runtimie. Wspomnialem o tym w kontekscie tekstu o MyGeneration w Zinie #2 i mozliwosci debuggowania skryptow MyGen.

# re: Automatyczne podłączanie debuggera do procesu - Debugger.Launch();

4 marca 2008 11:21 by nuwanda

Przyłapałeś mnie! Nie przeczytałem Zine #2 od dechy do dechy. Ale jak wyjdzie #3 to postaram się poprawić ;)

# re: Automatyczne podłączanie debuggera do procesu - Debugger.Launch();

4 marca 2008 12:27 by ucel

Bardzo pozyteczne, ale...

Jak rozumiem do uruchomienia masz projekt typu class library. Dlaczego w takim razie nie mozesz w zakladce Debug wybrac po prostu 'Start external program' i podac sciezke do master exeka?

# re: Automatyczne podłączanie debuggera do procesu - Debugger.Launch();

4 marca 2008 12:59 by nuwanda

Bardzo pożyteczne, ale...

Akurat w projekcie, w którym pracuję podejście to nie sprawdza się. O ile opcje zakładki Debug są przechowywane lokalnie dla użytkownika VS to opcje z zakładki Build są trzymane w pliku projektu. Pomysł Twój sprawdziłby się, gdybym mógł przestawić właściwość 'Output path' na zbiorczy katalog, gdzie znajduje się master exe. Jednak każdy developer ma swoje ścieżki i niestety taka zmiana nie wchodzi w grę. Po drugie muszę wykonać builda integracyjnego, żeby powstała cała aplikacja, ze wszystkimi zależnościami.

# re: Automatyczne podłączanie debuggera do procesu - Debugger.Launch();

4 marca 2008 19:07 by woro

Można również napisać makro w VS podpinające się do procesu, a makro podpiąć do przycisku na pasku w VS. Tym sposobem wystarczy jeden klik ;)

# re: Automatyczne podłączanie debuggera do procesu - Debugger.Launch();

4 marca 2008 20:07 by nuwanda

No tak, o tym nie pomyślałem. Dzięki za podpowiedź! Okazuje sie, że w przykładach makr, które można znaleźć w Visual Studio jest jeden pokazujący jak przypiąć się do konkretnego procesu.

Poniżej kod:

   ' This subroutine attaches to calc.exe if it is running.

   Sub AttachToCalc()

       Dim attached As Boolean = False

       Dim proc As EnvDTE.Process

       For Each proc In DTE.Debugger.LocalProcesses

           If (Right(proc.Name, 8) = "calc.exe") Then

               proc.Attach()

               attached = True

               Exit For

           End If

       Next

       If attached = False Then

           MsgBox("calc.exe is not running")

       End If

   End Sub

# re: Automatyczne podłączanie debuggera do procesu - Debugger.Launch();

4 marca 2008 21:48 by nuwanda

Eh... porażka. Po podłączeniu debuggera do procesu, 'Edit and continue' nie działa. Muszę coś wykombinować, żeby jednak debugować prosto z VS...

# re: Automatyczne podłączanie debuggera do procesu - Debugger.Launch();

6 marca 2008 15:09 by tc

Hmm... a mowa tu o aplikacji typu Web czy WinForms?

Co do Web, to wydaje mi się, że "Edit and continue" działa tylko przy uruchomieniu przez Web Development Server.

# re: Automatyczne podłączanie debuggera do procesu - Debugger.Launch();

6 marca 2008 15:13 by nuwanda

W moim przypadku jest to WinForms.

# Tfs Spotlight – buduję własny CAB

11 marca 2008 12:14 by nblog

Od kilku miesięcy nic tu nie pisałem (oczywiście poza poprzednim nieplanowanym wpisem ). Jak łatwo się

Co o tym myślisz?

(wymagane) 
wymagane 
(wymagane) 

  
Wprowadź kod: (wymagane)