Comment connecter Visual Studio à un processus qui n’est pas encore démarré?

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 je dois déboguer des événements de démarrage.

Si je veux déboguer des événements qui viennent après l’initialisation du programme, il n’y a pas de problème. Je lance le programme à partir de l’explorateur, associe le processus à Visual Studio et ajoute des points d’arrêt dans le code. Mais ici, je dois mettre des points d’arrêt sur les événements de démarrage. Je dois être en mesure d’attacher des processus à Visual Studio, sans dépendre d’un PID, mais d’un nom de processus spécifique ou de toute autre solution qui fonctionnerait.

Bien sûr, append un Thread.Sleep(1000) dans mes événements de démarrage pour me donner le temps de joindre le processus dans Visual Studio est hors de question!

En fait, vous pouvez; vous n’y attachez pas, vous le lancez. Sur les propriétés de votre projet, sous l’onglet Débogage, spécifiez le chemin d’access du programme que vous souhaitez attacher dans la zone de texte “Commande”.

Vous pouvez également entrer des arguments de ligne de commande pour le programme dans la zone “Arguments de commande”:

entrer la description de l'image ici

Assurez-vous que “Attach” est défini sur “No”.

Je déboguais un plugin C ++ dans un processus généré en externe qui plantait en lançant une exception au démarrage et cela fonctionnait parfaitement pour moi:

Ajoutez l’ extension Reattach gratuite pour Visual Studio . Demandez-lui de se rattacher au nom du processus avant de le lancer. Il affichera une boîte de dialog modale indiquant qu’il attend le lancement du nom du processus.

Lancez maintenant le processus et le débogueur Visual Studio se connectera immédiatement, capturant les exceptions et frappant les points d’arrêt.

J’ai trouvé cette réponse quand 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 car il devait être démarré 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’oeil à l’extension de Reattach comme suggéré par mrstrange et aussi l’extension très semblable de Attach To Anything … mais mon exécutable a semblé se fermer trop rapidement pour que les extensions notifient et attachent.

Ce qui m’a finalement aidé, c’est ceci: https://stackoverflow.com/a/4042545/1560865 , qui fait référence à l’article MSDN Comment: lancer le débogueur automatiquement , qui à son tour répertorie les étapes suivantes:

  1. Démarrer l’éditeur du registre (regedit).
  2. Dans l’Éditeur du Registre, ouvrez le dossier HKEY_LOCAL_MACHINE.
  3. Accédez aux options d’exécution du fichier HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ image.
  4. Dans le dossier Options d’exécution du fichier image , recherchez le nom de l’application que vous souhaitez déboguer, tel que myapp.exe . Si vous ne trouvez pas l’application que vous souhaitez déboguer:
    une. Cliquez avec le bouton droit sur le dossier Options d’exécution du fichier image et, dans le menu contextuel, cliquez sur Nouvelle clé .
    b. Cliquez avec le bouton droit sur la nouvelle clé, puis dans le menu contextuel, cliquez sur Renommer . c. Modifier le nom de la clé pour le nom de votre application; myapp.exe , dans cet exemple.
  5. Cliquez avec le bouton droit sur le dossier myapp.exe , puis, dans le menu contextuel, cliquez sur Nouvelle valeur de chaîne .
  6. Cliquez avec le bouton droit sur la nouvelle valeur de chaîne et dans le menu contextuel, cliquez sur Renommer.
  7. Changez le nom en débogueur.
  8. Cliquez avec le bouton droit sur la nouvelle valeur de chaîne et dans le menu contextuel, cliquez sur Modifier . La boîte de dialog Modifier la chaîne apparaît.
  9. Dans la zone données de la valeur , tapez vsjitdebugger.exe .
  10. Cliquez sur OK .
  11. Dans le menu Registre , cliquez sur Quitter .
  12. Le répertoire contenant vsjitdebugger.exe doit se trouver dans votre chemin système. Pour l’append au chemin d’access du système, procédez comme suit:
    une. Ouvrez le Panneau de configuration en mode Classique et double-cliquez sur Système .
    b. Cliquez sur Paramètres système avancés .
    c. Dans Propriétés système , cliquez sur l’onglet Avancé .
    ré. Sous l’onglet Avancé , cliquez sur Variables d’environnement .
    e. Dans la boîte de dialog Variables d’environnement , sous Variables système , sélectionnez Chemin , puis cliquez sur le bouton Modifier .
    F. Dans la boîte de dialog Modifier la variable système , ajoutez le répertoire à la zone Valeur de la variable . Utilisez un point-virgule pour le séparer des autres entrées de la liste.
    g. Cliquez sur OK pour fermer la boîte de dialog Modifier la variable système .
    h. Cliquez sur OK pour fermer la boîte de dialog Variables d’environnement . je. Cliquez sur OK pour fermer la boîte de dialog Propriétés système .
  13. Utilisez maintenant n’importe quelle méthode pour démarrer votre application. Visual Studio démarrera et chargera l’application

J’espère que cela aidera quelqu’un d’autre à l’avenir!

Suivez ces étapes si vous avez Visual Studio 2017:

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

Beaucoup plus facile que d’autres suggestions: vous n’avez pas à vous soucier des propriétés du projet, et aucune extension n’est nécessaire.

S’il n’y a pas de processus, Visual Studio ne peut pas s’y attacher .

Cependant, vous pouvez définir le programme de démarrage de votre projet comme autre chose que la sortie de votre projet.

Une petite solution qui pourrait convenir à de nombreuses personnes.

  • dans la première ligne de code que l’exe exécutera, ajoutez cette commande

    System.Threading.Thread.Sleep (20000)

Cela fera dormir l’exé pendant 20 secondes avant de commencer à traiter quoi que ce soit. Ensuite, vous avez 20 secondes pour attacher au processus, ce qui peut être fait rapidement avec ctrl + alt + p, puis trouver le processus, puis entrez pour joindre.

Pas beaucoup de réponse mais a travaillé un régal pour moi: -)

Vous pouvez afficher un MessageBox, cela bloquerait l’application, puis vous attacheriez ou reconnecteriez le débogueur au processus et cliquez sur OK pour continuer:

 MessageBox.Show("Attach process to debugger and click ok!"); 

vous pouvez l’append au constructeur de formulaire (si vous utilisez des winforms), cela sera donc exécuté avant tout, sauf pour l’initialisation des composants:

 public MainForm() { InitializeComponent(); MessageBox.Show("Attach process to debugger and click ok!"); } 

Lorsque vous avez terminé votre débogage, commentez cette ligne.