Udostępnij przez


Wideo: Debugowanie sterownika za pomocą kodu źródłowego usługi WDF

Ten temat zawiera samouczek wideo pokazujący, jak debugować sterownik Windows Driver Frameworks (WDF) z pełnym dostępem do kodu źródłowego usługi WDF. Poniżej przedstawiono procedurę krok po kroku wykonaną w filmie wideo, aby uzyskać wygodne informacje.

Debugowanie źródłowe WDF umożliwia swobodne przechodzenie poprzez kod frameworku bez konieczności pobierania jego kodu źródłowego. Debuger automatycznie pobiera poprawną wersję usługi WDF z usługi GitHub.

Jeśli na przykład używasz WinDbg do debugowania sterownika WDF na maszynie z systemem Windows 10, a debuger zostanie zatrzymany w kodzie struktury na stosie wywołań, możesz dwukrotnie kliknąć ramkę WDF w widoku stosu wywołań, a WinDbg automatycznie pobierze i otworzy odpowiedni plik źródłowy WDF w odpowiadającym wierszu. Następnie możesz przejść przez kod i ustawić punkty przerwania.

Ta funkcja jest dostępna dla systemów docelowych z publicznymi wersjami systemu Windows 10, począwszy od wersji kompilacji Technical Preview 10041 lub nowszej. Te kompilacje mają pliki symboli indeksowanych przez prywatne źródła dla usługi KMDF (Wdf01000.sys) i UMDF (Wudfx02000.dll) dostępne na publicznym serwerze symboli firmy Microsoft. Debugowanie kodu WDF na poziomie źródłowym jest dostępne tylko w usłudze WinDbg, a nie w debugerze programu Visual Studio.

Szybki start

Uruchom sesję debugowania jądra WinDbg na maszynie docelowej, przerwij i wykonaj następujące kroki:

  1. Ustaw domyślną ścieżkę symbolu przy użyciu pliku symfix. Spowoduje to ustawienie ścieżki symboli tak, aby wskazywała serwer symboli na https://msdl.microsoft.com/download/symbols.

    kd> .symfix

  2. Ustaw domyślną ścieżkę źródłową przy użyciu pliku srcfix. Spowoduje to ustawienie ścieżki źródłowej do pliku srv*, który nakazuje debugerowi pobranie plików źródłowych z lokalizacji określonych w plikach symboli modułów docelowych.

    kd> .srcfix
    Source search path is: SRV*
    
  3. Załaduj ponownie symbole przy użyciu funkcji .reload i upewnij się, że symbole Wdf01000.sys (lub Wudfx02000.dll dla usługi UMDF) są indeksowane źródłami. Jak pokazano w danych wyjściowych !lmi poniżej, Wdf01000.sys PDB jest indeksowany źródłowo. Jeśli nie, zapoznaj się z sekcją Konfiguracja usługi WinDbg poniżej.

    kd> .reload
    ...
    
    kd> !lmi wdf01000.sys
    Loaded Module Info: [wdf01000.sys] 
    ...
    Load Report: private symbols & lines, source indexed 
    C:\...\Wdf01000.pdb\...\Wdf01000.pdb
    
  4. Teraz wszystko jest gotowe! Łatwym sposobem na przejście przez kod źródłowy usługi WDF jest ustawienie punktu przerwania w procedurze wysyłania IRP platformy, a następnie przejście przez pozostałą część kodu. Ponieważ system Windows ma wiele wbudowanych sterowników KMDF, WDF jest zawsze ładowany i uruchamiany, więc punkt przerwania zostanie aktywowany od razu (bez konieczności ładowania własnego sterownika).

    kd> bp Wdf01000!FxDevice::DispatchWithLock
    kd> g
    Breakpoint 0 hit
    Wdf01000!FxDevice::DispatchWithLock:
    87131670 8bff mov edi,edi 
    

Jeśli to nie zadziała, zapoznaj się z poniższymi krokami instalacji windbg.

Konfiguracja WinDbg

Jeśli powyższy przykład nie zadziałał zgodnie z oczekiwaniami, może być konieczne wykonanie co najmniej jednej z poniższych instrukcji.

Włącz debugowanie w trybie źródłowym

Upewnij się, że debugowanie w trybie źródłowym jest włączone. Otwórz menu Debuguj i upewnij się, że zaznaczono opcję Tryb źródłowy.

Wyczyść zestarzałe symbole z pamięci podręcznej

Jeśli wcześniej debugowałeś sterowniki WDF dla tego samego systemu docelowego Windows, możesz używać lokalnie buforowanych symboli WDF, które nie były indeksowane w źródle. Możesz to sprawdzić za pomocą polecenia !lmi:

kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, not source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb

Zgodnie z powyższym raportem ładowania, plik Wdf01000.pdb nie jest indeksowany względem kodu źródłowego. Oznacza to, że lokalna pamięć podręczna symboli WinDbg jest nieaktualna. Aby rozwiązać ten problem, zwolnij PDB z WinDbg, wyczyść lokalną pamięć podręczną (ścieżka może się różnić w zależności od wyników !lmi powyżej) i załaduj ponownie PDB:

kd> .reload /u Wdf01000.sys

CMD> del
C:\...\Wdf01000.pdb\...\Wdf01000.pdb

kd> .reload Wdf01000.sys

Teraz uruchom polecenie !lmi, aby sprawdzić ponownie: plik PDB powinien być wyświetlany jako indeksowany jako źródło, a okno kodu źródłowego powinno pojawić się.

kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb 

Debugowania na poziomie źródła WDF można używać nie tylko do debugowania na żywo i analizowania zrzutów awaryjnych, ale także aby dowiedzieć się więcej na temat wewnętrznych mechanizmów struktury, ustawiając punkty przerwania w podstawowych funkcjach, takich jak dyspozytor IRP, i analizować kolejne ścieżki kodu.