Udostępnij za pomocą


Wprowadzenie do debugowania systemu Windows

W tym artykule wyjaśniono, jak rozpocząć debugowanie systemu Windows przy użyciu narzędzia WinDbg i innych narzędzi do debugowania. Dowiesz się, jak:

  • Instalowanie debugera i konfigurowanie systemów hostów i docelowych
  • Konfigurowanie środowiska debugowania
  • Opanuj kluczowe techniki debugowania w scenariuszach trybu jądra i trybu użytkownika

Nuta: Jeśli zamiast tego chcesz przeanalizować zrzut awaryjny, zobacz Analizowanie plików zrzutu awaryjnego przy użyciu narzędzia WinDbg.

Aby rozpocząć debugowanie systemu Windows, wykonaj następujące kroki.

1. Instalowanie debugera systemu Windows

Zainstaluj usługę WinDbg, aby rozpocząć debugowanie aplikacji i sterowników systemu Windows. Aby uzyskać szczegółowe instrukcje instalacji, zobacz Instalowanie usługi WinDbg.

2. Identyfikowanie hostów i systemów docelowych

Dwa oddzielne systemy komputerowe są zwykle używane do debugowania, ponieważ wykonywanie instrukcji na procesorze jest często wstrzymane podczas procesu. Debuger działa w systemie hosta , a kod, który chcesz debugować, jest uruchamiany w docelowym systemie .

serwer <--------------------------------------------------> docelowy

Zrzut ekranu przedstawiający diagram przedstawiający podwójną strzałkę łączącą host i docelowe systemy debugowania.

W niektórych sytuacjach można użyć maszyny wirtualnej jako drugiego systemu. Na przykład wirtualny komputer może działać na tym samym komputerze co kod, który należy debugować. Jeśli jednak kod komunikuje się ze sprzętem niskiego poziomu, użycie komputera wirtualnego może nie być najlepszym rozwiązaniem. Aby uzyskać więcej informacji, zobacz Konfigurowanie debugowania sieci maszyny wirtualnej — KDNET.

3. Określanie typu debugera: tryb jądra lub tryb użytkownika

Następnie należy określić, czy należy używać debugowania w trybie jądra, czy w trybie użytkownika.

  • System operacyjny i programy uprzywilejowane działają w trybie jądra . Kod trybu jądra ma uprawnienia dostępu do dowolnej części systemu i nie jest ograniczony jak kod trybu użytkownika. Kod trybu jądra może uzyskać dostęp do dowolnej części dowolnego innego procesu uruchomionego w trybie użytkownika lub w trybie jądra. Większość podstawowych funkcji systemu operacyjnego i wiele sterowników urządzeń sprzętowych działa w trybie jądra.

  • Aplikacje i podsystemy na komputerze działają w trybie użytkownika. Procesy uruchamiane w trybie użytkownika robią to we własnych wirtualnych przestrzeniach adresowych. Są one ograniczone do uzyskiwania bezpośredniego dostępu do wielu części systemu, w tym sprzętu systemowego, pamięci, która nie jest przydzielona do ich użycia, oraz innych części systemu, które mogą naruszyć integralność systemu. Procesy uruchamiane w trybie użytkownika są skutecznie odizolowane od systemu i z innych procesów trybu użytkownika, dzięki czemu nie mogą zakłócać tych zasobów.

Jeśli twoim celem jest debugowanie sterownika, ustal, czy sterownik jest sterownikiem trybu jądra lub sterownikiem trybu użytkownika. Sterowniki Windows Driver Model (WDM) i Kernel-Mode Driver Framework (KMDF) to sterowniki trybu jądra. Jak sugeruje nazwa, sterowniki User-Mode Driver Framework (UMDF) są sterownikami trybu użytkownika.

W przypadku niektórych problemów trudno jest określić tryb wykonywany przez kod. W takim przypadku może być konieczne wybranie jednego trybu i sprawdzenie, jakie informacje są dostępne w tym trybie. Niektóre problemy wymagają użycia debugera zarówno w trybie użytkownika, jak i w trybie jądra.

W zależności od trybu debugowania może być konieczne skonfigurowanie i użycie debugerów na różne sposoby. Niektóre polecenia debugowania działają tak samo w obu trybach, a niektóre polecenia działają inaczej.

Następne kroki debugowania w trybie jądra

Następne kroki debugowania w trybie użytkownika

4. Wybierz środowisko debugera

Debuger WinDbg działa dobrze w większości sytuacji, ale czasami warto użyć innego debugera, takiego jak debugery konsoli na potrzeby automatyzacji lub programu Visual Studio. Aby uzyskać więcej informacji, zobacz Debugowanie środowisk.

