Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00101 015624 13842824 na godz. na dobę w sumie
Debugowanie .NET. Zaawansowane techniki diagnostyczne - książka
Debugowanie .NET. Zaawansowane techniki diagnostyczne - książka
Autor: Liczba stron: 528
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-2721-9 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> .net - programowanie
Porównaj ceny (książka, ebook, audiobook).

Sprawdź, jak rozwiązują problemy najlepsi specjaliści!

Czy znasz programistę, który nigdy w życiu nie użył debuggera? Dzisiejsze rozbudowane i skomplikowane systemy informatyczne wymagają znakomitej znajomości zaawansowanych narzędzi diagnostycznych. Bez nich wykrycie nawet najprostszego potknięcia mogłoby zająć długie godziny, jeśli nie dni, a poświęcony czas wcale nie gwarantowałby sukcesu. Niestety, posługiwanie się zaawansowanymi narzędziami wymaga równie zaawansowanej wiedzy. Jeśli nie masz pewności, czy zgromadziłeś już wszystkie potrzebne Ci informacje, sięgnij po tę książkę - pozwoli to błyskawicznie uzupełnić brakujące dane!

W pierwszej części książki będziesz mógł zapoznać się z podstawami programowania oraz narzędziami wykorzystywanymi w codziennej pracy programisty. Poznasz między innymi metody sterowania wykonywaniem programu, techniki inspekcji obiektowej, sposoby operowania na wątkach oraz polecenia diagnostyczne platformy .NET. Część druga zawiera obszerny zakres informacji dotyczących praktycznych aspektów diagnostyki oprogramowania. Dowiesz się, jak wykrywać błędy w zarządzaniu stertą, jak rozwiązywać kłopoty z pamięcią oraz jak radzić sobie z najbardziej skomplikowanymi problemami dotyczącymi wątków. Na samym końcu zapoznasz się z zaawansowanymi zagadnieniami diagnostyki oprogramowania, takimi jak usługi raportowania błędów, pliki obrazu oraz wyczerpujące opisy najlepszych narzędzi. W książce '.

W 'Debugowanie .NET. Zaawansowane techniki diagnostyczne' znajdziesz między innymi takie zagadnienia:

Twórz niezawodne oprogramowanie!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Idź do • Spis treści • Przykładowy rozdział Katalog książek • Katalog online • Zamów drukowany katalog Twój koszyk • Dodaj do koszyka Cennik i informacje • Zamów informacje o nowościach • Zamów cennik Czytelnia • Fragmenty książek online Kontakt Helion SA ul. Kościuszki 1c 44-100 Gliwice tel. 32 230 98 63 e-mail: helion@helion.pl © Helion 1991–2010 Debugowanie .NET. Zaawansowane techniki diagnostyczne Autor: Mario Hewardt Tłumaczenie: Łukasz Piwko ISBN: 978-83-246-2721-9 Tytuł oryginału: Advanced .NET Debugging Format: 168×237, stron: 528 Sprawdź, jak rozwiązują problemy najlepsi specjaliści! • Jak stworzyć niezawodny kod? • Jak rozwiązywać problemy z synchronizacją wątków? • Jak wykorzystać usługę raportowania błędów? Czy znasz programistę, który nigdy w życiu nie użył debuggera? Dzisiejsze rozbudowane i skomplikowane systemy informatyczne wymagają znakomitej znajomości zaawansowanych narzędzi diagnostycznych. Bez nich wykrycie nawet najprostszego potknięcia mogłoby zająć długie godziny, jeśli nie dni, a poświęcony czas wcale nie gwarantowałby sukcesu. Niestety, posługiwanie się zaawansowanymi narzędziami wymaga równie zaawansowanej wiedzy. Jeśli nie masz pewności, czy zgromadziłeś już wszystkie potrzebne Ci informacje, sięgnij po tę książkę – pozwoli to błyskawicznie uzupełnić brakujące dane! W pierwszej części książki będziesz mógł zapoznać się z podstawami programowania oraz narzędziami wykorzystywanymi w codziennej pracy programisty. Poznasz między innymi metody sterowania wykonywaniem programu, techniki inspekcji obiektowej, sposoby operowania na wątkach oraz polecenia diagnostyczne platformy .NET. Część druga zawiera obszerny zakres informacji dotyczących praktycznych aspektów diagnostyki oprogramowania. Dowiesz się, jak wykrywać błędy w zarządzaniu stertą, jak rozwiązywać kłopoty z pamięcią oraz jak radzić sobie z najbardziej skomplikowanymi problemami dotyczącymi wątków. Na samym końcu zapoznasz się z zaawansowanymi zagadnieniami diagnostyki oprogramowania, takimi jak usługi raportowania błędów, pliki obrazu oraz wyczerpujące opisy najlepszych narzędzi. W książce „Debugowanie .NET. Zaawansowane techniki diagnostyczne” znajdziesz między innymi takie zagadnienia: • Podstawowe informacje o dostępnych narzędziach • Podstawy CLR • Techniki diagnostyczne – sterowanie wykonaniem programu, punkty wstrzymania • Inspekcja obiektowa oraz inspekcja kodu • Dostępne polecenia wewnętrzne CLR oraz polecenia diagnostyczne • Techniki odzyskiwania pamięci • Rozwiązywanie problemów z synchronizacją wątków • Metody diagnozowania wycieków interoperacyjności • Wykorzystanie plików obrazu • Generowanie zrzutów z wykorzystaniem debuggera • Wykorzystanie usługi raportowania błędów • Dostępne dodatkowe narzędzia, wspierające proces diagnostyczny Twórz niezawodne oprogramowanie! SPIS TREŚCI Przedmowa ...........................................................................17 Wstęp ....................................................................................19 Podziękowania .....................................................................29 O autorze ..............................................................................31 CZĘŚĆ I PODSTAWY ...................................................................................33 Rozdział 1. Podstawowe wiadomości o narzędziach ..............................35 Debugging Tools for Windows ................................................................................ 36 .NET 2.0 — Redistributable ........................................................................................ 37 .NET 2.0 — SDK .............................................................................................................. 38 SOS ..................................................................................................................................... 40 SOSEX ................................................................................................................................ 42 CLR Profiler ...................................................................................................................... 43 Mierniki wydajności ...................................................................................................... 46 Reflector for .NET ........................................................................................................... 47 PowerDbg ........................................................................................................................ 48 Managed Debugging Assistants .............................................................................. 50 Podsumowanie .............................................................................................................. 53 Rozdział 2. Podstawy CLR .......................................................................55 Przegląd wysokopoziomowy .................................................................................... 55 CLR i program ładujący Windows ............................................................................ 59 Ładowanie obrazów rodzimych ........................................................................ 60 Ładowanie zestawów .NET .................................................................................. 62 Domeny aplikacji ........................................................................................................... 66 Systemowa domena aplikacji ............................................................................ 69 Wspólna domena aplikacji ......................................................................................... 70 Domyślna domena aplikacji ............................................................................... 70 7 8 S P I S T R E ¥ C I Zestawy ............................................................................................................................ 70 Manifest zestawu .......................................................................................................... 72 Metadane typu ........................................................................................................ 74 Tabela bloku synchronizacji ............................................................................... 81 Uchwyt do typu ...................................................................................................... 85 Deskryptory metod ................................................................................................ 92 Moduły ....................................................................................................................... 93 Tokeny metadanych .............................................................................................. 96 EEClass ....................................................................................................................... 98 Podsumowanie ............................................................................................................100 Rozdział 3. Podstawowe techniki diagnostyczne .................................101 Debuger i proces docelowy debugera ................................................................101 Symbole .........................................................................................................................106 Sterowanie wykonywaniem programu ...............................................................109 Przerywanie wykonywania ...............................................................................109 Wznawianie wykonywania ................................................................................110 Przemierzanie kodu .............................................................................................112 Kończenie sesji diagnostycznej .......................................................................116 Ładowanie rozszerzeń kodu zarządzanego .......................................................116 Ładowanie rozszerzenia SOS ............................................................................118 Ładowanie rozszerzenia SOSEX .......................................................................120 Kontrolowanie procesu debugowania CLR .......................................................121 Ustawianie punktów wstrzymania ........................................................................121 Punkty wstrzymania na funkcjach skompilowanych przez kompilator JIT ............................................................................................124 Punkty wstrzymania na funkcjach jeszcze nieskompilowanych ..........127 Punkty wstrzymania w zestawach prekompilowanych ..........................130 Punkty wstrzymania na metodach uogólnionych ....................................133 Inspekcja obiektowa ..................................................................................................134 Zrzucanie pamięci surowej ...............................................................................137 Zrzuty typów wartościowych ...........................................................................140 Zrzuty podstawowych typów referencyjnych ............................................146 Zrzuty tablic ...........................................................................................................147 Zrzuty obiektów na stosie .................................................................................153 Sprawdzanie rozmiarów obiektów ................................................................155 Zrzuty wyjątków ...................................................................................................156 Operacje na wątkach .................................................................................................161 Polecenie ClrStack ................................................................................................162 Polecenie Threads ................................................................................................165 Polecenie DumpStack .........................................................................................169 Polecenie EEStack ................................................................................................171 COMState ................................................................................................................171 Inspekcja kodu .............................................................................................................172 Dezasemblacja kodu ...........................................................................................172 Wydobywanie deskryptora metod z adresu kodu ....................................174 Wyświetlanie instrukcji języka pośredniego ...............................................175 S P I S T R E ¥ C I 9 Polecenia wewnętrzne CLR .....................................................................................175 Sprawdzanie wersji CLR .....................................................................................176 Znajdowanie deskryptora metod po nazwie ..............................................176 Wykonywanie zrzutu bloku synchronizacji obiektu .................................177 Wykonywanie zrzutu tabeli metod obiektu ................................................177 Wykonywanie zrzutu informacji o stercie zarządzanej i systemie odzyskiwania pamięci ....................................................................178 Polecenia diagnostyczne ..........................................................................................178 Znajdowanie domeny aplikacji obiektu .......................................................179 Informacje o procesie .........................................................................................179 Polecenia rozszerzenia SOSEX ................................................................................180 Rozszerzona obsługa punktów wstrzymania .............................................180 Zarządzane metadane ........................................................................................184 Dane stosu ..............................................................................................................185 Inspekcja obiektów ..............................................................................................187 Automatyczne wykrywanie zakleszczeń ......................................................188 Polecenia dotyczące sterty zarządzanej i systemu odzyskiwania pamięci .....................................................................190 Zapisywanie zrzutów awaryjnych w plikach ......................................................192 Podsumowanie ............................................................................................................194 CZĘŚĆ II DIAGNOSTYKA STOSOWANA ...............................................................195 Rozdział 4. Program ładujący zestawy ..................................................197 Informacje wstępne ...................................................................................................197 Tożsamość zestawu .............................................................................................198 Globalny bufor zestawów ..................................................................................202 Domyślny kontekst ładowania ........................................................................205 Kontekst „load-from” ..........................................................................................206 Kontekst „load-without” ....................................................................................207 Prosty błąd ładowania zestawu ..............................................................................207 Błąd kontekstu ładowania ........................................................................................214 Interoperacyjność i wyjątek DllNotFoundException ......................................222 Debugowanie LCG ......................................................................................................224 Podsumowanie ............................................................................................................229 Rozdział 5. Sterta zarządzana i odzyskiwanie pamięci .........................231 Architektura pamięci systemu Windows ............................................................232 Alokowanie pamięci ............................................................................................236 System odzyskiwania pamięci ................................................................................241 Pokolenia .................................................................................................................242 Korzenie ...................................................................................................................251 Finalizacja ................................................................................................................258 10 S P I S T R E ¥ C I Odzyskiwanie pamięci ........................................................................................267 Sterta obiektów dużych .....................................................................................269 Unieruchamianie obiektów ..............................................................................274 Tryby odzyskiwania pamięci .............................................................................280 Diagnozowanie uszkodzonej sterty zarządzanej .............................................281 Diagnozowanie fragmentacji sterty zarządzanej .............................................289 Diagnozowanie wyjątków braku pamięci ..........................................................298 Podsumowanie ............................................................................................................316 Rozdział 6. Synchronizacja ...................................................................317 Podstawy synchronizacji ..........................................................................................317 Mechanizmy synchronizacji wątków ....................................................................318 Zdarzenia ................................................................................................................323 Muteksy ...................................................................................................................325 Semafory .................................................................................................................326 Monitory ..................................................................................................................327 ReaderWriterLock(Slim) ......................................................................................328 Pula wątków ...........................................................................................................330 Wewnętrzne mechanizmy synchronizacji ..........................................................331 Nagłówek obiektu ................................................................................................331 Bloki synchronizacji .............................................................................................333 Blokady lekkie ........................................................................................................337 Scenariusze synchronizacji ......................................................................................341 Proste zakleszczenie ............................................................................................341 Wyjątki blokad porzuconych ............................................................................349 Anulowanie wątków ...........................................................................................354 Zawieszenie finalizatora .....................................................................................358 Podsumowanie ............................................................................................................366 Rozdział 7. Interoperacyjność ...............................................................369 P/Invoke .........................................................................................................................369 Interoperacyjność COM ............................................................................................376 Opakowanie wywoływane w czasie wykonywania ..................................377 Diagnozowanie wywołań P/Invoke ......................................................................382 Konwencje wywoływania ..................................................................................383 Delegaty ..................................................................................................................388 Diagnozowanie wycieków interoperacyjności .................................................396 Diagnozowanie finalizacji interoperacyjności COM ........................................402 Podsumowanie ............................................................................................................411 S P I S T R E ¥ C I 11 CZĘŚĆ III TECHNIKI ZAAWANSOWANE ...............................................................413 Rozdział 8. Debugowanie poawaryjne ..................................................415 Pliki obrazu — podstawowe wiadomości ..........................................................416 Generowanie zrzutów przy użyciu debugera .............................................418 Generowanie plików zrzutu za pomocą narzędzia ADPlus ....................425 Diagnozowanie plików zrzutu .........................................................................427 Warstwa dostępu do danych ...........................................................................428 Analizowanie plików zrzutu — nieobsłużone wyjątki .NET ...................432 Usługa raportowania błędów .................................................................................433 Architektura usługi Windows Error Reporting ...........................................434 Podsumowanie ............................................................................................................461 Rozdział 9. Narzędzia dodatkowe .........................................................463 PowerDbg ......................................................................................................................463 Instalowanie narzędzia PowerDbg .................................................................464 Polecenie Analyze-PowerDbgThreads ..........................................................466 Polecenie Send-PowerDbgCommand ..........................................................467 Rozszerzanie PowerDbg ....................................................................................469 Visual Studio .................................................................................................................472 Integracja z SOS ....................................................................................................472 Debugowanie platformy .NET na poziomie kodu źródłowego ............476 Visual Studio 2010 ................................................................................................479 Program profilujący CLR ...........................................................................................484 Uruchamianie programu profilującego CLR ...............................................484 Widok podsumowania .......................................................................................486 Widoki histogramu ..............................................................................................488 Widoki wykresów .................................................................................................489 WinDbg i polecenie cmdtree ..................................................................................491 Podsumowanie .............................................................................................................493 Rozdział 10. CLR 4.0 ................................................................................495 Narzędzia .......................................................................................................................495 Debugging Tools for Windows ........................................................................496 Pakiet .NET 4.0 Redistributable ........................................................................496 SOS ............................................................................................................................496 Sterta zarządzana i odzyskiwanie pamięci .........................................................497 Rozszerzone narzędzia diagnostyczne .........................................................498 Odzyskiwanie pamięci w tle .............................................................................503 12 S P I S T R E ¥ C I Synchronizacja .............................................................................................................504 Pula wątków i zadań ............................................................................................505 Monitor ....................................................................................................................505 Bariera ......................................................................................................................506 Klasa CountdownEvent ......................................................................................507 Klasa ManualResetEventSlim ...........................................................................507 Klasa SemaphoreSlim .........................................................................................507 Klasy SpinWait i SpinLock ..................................................................................507 Interoperacyjność .......................................................................................................508 Debugowanie poawaryjne ......................................................................................509 Podsumowanie ............................................................................................................510 Skorowidz ...........................................................................511 R O Z D Z I A ’ 8 DEBUGOWANIE POAWARYJNE W poprzednich dwóch czÚĂciach ksiÈĝki poznaliĂmy wiele znakomitych na- rzÚdzi wspomagajÈcych w pracy programistÚ diagnozujÈcego aplikacje. Na- rzÚdzia te naleĝy wïÈczyÊ do procesu rozwoju oprogramowania, aby zapewniÊ jak najwyĝszy stopieñ jego niezawodnoĂci. Mimo iĝ wszystkie te narzÚdzia stanowiÈ doskonaïÈ pomoc w znajdowaniu bïÚdów poprzez automatyzowanie procesu ich wyszukiwania, nie gwarantujÈ, ĝe gotowy produkt bÚdzie ab- solutnie bezbïÚdny. Po dostarczeniu programu do uĝytkowników problemy pojawiÈ siÚ na pewno i najprawdopodobniej stanie siÚ to w najmniej oczekiwanym mo- mencie — najczÚĂciej podczas pracy uĝytkownika. W zaleĝnoĂci od rodzaju bïÈd moĝe caïkowicie zniechÚciÊ uĝytkownika do dalszego korzystania z programu lub tylko nieco uprzykrzyÊ mu ĝycie. W obu tych przypadkach moĝna siÚ spodziewaÊ telefonu od zdenerwowanego klienta ĝÈdajÈcego wy- jaĂnieñ, czemu jego produkt nie dziaïa tak, jak powinien. JednÈ z moĝliwoĂci w takiej sytuacji jest poproszenie go o zdalny dostÚp do jego komputera. Mimo iĝ czasami jest to moĝliwe, uĝytkownicy najczÚĂciej podchodzÈ do tego niechÚtnie i nie zgadzajÈ siÚ na takie rozwiÈzanie. Powodów, dla których klienci nie chcÈ umoĝliwiaÊ dostÚpu do swoich komputerów, jest wiele. Poniĝej przedstawiam kilka najczÚstszych z nich: „ Zasady ustalone w firmie nie pozwalajÈ na przyjmowanie poïÈczeñ przychodzÈcych. „ Zdalne diagnozowanie wymaga podïÈczenia debugera do jednego lub wiÚkszej liczby procesów, co oznacza przestój w pracy. JeĂli proces, który ma zostaÊ zdiagnozowany, dziaïa na waĝnym serwerze, klient nie bÚdzie chciaï zaakceptowaÊ na nim przestoju. „ Diagnozowanie procesu poprzez tryb uĝytkownika lub jÈdra oznacza, ĝe programiĂci majÈ peïny dostÚp do stanu urzÈdzenia, wïÈcznie z za- wartoĂciÈ jego pamiÚci. Niektórzy uĝytkownicy mogÈ obawiaÊ siÚ w takim przypadku naruszenia prywatnoĂci. 415 416 R O Z D Z I A ’ 8 . D E B U G O W A N I E P O A W A R Y J N E JeĂli klient odmówi dostÚpu zdalnego, a odtworzenie problemu na lokal- nym komputerze jest niemoĝliwe, to czy w ogóle da siÚ coĂ zrobiÊ? Tak, naleĝy wówczas zastosowaÊ techniki tzw. debugowania poawaryjnego (ang. postmortem debugging). Proces ten skïada siÚ z nastÚpujÈcych etapów: 1. Wywoïanie awarii. 2. Wykonanie zrzutu (obrazu) stanu systemu w chwili awarii (albo — w niektórych przypadkach — przed awariÈ i po niej). 3. Przesïanie zrzutu do przeanalizowania specjalistom. W tym rozdziale zostaïy opisane róĝne sposoby wykonywania takich zrzutów — czasami nazywanych plikami obrazu — róĝne rodzaje tych obra- zów oraz techniki ich analizowania. Ponadto poznamy znakomitÈ usïugÚ gromadzenia plików obrazu o nazwie Windows Error Reporting. Zaczniemy od podstawowych zagadnieñ zwiÈzanych z plikami obrazu. Pliki obrazu — podstawowe wiadomości Jak juĝ wiemy, plik obrazu stanowi reprezentacjÚ stanu okreĂlonego procesu. Pliki takie tworzy siÚ przede wszystkim w celu umoĝliwienia diagnozowania aplikacji, gdy nie ma moĝliwoĂci przeprowadzenia diagnostyki na dziaïajÈcym programie. Wygenerowany plik obrazu wysyïa siÚ do specjalisty, który anali- zuje jego zawartoĂÊ, nie majÈc dostÚpu do urzÈdzenia, na którym wystÈpiï problem. Praca ta polega na zapisaniu pliku na innym komputerze i analizo- waniu go za pomocÈ narzÚdzi do diagnozowania poawaryjnego debugera. Jakie informacje zawiera taki plik obrazu? To zaleĝy od sposobu jego utwo- rzenia. Wyróĝnia siÚ dwa gïówne rodzaje plików obrazu: „ peïne zrzuty, „ zrzuty minimalne. Peïny zrzut zawiera caïÈ przestrzeñ pamiÚci procesu, obraz pliku wy- konywalnego, tabelÚ uchwytów i inne informacje wykorzystywane przez debugery. Przy generowaniu peïnego zrzutu nie ma moĝliwoĂci wybierania, które informacje majÈ zostaÊ zapisane. Plik taki moĝna jednak przekonwer- towaÊ na zrzut minimalny za pomocÈ debugera. Minimalny plik zrzutu moĝe zawieraÊ róĝne informacje, których wybór jest dokonywany przez moduï generujÈcy. Plik taki moĝe zawieraÊ zarówno informacje o konkretnym wÈtku, jak i peïny opis obrazowanego procesu. P L I K I O B R A Z U — P O D S T A W O W E W I A D O M O ¥ C I 417 Moĝe to zabrzmi dziwnie, ale najwiÚkszy moĝliwy minimalny plik zrzutu moĝe zawieraÊ wiÚcej informacji niĝ zrzut peïny. Dlatego w tej czÚĂci roz- dziaïu skoncentrujÚ siÚ na zrzutach minimalnych. NarzÚdzia, za pomocÈ których moĝna generowaÊ takie pliki, zostaïy zwiÚěle opisane w tabeli 8.1. Tabela 8.1. Narzędzia do generowania zrzutów Nazwa Debugery Windows Debugery systemu Windows umoĝliwiajÈ tworzenie zrzutów Opis ADPlus Windows Error Reporting o róĝnych rozmiarach oraz pozwalajÈ kontrolowaÊ caïy proces generowania pliku ADPlus to skïadnik pakietu Debugging Tools for Windows. NarzÚdzie to moĝe dziaïaÊ jako monitor systemu wykonujÈcy zrzut w chwili wystÈpienia awarii lub zawieszenia. Ponadto program ten ma opcjÚ powiadamiania o wystÈpieniu awarii Windows Error Reporting to usïuga firmy Microsoft umoĝliwiajÈca zarejestrowanie siÚ w witrynie do raportowania bïÚdów. Gdy w którejĂ z aplikacji danego uĝytkownika wystÈpi awaria, z komputera, w którym ona dziaïa, wysyïany jest raport do witryny Windows Error Reporting (WER). NastÚpnie uĝytkownik moĝe pobraÊ ten raport z witryny WER wraz z plikiem zrzutu w celu jego przeanalizowania W tym podrozdziale nauczymy siÚ generowaÊ pliki obrazu za pomocÈ debugerów Windows i narzÚdzia ADPlus. Usïuga Windows Error Repor- ting zostanie opisana nieco dalej. W celu zilustrowania procesu tworzenia plików obrazu wykorzystamy przykïadowÈ prostÈ aplikacjÚ alokujÈcÈ pamiÚÊ na stercie, zapisujÈcÈ w niej dane i nastÚpnie ulegajÈcÈ awarii. Kod ěródïowy tej aplikacji znajduje siÚ na listingu 8.1. Listing 8.1. Prosty przykład aplikacji, która ulega awarii using System; using System.Text; using System.Runtime.InteropServices; namespace Advanced.NET.Debugging.Chapter8 { class SimpleExc { 418 R O Z D Z I A ’ 8 . D E B U G O W A N I E P O A W A R Y J N E static void Main(string[] args) { SimpleExc s = new SimpleExc(); s.Run(); } public void Run() { Console.WriteLine( NaciĂnij dowolny klawisz, aby rozpoczÈÊ ); Console.ReadKey(); ProcessData(null); } public void ProcessData(string data) { if (data == null) { throw new ArgumentException( Argument NULL ); } string s = Witaj: + data; } } } Kod ěródïowy i plik binarny powyĝszego programu znajdujÈ siÚ w nastÚ- pujÈcych lokalizacjach: „ Kod ěródïowy: C:ADNDChapter8SimpleExc „ Plik binarny: C:ADNDBin8SimpleExc.exe Powód awarii tej aplikacji powinien byÊ doĂÊ oczywisty. Wywoïanie funk- cji ProcessData powoduje zgïoszenie wyjÈtku ArgumentException, poniewaĝ zostaïa jej przekazana wartoĂÊ null. Na poczÈtek wygenerujemy zrzut za pomocÈ debugera. Generowanie zrzutów przy użyciu debugera Uruchom aplikacjÚ, której kod ěródïowy znajduje siÚ na listingu 8.1, i po- zwól jej dziaïaÊ do wystÈpienia wyjÈtku. … … … ModLoad: 77bb0000 77bb6000 C:Windowssystem32NSI.dll ModLoad: 79060000 790b6000 C:WindowsMicrosoft.NETFrameworkv2.0.50727 mscorjit.dll (1860.958): CLR exception - code e0434f4d (first chance) P L I K I O B R A Z U — P O D S T A W O W E W I A D O M O ¥ C I 419 (1860.958): CLR exception - code e0434f4d (!!! second chance !!!) eax=0020eaec ebx=e0434f4d ecx=00000001 edx=00000000 esi=0020eb74 edi=00416bd0 eip=767142eb esp=0020eaec ebp=0020eb3c iopl=0 nv up ei pl nz na po nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202 KERNEL32!RaiseException+0x58: 767142eb c9 leave 0:000 ..loadby sos mscorwks 0:000 !!ClrStack OS Thread Id: 0x958 (0) ESP EIP 0020ebc4 767142eb [HelperMethodFrame: 0020ebc4] 0020ec68 00e10177 Advanced.NET.Debugging.Chapter8.SimpleExc.ProcessData (System.String) 0020ec80 00e1010c Advanced.NET.Debugging.Chapter8.SimpleExc.Run() 0020ec88 00e100a7 Advanced.NET.Debugging.Chapter8.SimpleExc.Main (System.String[]) 0020eeac 79e7c74b [GCFrame: 0020eeac] W tym momencie wygenerujemy zrzut do przeanalizowania w trybie poawaryjnym. NajwaĝniejszÈ kwestiÈ do rozwiÈzania w przypadku genero- wania zrzutu jest podjÚcie decyzji, ile informacji zapisaÊ. Ogólna zasada jest taka, ĝe im wiÚcej danych znajduje siÚ w pliku obrazu, tym wiÚcej informacji bÚdziemy mieli do wykorzystania w pracy. Najwaĝniejszym czynnikiem ograniczajÈcym jest oczywiĂcie rozmiar pliku zrzutu. W niektórych przy- padkach, np. na serwerach o ostrych zasadach bezpieczeñstwa, utworzenie gigantycznego zrzutu jest niemoĝliwe i trzeba zadowoliÊ siÚ okrojonÈ iloĂciÈ informacji. Do utworzenia pliku obrazu sïuĝy polecenie .dump. Opcja /m tego po- lecenia oznacza, ĝe ma zostaÊ utworzony zrzut minimalny. Opis wszyst- kich opcji tego polecenia znajduje siÚ w tabeli 8.2. Oprócz opcji sterujÈcych wykonywaniem zrzutu naleĝy podaÊ jeszcze nazwÚ pliku, w którym zrzut zostanie zapisany. JeĂli nie zostanie okreĂlona peïna Ăcieĝka katalogu, w którym ma zostaÊ zapisany ten plik, zostanie on zapisany w katalogu uruchomieniowym debugera. Poniĝej znajduje siÚ przy- kïadowe polecenie wykonujÈce peïny zrzut pamiÚci i zapisujÈce plik w wy- branym katalogu. .dump /mf c:8dumpfile.dmp Uruchomimy polecenie .dump na naszej uszkodzonej aplikacji: 0:000 ..dump /mf 08dumpfile.dmp Creating dumpfile.dmp - mini user dump Dump successfully written 420 R O Z D Z I A ’ 8 . D E B U G O W A N I E P O A W A R Y J N E Tabela 8.2. Opcje polecenia .dump Opcja a f F h u t i p w d c r R Opis Generuje kompletny zrzut minimalny z wïÈczonymi wszystkimi opcjami. Zrzut taki zawiera peïne dane dotyczÈce pamiÚci, uchwytów, moduïu, podstawowe dane o pamiÚci oraz informacje na temat wÈtku. Równoznaczne z /mfFhut Generuje zrzut minimalny zawierajÈcy wszystkie dostÚpne i zastrzeĝone strony procesu Generuje zrzut minimalny zawierajÈcy podstawowe informacje o pamiÚci potrzebne debugerowi do odtworzenia caïej przestrzeni adresowej pamiÚci wirtualnej Generuje zrzut minimalny zawierajÈcy informacje o uchwytach Generuje zrzut minimalny zawierajÈcy informacje o niezaïadowanych moduïach. Opcja dostÚpna tylko w systemie Windows Server 2003 Generuje zrzut minimalny zawierajÈcy informacje czasowe dotyczÈce wÈtków. Informacje te to m.in. czas utworzenia oraz czas pracy w trybach uĝytkownika i jÈdra Generuje zrzut minimalny zawierajÈcy informacje o pamiÚci pomocniczej. PamiÚÊ pomocnicza to pamiÚÊ (oraz niewielki obszar jÈ otaczajÈcy) wskazywana przez wskaěnik stosu lub pamiÚÊ rezerwowÈ Generuje zrzut minimalny zawierajÈcy bloki Ărodowisk procesu i wÈtku Generuje zrzut minimalny zawierajÈcy wszystkie zastrzeĝone prywatne strony do zapisu i odczytu Generuje zrzut minimalny zawierajÈcy wszystkie segmenty danych obrazu Generuje zrzut minimalny zawierajÈcy segmenty kodu obrazu Generuje zrzut minimalny odpowiedni dla Ărodowisk o zaostrzonych wymogach dotyczÈcych prywatnoĂci. Opcja ta czyĂci (zastÚpuje zerami) wszystkie informacje niepotrzebne do odtworzenia stosu (wïÈcznie ze zmiennymi lokalnymi) Generuje zrzut minimalny odpowiedni dla Ărodowisk o zaostrzonych wymogach dotyczÈcych prywatnoĂci. Ta opcja usuwa peïne Ăcieĝki moduïów, uniemoĝliwiajÈc w ten sposób odtworzenie struktury katalogów Wygenerowany plik zrzutu powinien mieÊ rozmiar okoïo 64 MB. Plik ten naleĝy zaïadowaÊ w innej instancji debugera przy uĝyciu przeïÈcznika -z. Aby zaïadowaÊ wygenerowany przez nas plik, naleĝy napisaÊ nastÚpujÈce polecenie: c: ntsd –z 08dumpfile.dmp P L I K I O B R A Z U — P O D S T A W O W E W I A D O M O ¥ C I 421 Po wczytaniu pliku debuger wyĂwietli nastÚpujÈce dane: … … … Loading Dump File [c:8dumpfile.dmp] User Mini Dump File with Full Memory: Only application data is available Executable search path is: Windows Server 2008 Version 6001 (Service Pack 1) MP (2 procs) Free x86 compatible Product: WinNt, suite: SingleUserTS Debug session time: Mon Mar 2 06:25:10.000 2009 (GMT-8) System Uptime: 5 days 7:44:57.406 Process Uptime: 0 days 0:02:39.000 ........................... *** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll - This dump file has an exception of interest stored in it. The stored exception information can be accessed via .ecxr. (1860.958): CLR exception - code e0434f4d (first/second chance not available) eax=0020eaec ebx=e0434f4d ecx=00000001 edx=00000000 esi=0020eb74 edi=00416bd0 eip=767142eb esp=0020eaec ebp=0020eb3c iopl=0 nv up ei pl nz na po nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202 kernel32!RaiseException+0x58: 767142eb c9 leave W górnej czÚĂci powyĝszych danych znajdujÈ siÚ podstawowe informacje na temat wczytanego pliku zrzutu. WĂród nich jest lokalizacja pliku, jego typ oraz opis dostÚpnych danych. Kolejny interesujÈcy nas fragment znajduje siÚ bliĝej koñca. Jest to opis powodu wystÈpienia awarii (wyjÈtek CLR). MajÈc ten plik, moĝna zdiagnozowaÊ problem na dowolnym komputerze — bez dostÚpu do urzÈdzenia, na którym wystÈpiïa awaria. Szczegóïowy opis tech- nik wykonywania analizy poawaryjnej znajduje siÚ nieco dalej. JednÈ z wad techniki wykonywania zrzutów za pomocÈ debugera jest ko- niecznoĂÊ podïÈczenia go do ulegajÈcego awarii procesu. Moĝe siÚ wydawaÊ, ĝe to niewielki problem, ale wyobraě sobie, ĝe bïÈd wystÚpuje tylko raz na jakiĂ czas i nie udaïo siÚ trafiÊ z podïÈczeniem debugera wïaĂnie w tym czasie. Dobrze by byïo, gdybyĂmy mieli moĝliwoĂÊ nakazania systemowi Windows wykonania zrzutu, gdy wystÈpi awaria procesu. Taka moĝliwoĂÊ jest i technikÚ tÚ potocznie nazywa siÚ nastawieniem debugera poawaryjne- go. DomyĂlnym programem tego typu uĝywanym przez system Windows jest Dr Watson (wycofywany w Windows Vista i nowszych wersjach sys- temu na rzecz nowszej technologii). Dr Watson generuje plik zrzutu, gdy nastÈpi awaria procesu, i umoĝliwia wysïanie tego pliku do firmy Microsoft do analizy. Wykorzystywany debuger poawaryjny moĝna jednak zmieniÊ przy uĝyciu poleceñ wiersza poleceñ przedstawionych w tabeli 8.3. 422 R O Z D Z I A ’ 8 . D E B U G O W A N I E P O A W A R Y J N E Tabela 8.3. Ustawienia debugera poawaryjnego Polecenie WinDbg –I Wartość rejestru AedebugDebugger winDbg.exe -p ld –e ld -g cdb –iae cdb.exe -p ld -e ld –g ntsd –iae ntsd.exe –p ld -e ld –g drwtsn32 –i drwtsn32 -p ld -e ld –g Opis Ustawia WinDbg jako debuger poawaryjny. Naleĝy pamiÚtaÊ, ĝe litera -I musi byÊ wielka. Ustawia cdb jako debuger poawaryjny. Ustawia ntsd jako debuger poawaryjny. Ustawia program Dr Watson jako debuger poawaryjny. Generowanie pliku zrzutu W systemie Windows Vista wprowadzono ważną zmianę w stosunku do starszych wersji tego systemu, dotyczącą sposobu zapisywania plików zrzutu w lokalnej pamięci przez technologię raportowania błędów. W starszych wersjach systemu Windows wygenerowane pliki były domyślnie zapisywane w komputerze przez program Dr Watson. Dostęp do tych plików miał każdy, kto chciał przeprowadzić diagnozę określonego pliku. W systemie Windows Vista Dr Watson przeszedł na emeryturę, a jego miejsce zajął bardziej niezawodny mechanizm raportowania błędów. Ten nowy system przy domyślnych ustawieniach nie zapisuje plików zrzutu w pamięci lokalnej. Aby zmienić to domyślne ustawienie, należy ustawić wartość rejestru ForceQueue na 1. Powoduje to kolejkowanie wszystkich plików zrzutu w pamięci lokalnej przed ich wysłaniem do firmy Microsoft. Ścieżka w reje- strze do tej wartości jest następująca: HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsWindows Error Reporting Po ustawieniu wartości ForceQueue na 1 wszystkie pliki zrzutu będą zapisy- wane w następującej lokalizacji: Procesy działające w kontekście systemowym i podniesionym: ALLUSERSPROFILE MicrosoftWindowsWER[ReportQueue|ReportArchive] Pozostałe procesy: LOCALAPPDATA MicrosoftWindowsWER[ReportQueue|ReportArchive] P L I K I O B R A Z U — P O D S T A W O W E W I A D O M O ¥ C I 423 Co tak naprawdÚ dzieje siÚ w czasie wykonywania poleceñ z tabeli 8.3? Nic wielkiego. Polecenia te zmieniajÈ tylko wartoĂci niektórych kluczy reje- stru, które sÈ sprawdzane przez system Windows przy wykrywaniu awarii procesów. Poniĝej znajduje siÚ Ăcieĝka rejestru wykorzystywana do nasta- wiania debugera poawaryjnego: HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionAeDebug Klucz Aedebug dziaïa znakomicie w przypadku diagnozowania aplikacji rodzimych. Natomiast do sterowania procesem diagnozowania poawaryjnego aplikacji zarzÈdzanych sïuĝÈ dwie inne wartoĂci — DbgManagedDebugger i DbgJITDebugLaunchSetting. ZnajdujÈ siÚ one w nastÚpujÈcym kluczu: HKEY_LOCAL_MACHINESOFTWAREMicrosoft.NETFramework Wartość DbgManagedDebugger JeĂli debugowanie poawaryjne zostanie wïÈczone poprzez wartoĂÊ DbgJIT ´DebugLaunchSettings, wartoĂÊ rejestru DbgManagedDebugger okreĂla, który debuger ma zostaÊ uruchomiony w przypadku wystÈpienia nieobsïu- ĝonego wyjÈtku. Aby np. domyĂlnym debugerem uruchamianym w przy- padkach wystÈpienia nieobsïuĝonych wyjÈtków byï ntsd, wartoĂÊ rejestru DbgManagedDebugger naleĝy ustawiÊ nastÚpujÈco: c:program filesdebugging tools for windows (x86) tsd.exe -p ld Debuger okreĂlony w wartoĂci DbgManagedDebugger nie musi zostaÊ uruchomiony natychmiast po wystÈpieniu nieobsïuĝonego wyjÈtku. Zamiast tego zostanie wyĂwietlone okno dialogowe, w którym moĝna wybraÊ uru- chomienie debugera lub zamkniÚcie aplikacji. Jedno z najczÚĂciej zadawanych pytañ na temat debugowania poawa- ryjnego brzmi: jak wymusiÊ automatyczne generowanie zrzutu w odpowie- dzi na wystÈpienie awarii? Aby to zrobiÊ, naleĝy ustawiÊ wartoĂÊ rejestru DbgManagedDebugger w nastÚpujÈcy sposób: ntsd –pv –p ld –c .dump /u /ma Ăcieĝka do pliku zrzutu ; .kill; qd Powyĝsze ustawienie oznacza, ĝe jeĂli wystÈpi awaria, ma zostaÊ wïÈczony debuger ntsd oraz uruchomione polecenie wykonania zrzutu. NastÚpnie sesja ma zostaÊ zamkniÚta poprzez odïÈczenie debugera. Do precyzyjnego okreĂlania dziaïañ w przypadku wystÈpienia nieob- sïuĝonego wyjÈtku sïuĝy wartoĂÊ rejestru DbgJITDebugLaunchSetting opisana w nastÚpnym podrozdziale. 424 R O Z D Z I A ’ 8 . D E B U G O W A N I E P O A W A R Y J N E Wartość DbgJITDebugLaunchSetting WartoĂÊ rejestru DbgJITDebugLaunchSetting sïuĝy do okreĂlania dziaïañ w przypadku wystÈpienia nieobsïuĝonego wyjÈtku. JeĂli wartoĂÊ ta zostanie ustawiona na 0, w przypadku awarii bÚdzie wyĂwietlane okno dialogowe, w którym uĝytkownik bÚdzie mógï zdecydowaÊ, co robiÊ. Naleĝy pamiÚtaÊ, ĝe okno to jest wyĂwietlane tylko dla procesów interaktywnych (np. usïug), pozostaïe procesy bÚdÈ po prostu zamykane. Przykïadowe okno dialogowe przedstawiono na rysunku 8.1. Rysunek 8.1. Przykładowe okno dialogowe wyświetlone po awarii aplikacji zarządzanej Powyĝsze okno poawaryjne informuje o wystÈpieniu problemu w pro- gramie o nazwie 08SimpleExc.exe. Uĝytkownik moĝe siÚ w nim zdecydowaÊ na debugowanie programu (przycisk Debuguj) lub jego zamkniÚcie (przycisk Zamknij program). JeĂli zostanie naciĂniÚty przycisk Debuguj, system sprawdzi ustawienie wartoĂci DbgJITDebugLaunchSetting i uruchomi wyznaczony w niej debuger. JeĂli wartoĂÊ DbgJITDebugLaunchSetting zostanie ustawiona na 1, aplikacja, która ulegïa awarii, zostanie zamkniÚta i zostanie zwrócony zrzut stosu wywoïañ. JeĂli wartoĂÊ ta bÚdzie ustawiona na 2, zostanie uruchomiony debuger okreĂlony w wartoĂci DbgManagedDebugger bez wyĂwietlania ĝadnych okien dialogowych. Natomiast ustawienie wartoĂci DbgJITDebugLaunchSetting na 16 spowoduje wyĂwietlanie dla procesów interaktywnych okna opisanego powyĝej, a dla pozostaïych procesów — uruchomienie debugera okreĂlonego w wartoĂci DbgManagedDebugger. Mimo iĝ funkcje debugerów sÈ wystarczajÈce do wygenerowania od- powiedniego pliku zrzutu, dostÚpne jest jeszcze jedno narzÚdzie, które sïuĝy do generowania tych plików — ma ono nazwÚ ADPlus. P L I K I O B R A Z U — P O D S T A W O W E W I A D O M O ¥ C I 425 Generowanie plików zrzutu za pomocą narzędzia ADPlus ADPlus to narzÚdzie do monitorowania awarii procesów i automatyzowania generowania plików zrzutu z moĝliwoĂciÈ powiadamiania uĝytkownika lub komputera o zaistniaïej sytuacji. ADPlus to skrypt sterowany z wiersza po- leceñ. Firma Microsoft zaleca uruchamianie go przy uĝyciu interpretera cscript.exe. Oprócz opcji wiersza poleceñ ADPlus moĝna równieĝ konfigu- rowaÊ za pomocÈ plików konfiguracyjnych, które umoĝliwiajÈ bardziej pre- cyzyjne sterowanie dziaïaniem programu. ADPlus moĝe dziaïaÊ w jednym z dwóch trybów: „ Tryb zawieszeñ — sïuĝy do diagnozowania procesów wykazujÈ- cych oznaki zawieszenia (np. nie robiÈ ĝadnego postÚpu albo wy- korzystujÈ 100 mocy procesora). Aby monitorowaÊ zawieszone procesy, ADPlus musi zostaÊ uruchomiony po ich zawieszeniu. „ Tryb awaryjny — sïuĝy do diagnozowania procesów wykazujÈcych oznaki wystÈpienia awarii. ADPlus musi zostaÊ uruchomiony przed procesem, w którym nastÈpiïa awaria. Generowanie plików zrzutu za pomocÈ narzÚdzia ADPlus zilustrujÚ na przykïadzie awarii programu 08SimpleExc.exe (tryb awaryjny). Uruchom program SimpleExc.exe: C:ADNDBin8SimpleExc.exe Przed naciĂniÚciem klawisza w celu kontynuowania dziaïania aplikacji wpisz nastÚpujÈce polecenie: C: adplus.vbs -crash -pn 08SimpleExc.exe -y SRV*c:Symbols*http://msdl.microsoft.com/download/symbols PrzeïÈcznik -crash przestawia narzÚdzie ADPlus na tryb awaryjny, -pn sïuĝy do okreĂlania nazwy procesu, który ma byÊ monitorowany, a -y — do ustawiania Ăcieĝki symboli, która ma byÊ wykorzystywana podczas dziaïania ADPlus. WielkÈ zaletÈ przeïÈcznika -pn jest moĝliwoĂÊ monitorowania do- wolnej liczby instancji dowolnego procesu. Po zakoñczeniu dziaïania programu ADPlus zapisuje wynik swojego dziaïania w pliku w katalogu instalacyjnym debugerów systemu Windows. Nazwa tego katalogu ma nastÚpujÈcÈ strukturÚ: runtype _Mode__Date_ data uruchomienia __Time_ czas dziaïania 426 R O Z D Z I A ’ 8 . D E B U G O W A N I E P O A W A R Y J N E Np. w tym przypadku po zakoñczeniu dziaïania ADPlus utworzyï nastÚ- pujÈcy katalog: c:Program FilesDebugging Tools for Windows (x86) ´Crash_Mode__Date_03-02-2009__Time_08-31-43AM DomyĂlnÈ ĂcieĝkÚ moĝna zmieniÊ za pomocÈ przeïÈcznika -o. W powyĝszym katalogu zostaïo zapisanych kilka plików, ale najwaĝniej- sze z nich majÈ rozszerzenie .dmp, poniewaĝ zawierajÈ wszystkie informacje zrzutowe. Jak widaÊ, w katalogu znajduje siÚ kilka plików zrzutu. Dlaczego jest wiÚcej niĝ jeden plik dla jednej awarii? Program ADPlus automatyzuje proces gromadzenia plików zrzutu i dlatego generuje kolejne pliki w przy- padku wystÈpienia z góry okreĂlonych sytuacji. Powód wygenerowania kaĝdego pliku moĝna odczytaÊ z jego nazwy. W naszym przykïadzie pro- gram ADPlus wygenerowaï nastÚpujÈce pliki zrzutu: PID-4448__08SIMPLEEXC.EXE__1st_chance_Process_Shut_ Down__full_1e20_2009-03-02_08-32-17-440_1160.dmp PID-4448__08SIMPLEEXC.EXE__2nd_chance_NET_CLR__full_ 1e20_2009-03-02_08-32-08-384_1160.dmp ADPlus wygenerowaï peïny plik zrzutu po wystÈpieniu pierwszego zda- rzenia zamkniÚcia procesu. NastÚpnie wygenerowaï kolejny peïny zrzut po wystÈpieniu wyjÈtku .NET. Czy potrzebne nam sÈ te wszystkie pliki w na- szej sytuacji? Nie. Dla nas najbardziej interesujÈcy jest drugi plik — wyge- nerowany po wystÈpieniu wyjÈtku .NET. OczywiĂcie w niektórych sytu- acjach takie okresowe generowanie plików zrzutu jest bardzo pomocne, poniewaĝ moĝna odtworzyÊ przebieg systematycznego psucia siÚ procesu. ADPlus umoĝliwia równieĝ ustawianie czÚstotliwoĂci zapisywania informacji oraz warunków, w jakich ma to byÊ robione, co w istocie oznacza, ĝe pozwala na sterowanie dziaïaniem debugera za pomocÈ skryptów. Szczegóïowe in- formacje na temat pisania skryptów w ADPlus znajdujÈ siÚ w dokumentacji programu. Naleĝy jednak koniecznie pamiÚtaÊ, ĝe ADPlus nie wykonuje za pomocÈ swoich skryptów ĝadnych czarodziejskich sztuczek. Jest to tylko wygodny sposób na wprowadzanie dyrektyw debugera, które sÈ nastÚpnie tïumaczone na zwykïe zautomatyzowane polecenia. Aby zobaczyÊ, jak ta wygodna konfiguracja przekïada siÚ na polecenia debugera, moĝna zajrzeÊ do folderu CDBScripts znajdujÈcego siÚ w tym samym katalogu co pliki zrzutu. W naszym przykïadzie w folderze tym znajduje siÚ plik o nazwie PID-4448__08SimpleExc.exe.cfg zawierajÈcy wszystkie polecenia debugera uĝyte w sesji diagnostycznej. P L I K I O B R A Z U — P O D S T A W O W E W I A D O M O ¥ C I 427 OstatniÈ waĝnÈ rzeczÈ, którÈ trzeba wiedzieÊ na temat programu AD- Plus, jest sposób okreĂlania typu pliku zrzutu generowanego w odpowiedzi na wystÈpienie awarii. SïuĝÈ do tego cztery przeïÈczniki wiersza poleceñ: „ -FullOnFirst — generuje peïny zrzut przy pierwszym wystÈpieniu wyjÈtku. pieniu wyjÈtku. „ -MiniOnSecond — generuje zrzut minimalny przy drugim wystÈ- „ -NoDumpOnFirst — blokuje generowanie zrzutu minimalnego przy pierwszym wystÈpieniu wyjÈtku. Opcja ta jest przydatna w przypadku aplikacji, które dobrze obsïugujÈ pierwsze wystÈpienie wyjÈtku. „ -NoDumpOnSecond — blokuje generowanie zrzutu minimalnego przy drugim wystÈpieniu wyjÈtku. ADPlus to wygodne, elastyczne i bardzo pomocne narzÚdzie do monito- rowania procesów i gromadzenia informacji o wystÚpujÈcych w nich awa- riach. W tym podrozdziale zostaïy opisane podstawowe wiadomoĂci o tym programie. Warto jednak poĂwiÚciÊ trochÚ czasu na zapoznanie siÚ z innymi jego moĝliwoĂciami, jak np. skrypty i techniki definiowania niestandardo- wych procedur obsïugi wyjÈtków, które umoĝliwiajÈ generowanie zrzutów w odpowiedzi na wystÈpienie niestandardowych wyjÈtków. ZnajÈc dwa najczÚĂciej stosowane sposoby tworzenia plików zrzutu, mo- ĝemy przystÈpiÊ do ich praktycznego wykorzystania i zapoznaÊ siÚ z pro- cesem rozwiÈzywania problemów przy ich uĝyciu. Diagnozowanie plików zrzutu Mamy juĝ pliki zrzutu i powierzono nam zadanie znalezienia przyczyny problemów z procesem. Co konkretnie moĝemy zrobiÊ z dostarczonymi nam plikami? Czy moĝemy wykonaÊ z nich zrzut pamiÚci, obejrzeÊ uchwyty albo wykonaÊ kod krok po kroku? Przypominam, ĝe plik zrzutu jest tylko statycz- nym obrazem stanu procesu w okreĂlonym momencie. Dlatego ustawianie punktów wstrzymania i wykonywanie kodu krok po kroku jest niemoĝliwe. Korzystanie z plików zrzutu najïatwiej porównaÊ z rÚcznym debugowa- niem. Mam na myĂli to, ĝe moĝemy tylko oglÈdaÊ stan aplikacji i na tej podstawie musimy opracowaÊ teoriÚ na temat tego, jaki kod doprowadziï do zaistniaïej sytuacji. Nietrudno siÚ domyĂliÊ, ĝe odtwarzanie sekwencji wykonywania kodu na podstawie statycznej analizy jest znacznie trudniejsze niĝ analizowanie programu w czasie dziaïania. Niemniej jednak w statycz- nym trybie nadal moĝna korzystaÊ z wielu poleceñ, które przetwarzajÈ dane 428 R O Z D Z I A ’ 8 . D E B U G O W A N I E P O A W A R Y J N E na bardziej zrozumiaïÈ postaÊ, i w wiÚkszoĂci przypadków, jeĂli tylko okaĝe siÚ wystarczajÈco duĝo cierpliwoĂci, udaje siÚ odnaleěÊ przyczynÚ problemów. Przed przejĂciem do analizowania wygenerowanych plików zrzutu mu- simy poznaÊ dwa bardzo waĝne pojÚcia — pliki symboli i warstwa dostÚpu do danych. Poniewaĝ pliki zrzutu nie zawierajÈ symboli, symbole te muszÈ byÊ dostÚpne z jakiegoĂ innego ěródïa w czasie sesji diagnostycznej. We wczeĂniejszych czÚĂciach tej ksiÈĝki poznaliĂmy najwaĝniejsze polecenia zwiÈzane z symbolami. DrugÈ waĝnÈ rzeczÈ jest tzw. warstwa dostÚpu do danych CLR (ang. data access layer — DAC), z której bardzo czÚsto korzysta rozszerzenie SOS debugera w celu dostarczenia wszystkich potrzebnych w sesji informacji. Warstwa dostępu do danych Podczas diagnozowania aplikacji rodzimych wiele informacji moĝna zdobyÊ poprzez przeglÈdanie surowej pamiÚci. Natomiast w kodzie zarzÈdzanym rozszerzenie SOS zwracane przez siebie dane tworzy na podstawie informacji uzyskanych w duĝym stopniu od CLR. Rozszerzenie to, odbierajÈc surowe dane, musi je poprawnie przetworzyÊ, korzystajÈc z pomocy w postaci wy- woïañ do CLR (tzn. wykonywania kodu CLR). Za zwiÈzane z tym funkcje w CLR odpowiada moduï o nazwie warstwa dostÚpu do danych (DAC), któ- rego implementacja znajduje siÚ w pliku mscordacwks.dll. Poniewaĝ system CLR jest caïy czas ulepszany, jego warstwa DAC równieĝ zmienia siÚ z kaĝdÈ wersjÈ (wïÈcznie z poprawkami). Moĝna to ïatwo sprawdziÊ, zaglÈdajÈc do folderu instalacyjnego kaĝdej wersji .NET zainstalowanej w komputerze. Np. w moim komputerze plik mscordacwks.dll znajduje siÚ w nastÚpujÈcym folderze: c:WindowsMicrosoft.NETFrameworkv2.0.50727 Natomiast w komputerach z zainstalowanym programem Visual Studio 2010 CTP plik ten znajduje siÚ w nastÚpujÈcych dwóch folderach (co ozna- cza, ĝe z CLR 4.0 zostaï dostarczony nowy plik mscordacwks.dll): c:WindowsMicrosoft.NETFrameworkv2.0.50727 c:WindowsMicrosoft.NETFrameworkv4.0.11001 ZnajomoĂÊ lokalizacji tego pliku jest niezbÚdna, poniewaĝ debuger zaĝÈ- da podania mu tej informacji. W czasie debugowania na ĝywo ten problem nie wystÚpuje, poniewaĝ rozszerzenie SOS znajduje ten plik, szukajÈc go P L I K I O B R A Z U — P O D S T A W O W E W I A D O M O ¥ C I 429 w tym samym katalogu, w którym znajduje siÚ wersja Ărodowiska wyko- nawczego, w jakim jest przeprowadzana sesja diagnostyczna. Natomiast w czasie debugowania poawaryjnego wersja CLR uĝyta w aplikacji moĝe byÊ inna niĝ wersja dostÚpna na komputerze, na którym jest wczytywany i diagnozowany plik zrzutu. Przypominam zatem, ĝe rozszerzenie SOS debugera odwoïuje siÚ do pliku mscordacwks.dll, który wykonuje kod CLR, oraz ĝe zaïadowanie odpowiedniej wersji tego pliku ma kluczowe znacze- nie. Poniewaĝ posiadanie odpowiedniej wersji tego pliku jest tak waĝne, firma Microsoft udostÚpnia wszystkie istniejÈce jego wersje na swoim ser- werze symboli publicznych. JeĂli debuger zostanie skierowany do tego ser- wera (za pomocÈ polecenia symfix lub innego podobnego), sam znajdzie potrzebny mu plik. ZdarzajÈ siÚ jednak sytuacje, w których trzeba wïasno- rÚcznie okreĂliÊ lokalizacjÚ tego pliku. Moĝe siÚ to np. zdarzyÊ, gdy okre- Ălonej wersji pliku nie ma na serwerze symboli (rzadko) lub gdy plik ten nie zostaï zapisany w tym samym miejscu, w którym znajdowaï siÚ na kompute- rze, na którym zostaï wykonany zrzut. W takich sytuacjach naleĝy skorzystaÊ z polecenia cordll sïuĝÈcego do okreĂlania sposobu ïadowania pliku mscordacwks.dll. Polecenie to jest bezcenne, gdy wystÈpiÈ problemy z do- pasowaniem wersji tego pliku. W tabeli 8.4 znajduje siÚ opis przeïÈczników polecenia cordll. SkÈd wiadomo, czy naleĝy siÚ zainteresowaÊ poleceniem cordll? Za- zwyczaj jeĂli wystÈpi niezgodnoĂÊ wersji pliku mscordacwks.dll, rozsze- rzenie SOS zwraca nastÚpujÈcÈ informacjÚ o bïÚdzie (lub coĂ podobnego), gdy nie moĝe wykonaÊ jakiegoĂ polecenia: Failed to load data access DLL, 0x80004005 Verify that 1) you have a recent build of the debugger (6.2.14 or newer) 2) the file mscordacwks.dll that matches your version of mscorwks.dll is in the version directory 3) or, if you are debugging a dump file, verify that the file mscordacwks___.dll is on your symbol path. 4) you are debugging on the same architecture as the dump file. For example, an IA64 dump file must be debugged on an IA64 machine. You can also run the debugger command .cordll to control the debugger’s load of mscordacwks.dll. .cordll -ve -u -l will do a verbose reload. If that succeeds, the SOS command should work on retry. If you are debugging a minidump, you need to make sure that your executable path is pointing to mscorwks.dll as well. Przyjrzymy siÚ wszystkim propozycjom zgïoszonym powyĝej przez de- buger. Pierwsza z nich jest prosta, poniewaĝ debuger prosi nas, abyĂmy siÚ upewnili, czy korzystamy z najnowszej wersji debugerów (6.2.14 lub nowszej). 430 R O Z D Z I A ’ 8 . D E B U G O W A N I E P O A W A R Y J N E Tabela 8.4. Przełączniki polecenia cordll Przełącznik -l -u -e -d -D -N -lp -Se -sd -ve -vd Opis ’aduje moduïy debugujÈce, szukajÈc pliku DLL na domyĂlnych Ăcieĝkach Usuwa moduïy debugujÈce z pamiÚci WïÈcza debugowanie CLR WyïÈcza debugowanie CLR WyïÈcza debugowanie CLR i usuwa moduïy debugujÈce Ponownie ïaduje moduïy debugujÈce OkreĂla ĂcieĝkÚ do katalogu zawierajÈcego moduïy debugujÈce Umoĝliwia uĝywanie wersji o krótkiej nazwie moduïu debugujÈcego — mscordacwks.dll WyïÈcza moĝliwoĂÊ uĝywania wersji o krótkiej nazwie moduïu debugujÈcego — mscordacwks.dll. JeĂli ten przeïÈcznik zostanie uĝyty, debuger spodziewa siÚ, ĝe nazwa moduïu debugujÈcego bÚdzie miaïa nastÚpujÈcy format: mscordacwks_ spec .dll, gdzie spec to architektura _ architektura _ wersja pliku WïÈcza tryb wzbogacony. Tryb ten jest przydatny przy pracy z nieprawidïowymi dopasowaniami, poniewaĝ dostarcza informacji na temat tego, jak debuger próbuje zaïadowaÊ moduïy debugujÈce WyïÈcza tryb wzbogacony Druga podpowiedě jest równie prosta. Debuger podpowiada nam, abyĂmy siÚ upewnili, ĝe nasza wersja pliku mscordacwks.dll jest taka sama jak wersja, która jest ïadowana. Jak pamiÚtamy, plik mscordacwks.dll powinien znaj- dowaÊ siÚ w tym samym folderze co plik mscorwks.dll. Trzecia sugestia jest najciekawsza ze wszystkich. W tym przypadku debuger informuje, ĝe jeĂli jest wykonywane diagnozowanie pliku zrzutu, naleĝy sprawdziÊ, czy plik mscordacwks__.dll znajduje siÚ na Ăcieĝce symboli. Co to za plik? W tabeli 8.4 znajduje siÚ polecenie -sd wïÈczajÈce dïugÈ nazwÚ pliku mscordacwks.dll. Dïuga nazwa to nazwa z dodanÈ informacjÈ o architektu- rze i numerem kompilacji pliku DLL. DziÚki tym informacjom moĝna zmodyfikowaÊ ĂcieĝkÚ symboli, aby wskazywaïa wïaĂciwy plik DLL, oraz ponownie wykonaÊ polecenie cordll, aby ponownie zaïadowaÊ plik mscordacwks.dll. JeĂli np. do wykonania pliku zrzutu wykorzystano wersjÚ 1.1.1.0 pliku mscordacwks.dll oraz dokonano tego w komputerze x86, moĝna P L I K I O B R A Z U — P O D S T A W O W E W I A D O M O ¥ C I 431 nazwÚ pliku mscordacwks.dll zmieniÊ na mscordacwks_x86_x86_1.1.1.0.dll, ustawiÊ ĂcieĝkÚ symboli debugerów na jego lokalizacjÚ i ponownie zaïa- dowaÊ moduïy debugujÈce za pomocÈ polecenia cordll. 0:008 ..sympath+ path to renamed module 0:008 ..cordll -ve -u -l Czwarta sugestia dotyczy upewnienia siÚ, ĝe architektura komputera, na którym przeprowadzana jest diagnostyka, zgadza siÚ z architekturÈ kompu- tera, na którym zostaï wykonany zrzut. Poniewaĝ debuger wykonuje swojÈ pracÚ poprzez wykonywanie kodu w DAC, zalecane jest, aby debugowaÊ pliki zrzutu w architekturze o takiej samej liczbie bitów jak ta, w której utworzono plik. JeĂli np. uĝyto by 64-bitowego debugera do wygenerowania pliku zrzutu procesu 32-bitowego dziaïajÈcego w systemie 64-bitowym przy uĝyciu nakïadki WOW64, nie udaïoby siÚ przeprowadziÊ diagnostyki tego pliku. W ostatnim wierszu powyĝszych danych znajduje siÚ pytanie, czy na Ăcieĝce plików wykonywalnych znajduje siÚ plik mscorwks.dll. ZawartoĂÊ Ăcieĝki plików wykonywalnych moĝna zmieniÊ w debugerze za pomocÈ polecenia exepath (lub exepath+ w przypadku dodawania Ăcieĝek). Np. w przypadku diagnozowania pliku zrzutu, przy wykonywaniu którego plik mscorwks.dll znajdowaï siÚ w katalogu c:windowsmicrosoft.netframework v2.0.50727, moĝna zastosowaÊ poniĝsze polecenie ustawiajÈce poprawnie ĂcieĝkÚ plików wykonywalnych (nastÚpnie naleĝy uĝyÊ polecenia .reload, aby nowa Ăcieĝka zostaïa wczytana przez debuger): 0:008 ..exepath+ c:windowsmicrosoft.netframeworkv2.0.50727 Executable image search path is: c:windowsmicrosoft.netframeworkv2.0.50727 0:008 ..reload We wszystkich dotychczas opisanych sytuacjach przyjÚto zaïoĝenie, ĝe plik mscordacwks.dll jest dostÚpny w jednym lub innym miejscu (na serwe- rze symboli publicznych lub na komputerze lokalnym). JeĂli nie moĝna znaleěÊ wersji pliku DLL, która zostaïa uĝyta przy generowaniu pliku zrzutu, najlepiej jest poprosiÊ osobÚ, która to zrobiïa, o przesïanie odpo- wiedniej wersji pliku mscordacwks.dll. Po otrzymaniu pliku moĝna go zaïadowaÊ, stosujÈc techniki opisane powyĝej. OkreĂlenie wïaĂciwej wersji pliku mscordacwks.dll bywa czasami trudne i uzyskanie biegïoĂci w jej znajdowaniu wymaga trochÚ czasu i przeprowa- dzenia kilku prób. Po zaïadowaniu tego pliku rozszerzenie SOS bÚdzie w peïni funkcjonalne i bÚdzie moĝna ponowiÊ diagnozowanie. 432 R O Z D Z I A ’ 8 . D E B U G O W A N I E P O A W A R Y J N E Analizowanie plików zrzutu — nieobsłużone wyjątki .NET W poprzednim podrozdziale wygenerowaliĂmy plik zrzutu awaryjnej apli- kacji i naszym zadaniem jest znalezienie przyczyny problemów, majÈc do dyspozycji tylko ten plik. Aby móc wykorzystaÊ ten plik, musimy o tym poinformowaÊ debuger. Do tego sïuĝy przeïÈcznik -z: C: ntsd –z C:8dumpfile.dmp PierwszÈ waĝnÈ informacjÈ zwróconÈ przez debuger jest wyjÈtek CLR: This dump file has an exception of interest stored in it. The stored exception information can be accessed via .ecxr. (2dc4.2a08): CLR exception - code e0434f4d (first/second chance not available) eax=0024ef20 ebx=e0434f4d ecx=00000001 edx=00000000 esi=0024efa8 edi=002c43e8 eip=767142eb esp=0024ef20 ebp=0024ef70 iopl=0 nv up ei pl nz ac po nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000212 kernel32!RaiseException+0x58: 767142eb c9 leave Z powyĝszych danych wynika, ĝe badany przez nas plik zostaï wygene- rowany z powodu wystÈpienia wyjÈtku CLR. Kolejnym krokiem bÚdzie dokïadne przyjrzenie siÚ temu wyjÈtkowi. 0:000 kkb ChildEBP RetAddr Args to Child 0024ef70 79f071ac e0434f4d 00000001 00000001 kernel32!RaiseException+0x58 0024efd0 79f0a629 01b66c20 00000000 00000000 mscorwks!RaiseTheExceptionInternalOnly+0x2a8 0024f094 01630197 01b658d0 0024f0e0 0024f0fc mscorwks!JIT_Throw+0xfc WARNING: Frame IP not in any known module. Following frames may be wrong. 00000000 00000000 00000000 00000000 00000000 0x1630197 0:000 !!pe 01b66c20 Exception object: 01b66c20 Exception type: System.ArgumentException Message: Argument NULL InnerException: none StackTrace (generated): SP IP Function 0024F09C 01630197 08SimpleExc!Advanced.NET.Debugging.Chapter8.SimpleExc.ProcessData (System.String)+0x57 0024F0B4 01630124 08SimpleExc!Advanced.NET.Debugging.Chapter8.SimpleExc.Run()+0x34 0024F0C8 016300A7 08SimpleExc!Advanced.NET.Debugging.Chapter8.SimpleExc.Main (System.String[])+0x37 StackTraceString: none HResult: 80070057 U S ’ U G A R A P O R T O W A N I A B ’ } D Ó W 433 SÈdzÈc po tym wyjÈtku, moĝemy wywnioskowaÊ, ĝe aplikacja ulegïa awarii z powodu nieprawidïowej wartoĂci (NULL) argumentu przekazanego w wywoïaniu metody. Na podstawie dostarczonego zrzutu stosu wywoïañ moĝemy przeprowad
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Debugowanie .NET. Zaawansowane techniki diagnostyczne
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: