web-dev-qa-db-fra.com

Débogage: attacher au processus pour l'application console s'exécutant dans cmd.exe

Comment vous "attacher au processus ..." pour une application console qui s'exécute depuis une fenêtre CMD et non lancée par F5? La raison pour laquelle je pose cette question est que l'application utilise des arguments en ligne de commande et que je souhaite vivre une expérience authentique.

J'ai même attaché à CMD.exe, mais pas de chance, ni à définir un point d'arrêt à l'aide de Console.ReadKey() avec également pas de chance. Je suis un peu perdue ici.

Est-ce possible?

26
Chris

Vous avez quelques options:

  • Utilisez l'option "Debug -> Arguments de la ligne de commande" dans Visual Studio.
  • Utilisez "Debug -> Attach to process" et recherchez votre processus. ce n'est pas cmd.exe, mais un processus avec un nom de fichier exécutable tel que "MyProject.exe". Vous pouvez utiliser Process Explorer ou un autre gestionnaire de tâches prenant en charge "l'arborescence" pour trouver facilement l'ID de processus. Il vous suffit de rechercher les processus lancés par votre cmd.exe.
  • Mettez Debugger.Break () dans votre code - lorsque cette méthode est exécutée, le système ouvre une boîte de dialogue vous demandant de choisir quelle instance de Visual Studio utiliser pour le débogage (vous pouvez choisir celle avec votre projet déjà ouvert).
30
VladV

Pour déboguer à partir de la ligne de commande plutôt que d'utiliser le labyrinthe de l'interface graphique de VS:

  • Lancer l'invite de commande de Visual Studio

  • tapez vsjitdebugger /? qui vous donne un exemple de commande comme: 

c:> vsjitdebugger [NomApp] [Args]: Lance le fichier exécutable spécifié et attache au débogueur

  • en tapant tlist ou tasklist , vous obtiendrez des PID que vous pourrez associer à des processus existants. Exemple: 

c:> liste de tâches | trouver/i "web"

5
Kwame

C'est possible, bien sûr. Essayez l'une de ces deux:

  1. Démarrez le processus, puis allez dans Debug-> Attach et trouvez le processus. Vous devrez peut-être vous rafraîchir pour le voir.
  2. Ajoutez une instruction "Debugger.Break ()" dans le code, si possible; cela se cassera automatiquement (mais assurez-vous de le supprimer ou de l’entourer de directives de préprocesseur afin qu’il n’entre pas dans le code de production).
2
roufamatic

Comme d'autres l'ont déjà dit, vous pouvez spécifier les arguments de ligne de commande stratup à partir du projet et simplement démarrer le débogage dans Visual Studio.

Si vous souhaitez toujours attacher à l'application en cours d'exécution, vous devez attacher le débogueur à MyApp.exe (quel que soit le nom de votre application - l'exe compilé dans le répertoire bin\debug) et non à cmd.exe. Attachement à cmd.exe l'attache au processus de commande, pas au processus de votre application.

1
adrianbanks

Dans la section "Debug" des paramètres de projet, une zone de texte pour "Arguments de la ligne de commande:". Lorsque le débogueur VS démarre le programme C #, il transmet ces arguments au processus comme si le programme avait été lancé à partir de la ligne de commande avec ces arguments.

L'alternative consiste à utiliser un débogueur de ligne de commande. Il existe quelques options ici, mais en toute honnêteté, elles ne sont probablement pas ce que vous voulez utiliser à la place de VS, sauf si vous vous lancez dans des scénarios de débogage très lugubres. Si vous souhaitez les consulter, il y a un bon résumé dans cette réponse SO:

Vous pouvez également essayer la technique de passer un appel à System.Diagnostics.Debugger.Break() au début de votre initialisation - si le programme est exécuté sous un débogueur, il se cassera et ne fonctionnera pas sous un débogueur. Vous pouvez effectuer l'appel de manière conditionnelle en fonction d'un fichier de configuration ou d'un paramètre de variable d'environnement, de sorte que vous n'obtenez la pause que si cela vous intéresse vraiment (quelque peu intrusif, mais pas trop mal).

0
Michael Burr

Ajoutez simplement une entrée de registre pour le nom de votre exe dans "Options d'exécution du fichier image HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\currentversion\image", en ajoutant une clé "débogueur" associée à "vsjitdebugger.exe", une boîte de dialogue s'ouvre en vous demandant de choisir une version de VS à déboguer lorsque le fichier exe démarre.

voir MSDN " Comment: lancer le débogueur automatiquement " pour plus d'informations.

0
kaige