5. Określanie sposobu nawiązywania połączenia z obiektem docelowym i hostem

Zazwyczaj łączy się systemy docelowe i systemy hostów przy użyciu sieci Ethernet. Jeśli wykonujesz wczesne prace uruchomieniowe lub nie masz połączenia Ethernet na urządzeniu, dostępne są inne opcje połączeń sieciowych. Aby uzyskać więcej informacji, zobacz następujące artykuły:

6. Wybierz 32-bitowe lub 64-bitowe narzędzia do debugowania

Niezależnie od tego, czy potrzebujesz debugera 32-bitowego, czy 64-bitowego, zależy od wersji systemu Windows działającej na systemach docelowych i hostujących oraz od tego, czy debugujesz kod 32-bitowy, czy 64-bitowy. Aby uzyskać więcej informacji, zobacz Wybieranie 32-bitowych lub 64-bitowych narzędzi debugowania.

7. Konfigurowanie symboli

Aby użyć wszystkich zaawansowanych funkcji zapewnianych przez usługę WinDbg, należy załadować odpowiednie symbole. Jeśli symbole nie są prawidłowo konfigurowane, podczas próby użycia funkcji, która zależy od symboli, otrzymujesz komunikaty wskazujące, że symbole nie są dostępne. Aby uzyskać więcej informacji, zobacz Symbole debugowania systemu Windows.

8. Konfigurowanie kodu źródłowego

Jeśli twoim celem jest debugowanie własnego kodu źródłowego, musisz skonfigurować ścieżkę do kodu źródłowego. Aby uzyskać więcej informacji, odwiedź ścieżkę źródłową.

9. Zapoznaj się z operacją debugera

W sekcji Operacji debugera tej dokumentacji opisano operację debugera dla różnych zadań. Na przykład Przechowywanie pliku dziennika w usłudze WinDbg opisuje sposób zapisywania pliku dziennika, który rejestruje sesję debugowania.

10. Zapoznaj się z technikami debugowania

standardowe techniki debugowania mają zastosowanie do większości scenariuszy debugowania, a przykłady obejmują ustawianie punktów przerwania, inspekcję stosu wywołań i znalezienie przecieku pamięci. wyspecjalizowane techniki debugowania mają zastosowanie do określonych technologii lub typów kodu. Przykłady obejmują debugowanie Plug and Play, debugowanie KMDF i debugowanie RPC.

11. Użyj poleceń referencyjnych debugera

Możesz użyć różnych poleceń debugowania podczas pracy w debugerze. Aby uzyskać pomoc dotyczącą dowolnego polecenia podczas debugowania, użyj .hh polecenia, po którym następuje nazwa polecenia.

Przykłady:

.hh bp # Get help on breakpoint commands
.hh k # Get help on call stack commands

Aby uzyskać pełną listę dostępnych poleceń, zobacz Dokumentacja debugera.

12. Używanie rozszerzeń debugowania dla określonych technologii

Do analizowania struktur danych specyficznych dla domeny można użyć wielu rozszerzeń debugowania. Aby uzyskać więcej informacji, zobacz Wyspecjalizowane rozszerzenia. Aby uzyskać informacje na temat ładowania rozszerzeń debugera, zobacz Ładowanie bibliotek DLL rozszerzeń debugera.

W tej dokumentacji przyjęto założenie, że masz pewną wiedzę na temat podstawowych wewnętrznych systemów Windows. Aby dowiedzieć się więcej o elementach wewnętrznych systemu Windows, w tym o użyciu pamięci, kontekście, wątkach i procesach, możesz przejrzeć zasoby, takie jak Wewnętrzne systemy Windows pavel Yosifovich, Mark E. Russinovich, David A. Solomon i Alex Ionescu.

14. Przejrzyj dodatkowe zasoby debugowania

Inne zasoby obejmują następujące książki i filmy wideo:

  • Debugowanie systemu Windows od kuchni: Praktyczne debugowanie i strategie śledzenia, autorstwa Tarik Soulami
  • zaawansowane debugowanie systemu Windows przez Mario Hewardt i Daniel Pravat
  • Defrag Tools seria wideo, od odcinka 13 do 29, wszystko o WinDbg

Dalsze kroki

Wybierz tryb debugowania, aby kontynuować:

Debugowanie w trybie jądra (w przypadku sterowników i składników systemu operacyjnego):

Debugowanie w trybie użytkownika (w przypadku aplikacji):

Dodatkowe wskazówki dotyczące konfiguracji: