web-dev-qa-db-fra.com

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

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

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

Merci

23
Sergejs

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 le 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 peut-être 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 attacher à un processus en cours d'exécution, vous pouvez le faire aussi:

(Remarque: si vous utilisez l'édition "Express" de Visual Studio, je n'ai pas pensez cette fonction existe, mais je n'en suis pas certaine. C'est assez facile à dire : Vous aurez l’élément de menu 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ébogage, choisissez Attacher au processus ...

  5. Dans la boîte de dialogue 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 dossier que le dossier bin/Debug de votre projet, vous devez vous assurer de copier le DLL vers cet autre emplacement chaque fois que vous le construisez (vous pouvez le configurer pour qu'il se passe 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.

25
T.J. Crowder

Vous pouvez utiliser le fichier Attacher au processus du menu Debug pour déboguer votre projet DLL. Vous devrez peut-être utiliser le débogage en mode mixte si le débogage ne se produit pas avec du code natif. Pour ce faire, sélectionnez le type de code Managed and Native dans la fenêtre qui apparaît lorsque vous cliquez sur le bouton Select dans la fenêtre Attach to process.

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 String = "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, "<QualifierName>").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 générer votre projet, lance l'application externe, puis attache automatiquement votre DLL à ce programme. Vous pouvez obtenir le QualifierName de votre système à partir de la fenêtre Attach to process. De plus, la version du code géré ("Managed (v4.0)" dans ce cas) dépend de la version du framework .NET que vous utilisez.

2
Manas Jog

Si vous ne voulez pas/ne pouvez pas utiliser d’application externe - vous pouvez appeler la bibliothèque de classes directement à partir de Visual Studio: Ctrl+Alt+I pour afficher "Immediate" Widow, vous pouvez appeler n’importe quelle méthode à partir de votre bibliothèque de classes (utilisez des points de rupture). Vous devrez taper des noms qualifiés complets (c'est-à-dire des espaces de noms).

1
alexkovelsky

Je pense qu’aujourd’hui, il est plus courant de créer un projet de test unitaire pour exécuter votre code de 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.

0
rock_walker