Comment attacher Visual Studio à un processus qui n'a pas encore démarré?

89

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. 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, j'ai besoin de mettre des points d'arrêt sur les événements de démarrage. Je dois être capable d'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 sûr, ajouter un Thread.Sleep(1000)événement 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!

Ucodia
la source

Réponses:

97

En fait, vous 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 du programme auquel vous souhaitez vous 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":

entrez la description de l'image ici

Assurez-vous que «Joindre» est réglé sur «Non».

Tibi
la source
6
Bonne solution, mais notez simplement que frapper F5 ne fonctionne pas dans ce cas. Au lieu de cela, faites un clic droit sur le projet concerné et cliquez sur «Déboguer> Démarrer une nouvelle instance» dans le menu contextuel.
Herman Cordes
1
Pour que F5 fonctionne, votre projet doit être le projet de départ de la solution. Pour ce faire, dans l'explorateur de solutions, faites un clic droit sur le projet et sélectionnez «Définir comme projet de démarrage».
Tibi
1
De plus, si votre programme a des dépendances externes, vous devez également modifier le «Répertoire de travail».
Priyank
Il peut être nécessaire de cocher «Activer le débogage du code natif» (propriétés du projet → DéboguerActiver les débogueurs ).
Peter Mortensen
Et comment faire cela pour une solution complète avec 40 projets?
Tony Tannous le
23

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 l' extension gratuite Reattach pour Visual Studio . Demandez-lui de se rattacher au nom du processus avant de le lancer. Il fera apparaître une boîte de dialogue modale indiquant qu'il attend le lancement du nom du processus.

Maintenant, lancez le processus et le débogueur Visual Studio s'attachera immédiatement, intercepter les exceptions et atteindre les points d'arrêt.

mstrange
la source
Mille fois oui!
itslittlejohn
J'ai une impasse. Il a demandé l'authentification de l'administrateur lorsque ma cible a été lancée, et après avoir tapé pwd et redémarré vs, Reattach était parti. Seul vs sans authentification administrateur contient Reattach.
Eric
2
Ça ne marche pas pour moi. Il s'attache encore trop tard, après que le crash s'est déjà produit. Il semble vérifier les processus existants une fois par seconde, ce qui est totalement inutile pour cette application.
riv
20

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.

Matt Thomas
la source
Mais vous devrez indiquer à Visual Studio où se trouvent les symboles de débogage, s'il ne les trouve pas automatiquement
Matt Thomas
1
rapide facile à faire en 5 secondes, je l'adore. Merci
ComradeJoecool
1
Mon exe a été lancé, mais aucun point d'arrêt n'a pu être défini. Que devrais-je faire?
Eric
2
@Eric Si mon commentaire ci - dessus ne le répond pas, je recommande de le poser comme une question SO au lieu d'un commentaire. Votre problème aura plus de visibilité et vous aurez la possibilité d'expliquer votre scénario spécifique. Alors faites-nous savoir ce que vous trouvez!
Matt Thomas
11

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 (nommément: démarré de cygwin).

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

Voici ce qui m'a finalement aidé: 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émarrez l'éditeur de registre (regedit).
  2. Dans l'Éditeur du Registre, ouvrez le dossier HKEY_LOCAL_MACHINE.
  3. Accédez aux options d'exécution du fichier image HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \.
  4. Dans le dossier Options d'exécution du fichier image , recherchez 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 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é et dans le menu contextuel, cliquez sur Renommer . c. Modifiez le nom de la clé avec le 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 s'affiche.
  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'ajouter au chemin d'accès système, procédez comme suit:
    a. Ouvrez le Panneau de configuration en affichage 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 dialogue Variables d'environnement , sous Variables système , sélectionnez Chemin , puis cliquez sur le bouton Modifier .
    F. Dans la variable système Modifierboîte de dialogue, 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 dialogue Modifier la variable système .
    h. Cliquez sur OK pour fermer la boîte de dialogue Variables d'environnement .
    je. Cliquez sur OK pour fermer la boîte de dialogue Propriétés système .
  13. Maintenant, utilisez 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!

Hauke ​​P.
la source
3
Voici les instructions pour ce même processus avec les versions plus récentes de VS (jusqu'en 2019): docs.microsoft.com/en-us/visualstudio/debugger/…
brichins
3

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.

ChrisF
la source
J'ai déjà cherché à savoir si ce que je voulais faire est juste, et c'est effectivement le cas. Ma situation n'est pas un cas de débogage Visual Studio habituel. J'ai un projet de modèle Excel 2010 développé dans Visual Studio et les feuilles de modèle contiennent des événements de démarrage. J'exécute ce modèle à partir de Visual Studio, ajoute des données dans mes feuilles Excel et enregistre le fichier sur le disque. Ensuite, la seule façon d'ouvrir ce fichier qui repose également sur l'assemblage du modèle est de l'ouvrir à partir de l'explorateur.Par conséquent, je ne peux pas déboguer les événements de démarrage dans ce cas et bien sûr, j'ai un traitement de données au démarrage comme la liaison de données.
Ucodia
Il peut être nécessaire de cocher «Activer le débogage du code natif» (propriétés du projet → DéboguerActiver les débogueurs ).
Peter Mortensen
3

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, commentez cette ligne.

Raynet
la source
3

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

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

Mais ne supprimez pas cette ligne avant d'envoyer votre application. Vous souhaitez peut-être utiliser les indicateurs du compilateur pour être sûr:

    public static void Main(string[] args)
    {
      #if debug
      System.Diagnostics.Debugger.Launch();
      #endif
    }
SomeBody
la source
2
Cela devrait être la réponse acceptée dans tous les cas où vous attendez un processus externe pour lancer votre application.
TravelingFox
2

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'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 recherchez le processus, puis entrez pour le joindre.

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

user2728841
la source
J'ai dû déboguer un CGI écrit en "C" pour lequel j'avais le code source. J'étais une solution simple et facile pour avoir le temps de s'attacher au processus d'arrière-plan.
Joël Hecht