28 votes

Afficher le code source dans windbg lors de l'exécution d'un processus via ntsd -d

Je ne peux pas faire le code source de montrer dans windbg quand j'ai pipe ntsd -d sur la cible par l'entremise windbg -k, mais il fonctionne quand je debug localement.

Je veux de débogage de la première exécution de code de Winlogon.exe et LSASS.exe. Mais pour le rendre facile à reproduire le problème, j'ai fait cette installation:

  • J'utilise le CrashMe exemple d'application, avec des sources et des symboles pré-construit, avec copie à C:\CrashMe sur la cible et de l'hôte
  • J'utilise Windows des outils de Débogage pour Windows (DTW) version 6.12.0002.633 partout.
  • La cible est en cours d'exécution de Windows XP SP3, l'hôte Windows 7 ultimate.
  • Chaque chemin d'accès et des paramètres est le même sur les deux machines : chemin de DTW et le chemin d'accès à crashme.
  • J'ai toujours utiliser le chemin d'accès complet (comme c:\dtw\ntsd.exe).
  • Je lance un XP dans une machine virtuelle, démarré avec /noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200

Je suis en mesure de débogage localement avec cette commande, lancé à partir de C:\CrashMe:

windbg -g -G -srcpath C:\CrashMe -y C:\CrashMe debug\CrashMe.exe

Je peux lancer Windows XP en machine virtuelle et de vous y connecter avec cette commande:

windbg -n -k com:pipe,port=\\.\pipe\com_1,reconnect -srcpath SRV*;C:\CrashMe -y   
c:\windows\system32;c:\windows\symbols;C:\CrashMe\debug  

Mais j'ai besoin de déboguer une machine distante. Sur la cible, j'ai l'un de ces choix:

  1. Debug par -server et -remote
  2. La rupture d'un processus en cours d'exécution
  3. L'utilisation de l'Image File Execution Options (IFEO).

Dans chacune de ces options, je peux voir les symboles (x crashme!* travaux).

Je cannont utilisation #1 (-server) ou #2 (breakin.exe <pid>), parce que je veux déboguer le code de démarrage d'un fournisseur d'authentification, j'ai donc besoin d' LSASS.exe de moins ntsd -d. Je ne peux pas le laisser courir et de joindre plus tard.

Ma compréhension est que j'ai besoin d'utiliser IFEO. À l'aide de gflags.exe au lieu de modifier manuellement le registre, je exécutable options de

c:\dtw\ntsd -d -G -lines -x -y c:\symcache;c:\windows\system32 -n -srcpath C:\CrashMe\ 
  • Je peux diviser la demande, mais les points d'arrêt j'ai mis ne sont jamais touchés.
  • J'ai peut - .open n'importe quel fichier, mais je ne peux pas utiliser le fichier pour définir un point d'arrêt.
  • Je peux x (examiner) n'importe quel symbole
  • Je ne peux pas voir le code source.

Comment puis-je voir mon code source de la DLL d'un processus en cours d'exécution en vertu de l' ntsd -d par windbg -k?

1voto

Tawnos Points 1556

TL;DR: Utilisez -le serveur <TRANSPORT> -ddefer et de se connecter par l'intermédiaire d'un deuxième windbg session .lsrcpath ensemble pour obtenir ce que vous voulez.

Le reste: Source mode nécessite l'accès à partir du système de l'exécution du débogueur pour les fichiers source. Dans le cas de débogage de code du mode utilisateur le noyau du mode de connexion, cela devient délicat. Etant donné que le test est en cours d'exécution dans le contexte de ntsd sur la machine cible, et que la machine est cassée dans le débogueur, le chargement des fichiers source généralement ne fonctionne pas. Je crois que si vous mettez une arborescence complète du code source sur la machine cible ou souligné la source d'accès à une partie, il peut, mais je n'ai pas vérifié.

Ce que j'ai fait vérifier, c'est que vous pouvez utiliser cette méthode pour obtenir des fichiers source chargé dans votre ordinateur hôte.

Cela fonctionne de la manière suivante:

  1. Commencez votre hôte débogueur de noyau
  2. Début ntsd sur la machine cible (par exemple) `ntsd -serveur tcp:port=50000 -ddefer test.exe`
  3. Démarrer une connexion à votre débogage du serveur (par exemple, dans WinDbg j'utilise ctrl+r `tcp:port=50000,serveur=tawnos-cible")
  4. La connexion se bloque de départ. Passez à votre débogueur de noyau (qui devrait être assis à l'Entrée>) et exécuter `.sommeil 5000` pour permettre l'établissement de la connexion
  5. À ce stade, votre connexion à distance devrait se terminer. Vous pouvez maintenant recharger les symboles nécessaires et de les utiliser .lsrcpath pour définir un srcpath que windbg utiliser afin d'afficher le code source

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X