Udostępnij za pośrednictwem


Łączenie tej metody z debugowaniem zdalnym

Czasami warto kontrolować debuger trybu użytkownika z debugera jądra i używać debugera trybu użytkownika jako serwera debugowania jednocześnie.

Ważny

Istnieją dodatkowe ważne zagadnienia dotyczące zabezpieczeń podczas korzystania z debugowania zdalnego, aby uzyskać więcej informacji, w tym informacje na temat włączania trybu bezpiecznego, zobacz Zabezpieczenia podczas debugowania zdalnego i zagadnienia dotyczące zabezpieczeń narzędzia debugowania systemu Windows.

Na przykład ta konfiguracja jest przydatna, gdy symbole trybu użytkownika znajdują się na serwerze symboli. W standardowej konfiguracji do kontrolowania debugera trybu użytkownika z debugera jądra interakcja między dwoma debuggerami może prowadzić do drobnych przerw w synchronizacji, a te przerwy mogą uniemożliwić uwierzytelnianie przez serwer symboli. Bardziej złożona konfiguracja opisana tutaj może uniknąć tego problemu.

Uwaga W opisie tego scenariusza aplikacja docelowa odnosi się do debugowanej aplikacji trybu użytkownika, komputer docelowy odnosi się do komputera, który zawiera aplikację docelową i proces CDB lub NTSD, a komputer hosta odnosi się do komputera, który zawiera debuger jądra.

Aby użyć tej techniki, należy wykonać następujące czynności:

  1. Uruchom NTSD lub CDB na komputerze docelowym, z opcjami wiersza polecenia -ddefer i -server, określając żądane opcje przesyłu. Opcja -server musi być pierwszym parametrem w wierszu polecenia.

    Na przykład możesz dołączyć do uruchomionego procesu przy użyciu następującej składni.

    ntsd -server ServerTransport -ddefer [-y UserSymbolPath] -p PID 
    

    Możesz też uruchomić nowy proces jako cel, przy użyciu następującej składni.

    ntsd -server ServerTransport -ddefer [-y UserSymbolPath] ApplicationName 
    

    Jeśli instalujesz to jako debuger postmortem, użyj następującej składni. Należy pamiętać, że należy ręcznie edytować rejestr, aby zainstalować debuger postmortem zawierający parametr -server; Aby uzyskać szczegółowe informacje, zobacz Włączanie debugowania postmortem.

    ntsd -server ServerTransport -ddefer [-y UserSymbolPath] 
    

    Aby uzyskać informacje o dostępnych opcjach transportu, zobacz Aktywowanie serwera debugowania.

  2. Uruchom WinDbg lub KD na komputerze hosta, jak gdybyś zamierzał debugować komputer docelowy, ale nie przerywaj rzeczywiście w komputerze docelowym. Aby użyć usługi WinDbg, użyj następującej składni.

    windbg [-y KernelSymbolPath] [-k ConnectionOptions] 
    

    Aby uzyskać więcej informacji na temat tego kroku, zobacz Debugowanie na żywo Kernel-Mode przy użyciu usługi WinDbg (klasycznej)

    .

  3. Uruchom windbg lub CDB jako klienta debugowania, z tymi samymi opcjami transportu używanymi do uruchamiania serwera. Ten klient debugowania można uruchomić na komputerze hosta lub na trzecim komputerze.

    cdb -remote ClientTransport 
    

    Aby uzyskać więcej informacji na temat tego kroku, zobacz Aktywowanie klienta debugowania.

  4. Po uruchomieniu debugerów i wyświetleniu monitu Input> w debugerze jądra użyj .sleep (Wstrzymaj debuger) polecenie, aby wstrzymać debugery i pozwolić na uruchomienie komputera docelowego przez kilka sekund. Daje to komputerowi docelowemu czas na przetwarzanie protokołu transportu zdalnego, co umożliwia ustanowienie połączenia między serwerem zdalnym trybu użytkownika a klientem zdalnym.

Jeśli używasz usługi CDB jako debugera trybu użytkownika, okno wiersza polecenia skojarzone z usługą CDB pozostanie zablokowane i niedostępne podczas debugowania. Jeśli używasz NTSD, nie zostanie utworzone żadne dodatkowe okno, mimo że NTSD ma identyfikator procesu skojarzony z nim na komputerze docelowym.

Cztery tryby i metody przełączania między nimi opisane w temacie Tryby przełączania mają zastosowanie w tym scenariuszu kombinacji, z następującymi różnicami:

  • Istnieją dwa różne tryby debugowania w trybie użytkownika. Gdy komputer docelowy jest uruchomiony, serwer debugowania jest kontrolowany przez klienta debugowania, tak jak w każdej innej sesji zdalnego debugowania; nazywa się to zdalnie sterowanym debugowaniem w trybie użytkownika. Gdy debuger trybu jądra jest uszkodzony na komputerze docelowym, a monit Input> jest wyświetlany, debuger trybu użytkownika jest kontrolowany przez debuger jądra; Jest to nazywane debugowanie w trybie użytkownika kontrolowane przez jądro.

  • Te dwa tryby nigdy nie są dostępne w tym samym czasie. Gdy debuger jądra jest uszkodzony na komputerze docelowym, mimo że debuger trybu użytkownika może być aktywny, komputer docelowy nie może przetworzyć protokołu transportu zdalnego, a zatem debuger trybu użytkownika nie będzie mógł odbierać zdalnych danych wejściowych przez to połączenie.

  • Jeśli symbole trybu użytkownika znajdują się na serwerze symboli, wszystkie polecenia debugera, które wymagają dostępu do symboli, powinny być wystawiane w trybie debugowania w trybie użytkownika sterowanym zdalnie.

  • Aby przełączyć się z debugowania w trybie użytkownika kontrolowanego przez jądro do zdalnego debugowania w trybie użytkownika, użyj polecenia .sleep (Wstrzymaj debuger). Gdy debuger trybu użytkownika wyjdzie z trybu uśpienia, będzie działać w trybie zdalnego sterowania dla debugowania użytkownika.

  • Aby przełączyć się z zdalnego debugowania w trybie użytkownika do debugowania w trybie jądra, wprowadź dowolne polecenie w wierszu Input>. Jeśli ten monit nie jest widoczny, przejdź do debugowania w trybie jądra, a następnie użyj polecenia g (Go) w wierszu polecenia kd>.

Wewnętrznie debuger trybu użytkownika uruchomiony z -ddefer daje pierwszeństwo wejścia danych z klienta debugowania, a drugorzędność dla danych wejściowych z debugera jądra. Jednak nigdy nie może występować konflikt między równoczesnymi danymi wejściowymi, ponieważ gdy debuger jądra uległ awarii na komputerze docelowym, połączenie zdalne jest niedostępne.