120 votes

Comment attacher Visual Studio à un processus qui n'est pas encore lancé ?

J'ai un programme .NET qui ne peut pas être exécuté à partir de Visual Studio pour certaines raisons (fichier Excel créé à partir d'un projet de modèle Excel 2010) pour lequel j'ai besoin de déboguer les événements de démarrage.

Si je veux déboguer les événements qui surviennent après l'initialisation du programme, il n'y a pas de problème. Je lance le programme à partir de l'explorateur, j'attache le processus à Visual Studio et j'ajoute quelques points d'arrêt dans le code. Mais ici, j'ai besoin de mettre des points d'arrêt sur les événements de démarrage. J'ai besoin de pouvoir attacher des processus à Visual Studio, non pas en fonction d'un PID, mais d'un nom de processus spécifique ou de toute autre solution qui fonctionnerait.

Bien entendu, l'ajout d'un Thread.Sleep(1000) dans mes événements de démarrage pour me donner le temps d'attacher le processus dans Visual Studio est hors de question !

113voto

Tibi Points 490

En fait, c'est possible ; vous ne vous y attachez pas, vous le démarrez. Dans les propriétés de votre projet, dans l'onglet Débogage, indiquez le chemin du programme auquel vous voulez vous attacher dans la zone de texte "Commande".

Vous pouvez également saisir des arguments de ligne de commande pour le programme dans la case "Arguments de commande" :

enter image description here

Assurez-vous que l'option "Attachement" est réglée sur "Non".

50voto

Matt Thomas Points 1927

Suivez ces étapes si vous disposez de Visual Studio 2017-2022 :

  1. Fichier > Ouvrir > Projet/Solution
  2. Choisissez votre .exe
  3. Débogage > Démarrer le débogage

Vous devrez indiquer à Visual Studio où se trouvent les symboles de débogage s'il ne les trouve pas automatiquement.

Cette solution est plus simple que les autres : vous n'avez pas à vous occuper des propriétés du projet et aucune extension n'est nécessaire.

29voto

user2448947 Points 41

J'étais en train de déboguer un plugin C++ dans un processus externe qui se bloquait en lançant une exception au démarrage et cela a parfaitement fonctionné pour moi :

Ajouter la gratuité Extension Reattach pour Visual Studio . Demandez-lui de se rattacher au nom du processus avant de le lancer. Il affichera une boîte de dialogue modale indiquant qu'il attend le lancement du nom du processus.

Lancez maintenant le processus et le débogueur de Visual Studio s'y attachera immédiatement, capturant les exceptions et les points d'arrêt.

19voto

Hauke P. Points 2275

J'ai trouvé cette réponse alors que je cherchais quelque chose de similaire. Dans mon cas, je ne pouvais pas simplement utiliser l'exécutable comme programme de démarrage de mon projet parce qu'il devait être lancé dans un environnement très spécifique que je ne pouvais pas reproduire facilement (à savoir : lancé à partir de cygwin).

J'ai jeté un coup d'œil à l'extension Reattach en tant que suggéré par mrstrange ainsi que le très similaire Attachez à n'importe quoi mais mon exécutable semble se fermer trop rapidement pour que les extensions soient notifiées et attachées.

Ce qui m'a finalement aidé, c'est ceci : https://stackoverflow.com/a/4042545/1560865 qui fait référence à l'article de MSDN Comment faire ? Lancer automatiquement le débogueur qui énumère à son tour les étapes suivantes :

  1. Lancez l'éditeur du registre (regedit).
  2. Dans l'éditeur du registre, ouvrez le dossier HKEY_LOCAL_MACHINE.
  3. Accédez à HKEY_LOCAL_MACHINE \Software\Microsoft\Windows NT \currentversion\image options d'exécution du fichier.
  4. Dans le cadre de la Options d'exécution du fichier image localisez le nom de l'application que vous souhaitez déboguer, par exemple myapp.exe . Si vous ne trouvez pas l'application que vous souhaitez déboguer :
    a. Cliquez avec le bouton droit de la souris sur l'icône Options d'exécution du fichier image et dans le menu contextuel, cliquez sur Nouvelle clé .
    b. Cliquez avec le bouton droit de la souris sur la nouvelle clé et, dans le menu contextuel, cliquez sur Renommer . c. Modifiez le nom de la clé pour qu'il corresponde au nom de votre application ; myapp.exe dans cet exemple.
  5. Cliquez avec le bouton droit de la souris sur l'icône myapp.exe et dans le menu contextuel, cliquez sur Nouvelle valeur de la chaîne .
  6. Cliquez avec le bouton droit de la souris sur la nouvelle valeur de la chaîne et, dans le menu contextuel, cliquez sur Renommer.
  7. Modifier le nom en debugger .
  8. Cliquez avec le bouton droit de la souris sur la nouvelle valeur de la chaîne et, dans le menu contextuel, cliquez sur Modifier . Les Modifier la chaîne La boîte de dialogue s'affiche.
  9. Dans le cadre de la Données de valeur tapez vsjitdebugger.exe .
  10. Cliquez sur OK .
  11. A partir de la Registre cliquer sur Sortie .
  12. Le répertoire contenant vsjitdebugger.exe doit se trouver dans le chemin d'accès de votre système. Pour l'ajouter au chemin d'accès du système, procédez comme suit :
    a. Ouvrir le Panneau de contrôle dans la vue classique, et double-cliquez sur Système .
    b. Cliquez sur Paramètres avancés du système .
    c. En Propriétés du système , cliquez sur le bouton Avancé tabulation.
    d. Sur le Avancé cliquer sur l'onglet Variables d'environnement .
    e. Dans le Variables d'environnement dans la boîte de dialogue Variables du système , sélectionner Chemin d'accès puis cliquez sur le bouton Editer bouton.
    f. Dans le Modifier une variable du système ajoutez le répertoire à la boîte de dialogue Valeur de la variable boîte. Utilisez un point-virgule pour la séparer des autres entrées de la liste.
    g. Cliquez sur OK pour fermer le Modifier une variable du système dans la boîte de dialogue.
    h. Cliquez sur OK pour fermer le Variables d'environnement dans la boîte de dialogue.
    i. Cliquez sur OK pour fermer le Propriétés du système dans la boîte de dialogue.
  13. Maintenant, utilisez n'importe quelle méthode pour démarrer votre application. Visual Studio démarre et charge l'application.

J'espère que cela aidera d'autres personnes à l'avenir !

18voto

SomeBody Points 4139

Vous pouvez lancer le débogueur à partir de votre code via

public static void Main(string[] args)
{
  System.Diagnostics.Debugger.Launch();
}

Mais n'oubliez pas d'enlever cette ligne avant d'envoyer votre demande. Peut-être voudrez-vous utiliser les drapeaux du compilateur pour vous en assurer :

    public static void Main(string[] args)
    {
      #if debug
      System.Diagnostics.Debugger.Launch();
      #endif
    }

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