Łą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:
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.
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)
.
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.
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 poleceniakd>
.
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.