Debugowanie dowolnych bibliotek, czyli dotPeek może być przydatny (i mój blog też :P)
Właściwie nigdy wcześniej nie zastanawiałem się nad debugowaniem kodu .NET frameworka. Zawsze chyba wychodziłem z założenia, że pewno łatwo się nie da, więc nawet nie próbowałem. Z drugiej strony, nigdy nie miałem dużej potrzeby, aby to robić, więc i nie drążyłem tematu. Ostatnio (podczas moich przygód z lokalizowaniem komunikatów walidacyjnych) działy się niezrozumiałe dla mnie rzeczy, więc chciałem się dowiedzieć co tam się właściwie dzieje i nawet mi się udało - chociaż łatwo nie było.
Cel
Moją zasadniczą potrzebą było debugowanie binarek dotnetowych, zarówno zainstalowanych w GAC razem z całym frameworkiem, jak i zainstalowanych w solucji przez NuGeta. Symbole do tych pierwszych można niby pobrać z Microsoft Symbol Server, ale do tych drugich przydaje się już dotPeek. Jak się okazuje, narzędzie to potrafi generować pliki PDB dla dowolnych zestawów .NET. To może być przydatne, np. w sytuacji, gdy chcemy debugować kod firmy trzeciej, która nie dostarczyła nam symboli debugowania ani kodu źródłowego. (Albo, gdy zgubimy źródła własnej aplikacji. ;))
Co jest potrzebne
Do debugowania dowolnych bibliotek dll w Visual Studio przy pomocy dotPeeka potrzebne są:
- Visual Studio
- dotPeek
- Dużo czasu na eksperymenty albo przeczytanie tego posta.
Debugowanie kodu .NET frameworka z GAC
W Tools
-> Options
-> Debugging
trzeba przede wszystkim:
- Odznaczyć
Just My Code
. - Zaznaczyć
Enable .NET Framework source stepping
. - Zaznaczyć
Enable source server support
. - Odznaczyć
Require source files to exactly match the original version
.
Powinno to wyglądać jak na poniższym obrazku:
Debugowanie kodu zewnętrznego (czyli np. paczek NuGeta)
Tu procedura jest nieco bardziej skomplikowana
- Uruchamiamy dotPeeka.
- Z menu
File
wybieramyOpen
. - Odszukujemy na dysku plik(i)
dll
interesującej nas biblioteki. W przypadku paczki NuGeta z ASP.NET MVC będzie to katalogpackages\Microsoft.AspNet.Mvc.5.2.3\lib\net45
. Okno aplikacji powinno wyglądać tak: - Z menu
Tools
wybieramy pozycjeOptions
a następnieSymbol Server
. Zaznaczamy tam pozycjęAssemblies opened in the Assembly Explorer
. Możemy też zmienić numer portu, jeśli domyślny nam nie odpowiada. Okno ustawień wygląda tak: - Wybieramy
Tools
->Symbols Server
, aby wystartować serwer symboli. Upewniamy się, że czerwony kwadracik na przycisku zmienił się w zielony trójkącik. :) - Teraz wracamy do Visual Studio i uruchamiamy
Tools
->Options
->Debugging
->Symbols
. Tam klikamy przycisk dodawania nowego źródła symboli (zaznaczony na poniższym obrazku ramką) i wpisujemyhttp://localhost:33417/
(albo inny port skonfigurowany dla dotPeeka). Podajemy też ścieżkę dlaCache symbols in this directory:
Efekt ma wyglądać tak: - Teraz już możemy zaczynać debugowanie. Po uruchomieniu aplikacji w trybie debugowania, Visual Studio zacznie ściągać symbole z Microsoftu oraz z dotPeeka. dotPeek w trakcie pracy będzie wyglądał tak: Żółte ikonki ostrzeżeń oznaczają, że tych plików nie było w Assembly Explorerze, więc zgodnie z ustawieniami nie są generowane.
Uwagi końcowe
- Pierwsze uruchomienie aplikacji w trybie
debug
może potrwać dość długo. Pobieranie i generowanie symboli trwa pewien czas, nie należy się niepokoić nawet, jeśli będzie to kilkanaście minut. - Nie daję żadnej gwarancji, że to zadziała. Mi się udało to wszystko uruchomić i zgrać ze sobą dopiero po kilkunastu próbach.
- Po tym, jak Visual Studio zapisze sobie symbole do cachu, następnym razem nie musimy uruchamiać dotPeeka. (Oczywiście dopóki nie będziemy chcieli debugować innych bibliotek.)