web-dev-qa-db-fra.com

Comment attacher 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 les événements qui surviennent après l'initialisation du programme, il n'y a pas de problème. J'exécute le programme à partir de l'explorateur, attache 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. J'ai besoin de pouvoir attacher des processus à Visual Studio, non pas en fonction d'un PID, mais sur un nom de processus spécifique ou toute autre solution qui fonctionnerait.

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

66
Ucodia

En fait, vous le pouvez; vous ne vous y attachez pas, vous le démarrez. Dans les propriétés de votre projet, sous l'onglet Débogage, spécifiez le chemin d'accès du programme auquel vous souhaitez attacher dans la zone de texte "Commande".

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

enter image description here

Assurez-vous que "Attacher" est réglé sur "Non".

85
Tibi

Je déboguais un plugin C++ dans un processus généré en externe qui s'est écrasé en lançant une exception au démarrage et cela a parfaitement fonctionné pour moi:

Ajoutez gratuitement Rattachez l'extension pour Visual Studio . Demandez-lui de se reconnecter au nom du processus avant son lancement. Il fera apparaître une boîte de dialogue 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, interceptant les exceptions et atteignant les points d'arrêt.

20
mstrange

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

  1. Fichier> Ouvrir> Projet/Solution
  2. Choisissez votre .exe
  3. Déboguer> 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.

11
Matt Thomas

J'ai trouvé cette réponse lorsque 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: démarré depuis cygwin).

J'ai jeté un coup d'œil à l'extension Reattach comme suggérée par mrstrange et aussi très similaire Attach To Anything extension ... mais mon exécutable semblait se fermer trop rapidement pour que les extensions soient notifier et joindre.

Ce qui m'a finalement aidé était le suivant: https://stackoverflow.com/a/4042545/1560865 , qui fait référence à l'article MSDN Comment: lancer automatiquement le débogueur , qui en -turn répertorie les étapes suivantes:

  1. Démarrez 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 de fichier image , et dans le menu contextuel, cliquez sur Nouvelle clé .
    b. Cliquez avec le bouton droit sur la nouvelle clé et dans le menu contextuel, cliquez sur Renommer . c. Modifiez le nom de la clé au nom de votre application; myapp.exe, dans cet exemple.
  5. Cliquez avec le bouton droit sur le dossier myapp.exe et 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 debugger.
  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 dialogue Modifier la chaîne apparaît.
  9. Dans la zone Données de la valeur , saisissez 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'ajouter au chemin système, procédez comme suit:
    une. Ouvrez le Panneau de configuration dans la vue 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é. Dans l'onglet Avancé , cliquez sur Variables d'environnement .
    e. Dans la boîte de dialogue Variables d'environnement , sous Variables système , sélectionnez Chemin , puis cliquez sur le bouton Modifier .
    F. Dans la boîte de dialogue Modifier la variable système , ajoutez le répertoire à la valeur de la variable boîte. Utilisez un point-virgule pour le séparer des autres entrées de la liste.
    g. Cliquez sur [~ # ~] ok [~ # ~] pour fermer la Modifier la variable système boîte de dialogue.
    h. Cliquez sur [~ # ~] ok [~ # ~] pour fermer les variables d'environnement boite de dialogue.
    je. Cliquez sur [~ # ~] ok [~ # ~] pour fermer les propriétés système boite 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 quelqu'un d'autre à l'avenir!

9
Hauke P.

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

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

3
ChrisF

Vous pouvez afficher un MessageBox, cela bloquerait l'application, puis vous attachez ou rattachez le débogueur au processus et cliquez sur ok pour continuer:

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

vous pouvez l'ajouter au constructeur Form (si vous utilisez winforms), donc cela serait exécuté avant toute autre chose, 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, mettez cette ligne en commentaire.

1
Raynet

Une petite solution qui pourrait convenir à de nombreuses personnes.

  • dans la première ligne de code exécutée par l'exe, ajoutez cette commande

    System.Threading.Thread.Sleep (20000)

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

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

1
user2728841