Zine.net online

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

mgrzeg.net - Admin on Rails :)

Debuggowanie ze źródłami - why, Microsoft?!

W poprzedniej notce zademonstrowałem przykład debuggowania poawaryjnego ze źródłami, jednak na czytelników czekała zręczna pułapka. Nie ja jednak za nią stoję, ale o tym za chwilę.

Debuggowanie ze źródłami lokalnymi

Spróbujmy uruchomić zwykłą sesję debuggera ze źródłami, na bazie przykładu wałkowanego od kilku wpisów. Dla czytelności nie skorzystamy z serwera symboli oraz źródeł, choć efekt byłby identyczny do opisanego poniżej.
Rozpoczynamy od sprawdzenia symboli i źródeł

0:000> .restart
0:000> .sympath
Symbol search path is: C:\Roboczy\Programming\Projects\Dom\MiscTests\PDBTester\bin\Debug;srv*C:\websymbols*http://msdl.microsoft.com/downloads/symbols
0:000> .srcpath
Source search path is: C:\Roboczy\Programming\Projects\Dom\MiscTests\PDBTester

Tak więc symbole żywcem ładujemy z katalogu z symbolami, podobnie źródła. Zaciągamy zatem plik z symbolami i dalej już normalnie ładujemy rozszerzenia dla kodu zarządzanego

0:000> .reload /f pdbtester.exe
0:000> sxe ld:mscorlib
0:000> g
ModLoad: 78fe0000 79ad8000   C:\Windows\assembly\NativeImages_v2.0.50727_32\mscorlib\fe70d777535c215f4fe9f9def2b4c815\mscorlib.ni.dll
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=7efdd000 edi=0040e6d8
eip=7736fc52 esp=0040e5ac ebp=0040e600 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!ZwMapViewOfSection+0x12:
7736fc52 83c404          add     esp,4
0:000> .loadby sos mscorwks
0:000> .load sosex

Sprawdźmy symbole

0:000> lm m pdb*
start    end        module name
01260000 01268000   PDBTester   (private pdb symbols)  C:\Roboczy\Programming\Projects\Dom\MiscTests\PDBTester\bin\Debug\PDBTester.pdb

Dochodzimy do meritum sprawy. Ustawiamy sobie dwie pułapki: pierwszą (0) na początku metody Main, drugą w 10 linii kodu pliku PDBTesterMain.cs

0:000> !mbm pl.net.zine.Articles.Program.Main
The breakpoint could not be resolved immediately.
Further attempts will be made as modules are loaded.
0:000> !mbp PDBTesterMain.cs 10
0:000> !mbl
0 eu: *!PL.NET.ZINE.ARTICLES.PROGRAM.MAIN ILOffset=0: pass=1 oneshot=false thread=ANY
1 eu: PDBTesterMain.cs, line 10: pass=1 oneshot=false thread=ANY

Puszczamy wykonanie i obserwujemy co się będzie działo

0:000> g
0:000> g
CLR notification: module 'mscorlib.resources' loaded
(98.11d8): CLR notification exception - code e0444143 (first chance)
*** ERROR: Module load completed but symbols could not be loaded for C:\Windows\assembly\GAC_MSIL\mscorlib.resources\2.0.0.0_pl_b77a5c561934e089\mscorlib.resources.dll
CLR notification: module 'PDBTester' loaded
(98.11d8): CLR notification exception - code e0444143 (first chance)
Breakpoint: Matching method pl.net.zine.Articles.Program.Main resolved, but not yet jitted. Setting JIT notification...
CLR notification: method 'pl.net.zine.Articles.Program.Main(System.String[])' code generated
(98.11d8): CLR notification exception - code e0444143 (first chance)
Breakpoint: JIT notification received for method pl.net.zine.Articles.Program.Main(System.String[]).
Breakpoint set at pl.net.zine.Articles.Program.Main(System.String[]).
Breakpoint set at pl.net.zine.Articles.Program.Main(System.String[]).
Breakpoint 0 hit
eax=0019338c ebx=0040ef5c ecx=026ed094 edx=00000000 esi=0054c590 edi=00000000
eip=0046008c esp=0040ef28 ebp=0040ef30 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
PDBTester!pl.net.zine.Articles.Program.Main(System.String[])+0x1c:
0046008c 90              nop

W tym momencie ładuje nam się plik z kodem, a w nim pięknie podświetlone miejsca, dla których poustawialiśmy pułapki (Rys. 1).

Rys. 1. WinDbg ładuje plik źródłowy oraz pokazuje usatwione pułapki

Słyszę jednak czyjść wyraźny głos: "Zaraz, moment - coś nie tak! Nie ładuje się! A okno WinDbg wygląda inaczej" (Rys. 2)

Rys. 2. Z jakiegoś powodu WinDbg nie ładuje źródeł

Ok, zatem załadujmy ręcznie plik ze źródłami i ustawmy kursor na którejś linii, po czym przechodzimy kod krok po kroku (Rys. 3)

Rys. 3. Przechodzenie kod krok po kroku działa bardzo dobrze!

Ten sam głos: "Nie, u mnie to wygląda inaczej! Mam błąd i w ogóle nic nie działa!" (Rys. 4)

Rys. 4. Problem z ustawieniem pułapki i dalszą analizą

Tajemniczy komunikat błędu, zaznaczony na Rys. 4 na czerwono, który otrzymujemy po próbie wykonania kolejnej instrukcji brzmi mniej więcej tak:

0:000> p
Unable to insert breakpoint 2 at 01260017, Win32 error 0n998
    "Nieprawidłowy dostęp do lokalizacji w pamięci."
bp2 at 01260017 failed

Czas na wyjaśnienia

