Deze methode combineren met externe foutopsporing
Het is soms handig om het foutopsporingsprogramma in de gebruikersmodus te te beheren vanuit het kernelfoutopsporingsprogramma en het foutopsporingsprogramma in de gebruikersmodus te gebruiken als een foutopsporingsserver tegelijkertijd.
Belangrijk
Er zijn aanvullende belangrijke beveiligingsoverwegingen bij het gebruik van externe foutopsporing, voor meer informatie, inclusief informatie over het inschakelen van de beveiligde modus, zie Beveiliging tijdens externe foutopsporing en Beveiligingsoverwegingen voor Windows-foutopsporingsprogramma's.
Deze configuratie is bijvoorbeeld handig wanneer uw symbolen in de gebruikersmodus zich op een symboolserver bevinden. In de standaardconfiguratie voor het besturen van de gebruikersmodus-debugger vanuit een kerneldebugger, kan de interactie van de twee debuggers leiden tot kleine lapses in de synchronisatie. Deze lapses kunnen symboolserverauthenticatie voorkomen. De complexere configuratie die hier wordt beschreven, kan dit probleem voorkomen.
Opmerking Bij het beschrijven van dit scenario verwijst doeltoepassing naar de toepassing in de gebruikersmodus die onder foutopsporing staat, doelcomputer naar de computer die de doeltoepassing en het CDB- of NTSD-proces bevat, en hostcomputer naar de computer die de kernelfoutopsporing bevat.
Als u deze techniek wilt gebruiken, moet u het volgende doen:
Start NTSD of CDB op de doelcomputer, met de -ddefer en -server opdrachtregelopties, waarbij de gewenste transportopties worden opgegeven. De optie -server moet de eerste parameter op de opdrachtregel zijn.
U kunt bijvoorbeeld een actief proces koppelen met behulp van de volgende syntaxis.
ntsd -server ServerTransport -ddefer [-y UserSymbolPath] -p PID
U kunt ook een nieuw proces starten als doel met behulp van de volgende syntaxis.
ntsd -server ServerTransport -ddefer [-y UserSymbolPath] ApplicationName
Als u dit installeert als een postmortem-foutopsporingsprogramma, gebruikt u de volgende syntaxis. Houd er rekening mee dat u het register handmatig moet bewerken om een postmortem-foutopsporingsprogramma te installeren dat de parameter -server bevat; Zie Postmortem-foutopsporing inschakelenvoor meer informatie.
ntsd -server ServerTransport -ddefer [-y UserSymbolPath]
Zie Een foutopsporingsserver activerenvoor meer informatie over de beschikbare transportopties.
Start WinDbg of KD op de hostcomputer, alsof u fouten wilt opsporen op de doelcomputer, maar niet daadwerkelijk op de doelcomputer zou inbreken. Als u WinDbg wilt gebruiken, gebruikt u de volgende syntaxis.
windbg [-y KernelSymbolPath] [-k ConnectionOptions]
Zie Live Kernel-Mode Foutopsporing met WinDbg (klassiek) voor meer informatie over deze stap
.
Start WinDbg of CDB als een foutopsporingsclient, met dezelfde transportopties die worden gebruikt om de server te starten. Deze foutopsporingsclient kan worden uitgevoerd op de hostcomputer of op een derde computer.
cdb -remote ClientTransport
Zie Een foutopsporingsclient activerenvoor meer informatie over deze stap.
Zodra de foutopsporingsprogramma's worden uitgevoerd en de
Input>
prompt wordt weergegeven in het kernelfoutopsporingsprogramma, gebruikt u de .sleep - opdracht om de foutopsporingsprogramma's te onderbreken en de doelcomputer enkele seconden te laten uitvoeren. Dit geeft de doelcomputer tijd om het externe transportprotocol te verwerken, waardoor de verbinding tussen de externe server in de gebruikersmodus en de externe client tot stand wordt gebracht.
Als u CDB gebruikt als foutopsporingsprogramma in de gebruikersmodus, blijft het opdrachtpromptvenster dat is gekoppeld aan CDB vergrendeld en niet beschikbaar terwijl foutopsporing wordt voortgezet. Als u NTSD gebruikt, wordt er geen extra venster gemaakt, ook al is er een proces-id aan NTSD gekoppeld op de doelcomputer.
De vier modi en methoden voor het schakelen ertussen, zoals beschreven in het onderwerp Schakelen tussen modi, zijn in dit combinatiescenario van toepassing met de volgende verschillen:
Er zijn twee verschillende foutopsporingsmodi in de gebruikersmodus. Wanneer de doelcomputer wordt uitgevoerd, wordt de foutopsporingsserver beheerd door de foutopsporingsclient zoals in een andere externe foutopsporingssessie; dit wordt foutopsporing in de gebruikersmodus op afstand genoemd. Wanneer het foutopsporingsprogramma in de kernelmodus wordt verbroken naar de doelcomputer en de
Input>
prompt wordt weergegeven, wordt het foutopsporingsprogramma in de gebruikersmodus beheerd door het kernelfoutopsporingsprogramma; dit wordt door kernel beheerde foutopsporing in de gebruikersmodusgenoemd.Deze twee modi zijn nooit tegelijkertijd beschikbaar. Wanneer de kerneleerder inbreekt in de doelcomputer, kan de doelcomputer, zelfs als de foutopsporingsprogramma in de gebruikersmodus actief is, het externe transportprotocol niet verwerken. Hierdoor kan de foutopsporingsprogramma in de gebruikersmodus geen externe invoer ontvangen via deze verbinding.
Als uw symbolen in de gebruikersmodus zich op een symboolserver bevinden, moeten alle opdrachten voor foutopsporingsprogramma's waarvoor symbooltoegang is vereist, worden uitgegeven in de foutopsporingsmodus op afstand.
Als u wilt overschakelen van foutopsporing in de kernelbeheerde gebruikersmodus naar foutopsporing in de gebruikersmodus op afstand, gebruikt u de opdracht .sleep (Pause Debugger). Wanneer het foutopsporingsprogramma in de gebruikersmodus wordt geactiveerd vanuit de slaapstandopdracht, bevindt het zich in de foutopsporingsmodus op afstand.
Als u wilt overschakelen van foutopsporing in de gebruikersmodus op afstand naar foutopsporing in kernelmodus, voert u een opdracht in vanaf de
Input>
prompt. Als deze prompt niet zichtbaar is, schakelt u over naar foutopsporing in de kernelmodus en gebruikt u de opdracht g (Go) bij dekd>
prompt.
Intern geeft een foutopsporingsprogramma in de gebruikersmodus, gestart met -ddefer, eerste prioriteit aan invoer van de foutopsporingsclient en tweede prioriteit aan invoer van de kernelfoutopspoorder. Er kan echter nooit een conflict zijn tussen gelijktijdige invoer, omdat wanneer de kernel-debugger heeft ingebroken in de doelcomputer, de externe verbinding niet beschikbaar is.