Combinaison de cette méthode avec le débogage à distance
Il est parfois utile de contrôler le débogueur en mode utilisateur à partir du débogueur de noyau et d’utiliser le débogueur en mode utilisateur comme serveur de débogage en même temps.
Par exemple, cette configuration est utile lorsque vos symboles en mode utilisateur se trouvent sur un serveur de symboles. Dans la configuration standard permettant de contrôler le débogueur en mode utilisateur à partir d’un débogueur de noyau, l’interaction des deux débogueurs peut entraîner de minuscules écarts de synchronisation, qui peuvent empêcher l’authentification du serveur de symboles. La configuration plus complexe décrite ici peut éviter ce problème.
Remarque : dans la description de ce scénario, l’application cible fait référence à l’application en mode utilisateur en cours de débogage, l’ordinateur cible fait référence à l’ordinateur qui contient l’application cible et le processus CDB ou NTSD, et l’ordinateur hôte font référence à l’ordinateur qui contient le débogueur du noyau.
Pour utiliser cette technique, voici la marche à suivre :
Démarrer NTSD ou CDB sur l’ordinateur cible, avec les options de ligne de commande -ddefer et -server, en spécifiant les options de transport souhaitées. L’option -server doit être le premier paramètre de la ligne de commande.
Par exemple, on peut attacher un processus en cours d’exécution à l’aide de la syntaxe suivante.
ntsd -server ServerTransport -ddefer [-y UserSymbolPath] -p PID
On peut également lancer un nouveau processus en tant que cible à l’aide de la syntaxe suivante.
ntsd -server ServerTransport -ddefer [-y UserSymbolPath] ApplicationName
Si on installe cela en tant que débogueur postmortem, il faut utiliser la syntaxe suivante. Il convient de noter qu’il faut modifier manuellement le Registre pour installer un débogueur postmortem qui inclut le paramètre -server. Pour en savoir plus, consulter Activation du débogage postmortem.
ntsd -server ServerTransport -ddefer [-y UserSymbolPath]
Pour en savoir plus sur les options de transport disponibles, consulter Activation d’un serveur de débogage.
Démarrer WinDbg ou KD sur l’ordinateur hôte, comme s’il s’agissait de déboguer l’ordinateur cible, mais sans entrer réellement dans ce dernier. Pour utiliser WinDbg, utiliser la syntaxe suivante.
windbg [-y KernelSymbolPath] [-k ConnectionOptions]
Pour en savoir plus sur cette étape, consulte Débogage en direct en mode noyau avec WinDbg (classique)
.
Lancer WinDbg ou CDB en tant que client de débogage, avec les mêmes options de transport que celles utilisées pour démarrer le serveur. Ce client de débogage peut être exécuté sur l’ordinateur hôte ou sur un troisième ordinateur.
cdb -remote ClientTransport
Pour en savoir plus sur cette étape, consulter Activation d’un client de débogage.
Une fois que les débogueurs sont en cours d’exécution et que l’invite
Input>
s’affiche dans le débogueur du noyau, utiliser la commande .sleep (Pause débogueur) pour suspendre les débogueurs et laisser l’ordinateur cible s’exécuter pendant quelques secondes. Cela permet à l’ordinateur cible de traiter le protocole de transport distant, en établissant la connexion entre le serveur distant en mode utilisateur et le client distant.
Si on utilise CDB comme débogueur en mode utilisateur, la fenêtre d’invite de commandes associée à CDB reste verrouillée et indisponible pendant le débogage. Si on utilise NTSD, aucune fenêtre supplémentaire n’est créée, même si NTSD possède un ID de processus associé à celui-ci sur l’ordinateur cible.
Les quatre modes et les méthodes de changement entre eux décrits dans la rubrique Changement de mode s’appliquent dans ce scénario de combinaison, avec les différences suivantes :
Il existe deux modes de débogage en mode utilisateur. Lorsque l’ordinateur cible est en cours de fonctionnement, le serveur de débogage est contrôlé par le client de débogage comme dans n’importe quelle session de débogage à distance ; il s’agit du débogage en mode utilisateur contrôlé à distance. Lorsque le débogueur en mode noyau est relié à l’ordinateur cible et que l’invite
Input>
s’affiche, le débogueur en mode utilisateur est contrôlé par le débogueur du noyau ; il s’agit du débogage en mode utilisateur contrôlé par le noyau.Ces deux modes ne sont jamais disponibles en même temps. Lorsque le débogueur du noyau est relié à l’ordinateur cible, même si le débogueur en mode utilisateur peut être actif, l’ordinateur cible ne peut pas traiter le protocole de transport distant, et par conséquent, le débogueur en mode utilisateur ne pourra pas recevoir d’entrée distante sur cette connexion.
Si vos symboles en mode utilisateur se trouvent sur un serveur de symboles, toutes les commandes du débogueur qui nécessitent l’accès aux symboles doivent être exécutées en mode de débogage en mode utilisateur contrôlé à distance.
Pour passer du débogage en mode utilisateur contrôlé par le noyau au débogage en mode utilisateur contrôlé à distance, utiliser la commande .sleep (Pause débogueur). Lorsque le débogueur en mode utilisateur se réveille à partir de la commande de veille, il est en mode débogage en mode utilisateur contrôlé à distance.
Pour passer du débogage en mode utilisateur contrôlé à distance au débogage en mode noyau, saisissez n’importe quelle commande à partir de l’invite
Input>
. Si cette invite n’est pas visible, basculer vers le débogage en mode noyau, puis utiliser la commande g (Go) à l’invitekd>
.
En interne, un débogueur en mode utilisateur démarré avec -ddefer donne la priorité aux entrées provenant du client de débogage, et la seconde priorité aux entrées provenant du débogueur du noyau. Toutefois, il ne peut jamais y avoir de conflit entre les entrées simultanées, car lorsque le débogueur du noyau est relié à l’ordinateur cible, la connexion distante n’est pas disponible.