Skąd tak duża różnica? Przyjrzyjmy się uważniej powyższym zrzutom, a dokładniej paskom tytułowym okna debuggera. Wszystko jasne?
Tak, w wersji 6.7.5.0 z 2007 r. Microsoft umożliwił debuggowanie kodu zarządzanego ze źródłami. I tylko w tej wersji - wszystkie wcześniejsze oraz późniejsze nie dawały takich możliwości. Dlaczego? To już nie do mnie pytanie, ja mogę się tylko domyślać, a sam Microsoft twierdzi, że nigdy nie wspierał takiej funkcjonalności, być może w przyszłości...

Debuggowanie ze źródłami w repozytorium SVN

Na koniec jeszcze przykład debuggowania w cudownej wersji 6.7.5.0 z symbolami i źródłami pobieranymi z odpowiednich serwerów.

Wykonujemy wszystkie kroki podobnie jak poprzednio, tym razem ustawiając jednak jako serwer symboli lokalny katalog, a źródeł jako srv*:

0:000> .sympath+ c:\dev\symbols\pri
Symbol search path is: srv*C:\websymbols*http://msdl.microsoft.com/downloads/symbols;c:\dev\symbols\pri
0:000> .sympath
Symbol search path is: srv*C:\websymbols*http://msdl.microsoft.com/downloads/symbols;c:\dev\symbols\pri
0:000> .srcpath srv*
Source search path is: srv*

Rozpoczynamy normalne debuggowanie:

0:000> sxe ld:mscorlib
0:000> g
ModLoad: 04680000 05178000   C:\Windows\assembly\NativeImages_v2.0.50727_32\mscorlib\fe70d777535c215f4fe9f9def2b4c815\mscorlib.ni.dll
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=7efdd000 edi=0027e7cc
eip=7736fc52 esp=0027e6a0 ebp=0027e6f4 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!ZwMapViewOfSection+0x12:
7736fc52 83c404          add     esp,4
0:000> .loadby sos mscorwks
0:000> .load sosex
0:000> !mbm pl.net.zine.Articles.Program.Main
The breakpoint could not be resolved immediately.
Further attempts will be made as modules are loaded.

Puszczamy wykonanie

0:000> g
CLR notification: module 'mscorlib' loaded
(2168.22e0): CLR notification exception - code e0444143 (first chance)
CLR notification: module 'sorttbls.nlp' loaded
(2168.22e0): CLR notification exception - code e0444143 (first chance)
CLR notification: module 'sortkey.nlp' loaded
(2168.22e0): CLR notification exception - code e0444143 (first chance)
ModLoad: 73a80000 73ad0000   C:\Windows\assembly\GAC_MSIL\mscorlib.resources\2.0.0.0_pl_b77a5c561934e089\mscorlib.resources.dll
eax=00000000 ebx=00000000 ecx=00000002 edx=00000000 esi=7efdd000 edi=0027dbd4
eip=7736fc52 esp=0027daa8 ebp=0027dafc iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!ZwMapViewOfSection+0x12:
7736fc52 83c404          add     esp,4
0:000> g
CLR notification: module 'mscorlib.resources' loaded
(2168.22e0): CLR notification exception - code e0444143 (first chance)
CLR notification: module 'PDBTester' loaded
(2168.22e0): CLR notification exception - code e0444143 (first chance)
Breakpoint: Matching method pl.net.zine.Articles.Program.Main resolved, but not yet jitted. Setting JIT notification...
CLR notification: method 'pl.net.zine.Articles.Program.Main(System.String[])' code generated
(2168.22e0): CLR notification exception - code e0444143 (first chance)
Breakpoint: JIT notification received for method pl.net.zine.Articles.Program.Main(System.String[]).
Breakpoint set at pl.net.zine.Articles.Program.Main(System.String[]).
Breakpoint 0 hit
eax=002a338c ebx=0027f05c ecx=026fd094 edx=00000000 esi=0066c6d8 edi=00000000
eip=003f008c esp=0027f028 ebp=0027f030 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
PDBTester!pl.net.zine.Articles.Program.Main(System.String[])+0x1c:
003f008c 90              nop

po czym WinDbg trafia na ustawioną pułapkę i prosi nas o zgodę na pobranie źródeł z serwera (Rys. 5)

Rys. 5. Ostrzeżenie o konieczności wykonania zewnętrznego polecenia

Zgadzamy się, a w rezultacie WinDbg otwiera okno z kodem oraz pozwala na krokowe przechodzenie linia-po-linii przez cały kod (Rys. 6)

Rys. 6. I tym razem praca z WinDbg jest miła i przyjemna :)

W przypadku kodu znajdującego się na serwerze http (tak, jak to miało miejsce w przykładzie z zrzutem) wszystko przebiega podobnie, jednak nie jesteśmy proszeni o zgodę na pobranie pliku oraz nie jest tworzony lokalny cache źródeł (a przynajmniej ja tego nie zauważyłem).

Ciekaw jestem, czy Waszym zdaniem brak 'zintegrowanego' wsparcia dla kodu zarządzanego w WinDbg to duża strata, czy spokojnie można się bez tego obejść?

Opublikowane 18 sierpnia 2011 18:15 przez mgrzeg

Powiadamianie o komentarzach

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

Subskrybuj komentarze za pomocą RSS

Komentarze:

 

dotnetomaniak.pl said:

Dziękujemy za publikację - Trackback z dotnetomaniak.pl

sierpnia 19, 2011 06:51

Co o tym myślisz?

(wymagane) 
(opcjonalne)
(wymagane) 

  
Wprowadź kod: (wymagane)
Wyślij

Subskrypcje

W oparciu o Community Server (Personal Edition), Telligent Systems