Comment déboguer la bibliothèque de classe qui a appelé depuis une application externe?

Il existe un stream de travail externe qui exécute les scripts C # et peut fonctionner avec des fichiers DLL (ma bibliothèque de classes).

Est-il possible d’attacher le débogage à mon projet de bibliothèque de classe afin que le point d’arrêt frappe une fois que ce WF l’appellera?

Merci

Oui, vous pouvez le faire avec Visual Studio. Vous avez deux options:

Configurez votre projet pour démarrer le programme externe

  1. Ouvrez votre projet DLL.

  2. Sur les propriétés du projet, accédez à l’onglet Débogage .

  3. Choisissez Démarrer programme externe et indiquez le chemin du programme externe qui appellera votre DLL, ainsi que tous les arguments de ligne de commande que vous devrez éventuellement fournir, ainsi que le répertoire de travail, le cas échéant.

  4. Enregistrez le projet.

  5. Définissez les points d’arrêt de votre code à l’endroit souhaité.

  6. Appuyez sur F5 pour lancer le débogage. (À ce stade, vos points d’arrêt indiqueront qu’ils ne seront pas touchés, car les symboles ne sont pas chargés. Ne vous en faites pas pour l’instant.)

  7. Faites ce que vous faites pour que l’application externe charge votre bibliothèque et exécute votre code.

Visual Studio détecte le chargement du module, charge les symboles et s’arrête sur le point d’arrêt.

Attacher à un processus existant

Si vous ne pouvez pas démarrer le processus mais que vous devez vous connecter à un processus en cours d’exécution, vous pouvez le faire aussi:

(Remarque: si vous utilisez l’édition “Express” de Visual Studio, je ne pense pas qu’elle dispose de cette fonctionnalité, mais je n’en suis pas certain. C’est assez simple à dire: vous aurez le menu point mentionné à l’étape 4 ci-dessous ou non.)

  1. Assurez-vous que le processus est en cours d’exécution.

  2. Ouvrez votre projet DLL.

  3. Définissez vos points d’arrêt, etc.

  4. Dans le menu Déboguer , choisissez Joindre au processus …

  5. Dans la boîte de dialog résultante, recherchez le processus dans la liste, mettez-le en surbrillance, puis cliquez sur Joindre .

  6. Visual Studio passera en mode débogage. (À ce stade, vos points d’arrêt indiqueront qu’ils ne seront pas touchés, car les symboles ne sont pas chargés. Ne vous en faites pas pour l’instant.)

  7. Faites ce que vous faites pour charger le processus externe et exécuter votre code.

Visual Studio détectera la charge du module dans le processus externe, chargera vos symboles et s’arrêtera sur votre point d’arrêt.


NB Dans les deux cas, si le processus externe charge votre DLL à partir d’un autre emplacement que le dossier bin/Debug de votre projet, vous devez vous assurer de la copier à cet emplacement chaque fois que vous le construisez (vous pouvez le configurer automatiquement dans les options du projet). Sinon, Visual Studio ne pourra pas détecter que la DLL en cours de chargement est celle que vous essayez de déboguer.

Vous pouvez utiliser l’ attachement à traiter du menu Débogage pour déboguer votre projet DLL. Vous devrez peut-être utiliser le débogage en mode mixte si le débogage n’a pas lieu avec du code natif. Pour ce faire, sélectionnez le type de code Géré et natif dans la fenêtre qui apparaît lorsque vous cliquez sur le bouton Sélectionner dans la fenêtre Joindre au processus .

Si l’édition de Visual Studio que vous utilisez prend en charge les macros, vous pouvez créer une nouvelle macro avec le code suivant pour automatiser tout cela:

 Imports System Imports EnvDTE Imports EnvDTE80 Imports EnvDTE90 Imports EnvDTE90a Imports EnvDTE100 Imports System.Diagnostics Public Module AttachToProcess Public Sub DebugMyDLL() DTE.ExecuteCommand("Build.BuildSelection") Dim ApplicationExePath As Ssortingng = "C:\Program Files (x86)\foo\bar.exe" Shell(ApplicationExePath) Try Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default") Dim dbgeng(2) As EnvDTE80.Engine dbgeng(0) = trans.Engines.Item("Managed (v4.0)") dbgeng(1) = trans.Engines.Item("Native") Dim proc2 As EnvDTE80.Process2 = dbg2.GetProcesses(trans, "").Item("bar.exe") proc2.Attach2(dbgeng) Catch ex As System.Exception MsgBox(ex.Message) End Try End Sub End Module 

La macro ci-dessus tente de créer votre projet, lance l’application externe, puis attache automatiquement votre DLL à ce programme. Vous pouvez obtenir le QualifierName pour votre système à partir de la fenêtre Attacher au processus . En outre, la version du code géré (“Managed (v4.0)” dans ce cas) dépend de la version du framework .NET que vous utilisez.

Je pense qu’aujourd’hui, il est plus courant de créer un projet de test unitaire pour exécuter le code de votre bibliothèque. Ainsi, vous ferez d’une pierre deux coups: vous pourrez déboguer votre projet dans la même solution et commencer à couvrir votre code par des tests.

Si vous ne voulez pas / ne pouvez pas utiliser une application externe – vous pouvez appeler la bibliothèque de classes directement à partir de Visual Studio: Ctrl+Alt+I pour afficher la veuve "Immediate" , vous pouvez appeler n’importe quelle méthode à partir de votre bibliothèque de classes à partir de là ( utiliser des points d’arrêt). Vous devrez taper des noms complets (c.-à-d. Espaces de noms).