Déboguer des DLL dans Visual Studio (C#, C++, Visual Basic, F#)

Une DLL (bibliothèque de liens dynamiques) est une bibliothèque qui contient du code et des données pouvant être utilisés par plusieurs applications. Vous pouvez utiliser Visual Studio pour créer, générer, configurer et déboguer des DLL.

Créer une DLL

Les modèles de projet Visual Studio suivants peuvent créer des DLL :

  • Bibliothèque de classes C#, Visual Basic ou F#
  • Bibliothèque de contrôles Windows Forms (WCF) C# ou Visual Basic
  • Bibliothèque de liens dynamiques (DLL) C++

Pour plus d’informations, consultez Techniques de débogage de MFC.

Le débogage d’une bibliothèque WCF est semblable à celui d’une bibliothèque de classes. Pour plus d’informations, consultez Contrôles Windows Forms.

Vous appelez généralement une DLL à partir d’un autre projet. Quand vous déboguez le projet appelant, en fonction de la configuration DLL, vous pouvez effectuer un pas à pas détaillé du code DLL et le déboguer.

Configuration de débogage DLL

Quand vous utilisez un modèle de projet Visual Studio pour créer une application, Visual Studio crée automatiquement les paramètres nécessaires pour les configurations de build Debug et Release. Si nécessaire, vous pouvez changer ces paramètres. Pour plus d’informations, consultez les articles suivants :

Définir C++ DebuggableAttribute

Pour que le débogueur s’attache à une DLL C++, le code C++ doit envoyer DebuggableAttribute.

Pour définir DebuggableAttribute :

  1. Sélectionnez le projet DLL C++ dans l’Explorateur de solutions, puis l’icône Propriétés, ou cliquez avec le bouton droit sur le projet et sélectionnez Propriétés.

  2. Dans le volet Propriétés, sousÉditeur de liens>Débogage, sélectionnez Oui (/ASSEMBLYDEBUG) pour Assembly débogable.

Pour plus d’informations, consultez /ASSEMBLYDEBUG.

Définir les emplacements des fichiers DLL C/C++

Pour déboguer une DLL externe, un projet appelant doit pouvoir trouver la DLL, son fichier .pdb et tous les autres fichiers dont la DLL a besoin. Vous pouvez créer une tâche de génération personnalisée pour copier ces fichiers dans votre dossier de sortie <dossier du projet>\Debug, ou vous pouvez copier les fichiers manuellement.

Pour les projets C/C++, vous pouvez définir des emplacements d’en-tête et de fichier LIB dans les pages de propriétés du projet, au lieu de les copier dans le dossier de sortie.

Pour définir les emplacements d’en-tête C/C++ et de fichier LIB :

  1. Sélectionnez le projet DLL C/C++ dans l’Explorateur de solutions, puis l’icône Propriétés, ou cliquez avec le bouton droit sur le projet et sélectionnez Propriétés.

  2. En haut du volet Propriétés, sous Configuration, sélectionnez Toutes les configurations.

  3. Sous C/C++>Général>Répertoires Include supplémentaires, spécifiez le dossier qui a les fichiers d’en-tête.

  4. Sous Éditeur de liens>Général>Répertoires de bibliothèques supplémentaires, spécifiez le dossier qui a les fichiers LIB.

  5. Sous Éditeur de liens>Entrée>Dépendances supplémentaires, spécifiez le chemin complet et le nom de fichier des fichiers LIB.

  6. Sélectionnez OK.

Pour plus d’informations sur les paramètres de projet C++, consultez Informations de référence sur la page de propriétés Windows C++.

Générer une version Debug

Veillez à générer une version Debug de la DLL avant de commencer le débogage. Pour déboguer une DLL, une application appelante doit pouvoir trouver son fichier .pdb et tous les autres fichiers dont la DLL a besoin.

Vous pouvez créer une tâche de génération personnalisée pour copier ces fichiers DLL dans votre dossier de sortie <dossier du projet appelant>\Debug, ou vous pouvez copier les fichiers manuellement.

Veillez à appeler la DLL dans le bon emplacement. Cela peut sembler évident, mais si une application appelante trouve et charge une autre copie de la DLL, le débogueur n’atteint jamais les points d’arrêt que vous définissez.

Déboguer une DLL

Vous ne pouvez pas exécuter directement une DLL. Elle doit être appelée par une application, généralement un fichier .exe. Pour plus d’informations, consultez Projets Visual Studio - C++.

Pour déboguer une DLL, vous pouvez commencer le débogage à partir de l’application appelante ou déboguer à partir du projet DLL en spécifiant son application appelante. Vous pouvez également utiliser la fenêtre Exécution du débogueur pour évaluer les fonctions ou méthodes DLL au moment de la conception, sans utiliser d’application appelante.

Pour plus d’informations, consultez Aperçu du débogueur.

Démarrer le débogage à partir de l’application appelante

L’application qui appelle une DLL peut être :

  • Une application d’un projet Visual Studio dans la même solution ou une solution différente que celle de la DLL.
  • Une application existante déjà déployée et en cours d’exécution sur un ordinateur de test ou de production.
  • Située sur le web et accessible via une URL.
  • Une application web avec une page web qui incorpore la DLL.

Pour déboguer une DLL à partir d’une application appelante, vous pouvez :

  • Ouvrir le projet de l’application appelante et démarrer le débogage en sélectionnant Déboguer>Démarrer le débogage, ou en appuyant sur F5.

    ou

  • Attacher le débogueur à une application déjà déployée et en cours d’exécution sur un ordinateur de test ou de production. Utilisez cette méthode pour les DLL sur des sites web ou dans des applications web. Pour plus d’informations, consultez Guide pratique pour attacher à un processus en cours d’exécution.

Avant de commencer le débogage de l’application appelante, définissez un point d’arrêt dans la DLL. Consultez Utilisation des points d’arrêt. Quand le point d’arrêt de la DLL est atteint, vous pouvez exécuter le code pas à pas, en observant l’action sur chaque ligne. Pour plus d’informations, consultez Naviguer dans le code dans le débogueur.

Pendant le débogage, vous pouvez utiliser la fenêtre Modules pour vérifier les DLL et les fichiers .exe chargés par l’application. Pour ouvrir la fenêtre Modules, pendant le débogage, sélectionnez Déboguer>Fenêtres>Modules. Pour plus d’informations, consultez Guide pratique pour utiliser la fenêtre Modules.

Utiliser la fenêtre Exécution

Vous pouvez utiliser la fenêtre Exécution pour évaluer des fonctions ou des méthodes DLL au moment de la conception. La fenêtre Exécution joue le rôle d’une application appelante.

Notes

Vous pouvez utiliser la fenêtre Exécution au moment de la conception avec la plupart des types de projet. Elle n’est pas prise en charge pour SQL, les projets web ou les scripts.

Par exemple, pour tester une méthode nommée Test dans la classe Class1 :

  1. Une fois le projet DLL ouvert, ouvrez la fenêtre Exécution en sélectionnant Déboguer>Fenêtres>Exécution, ou en appuyant sur Ctrl+Alt+I.

  2. Instanciez un objet de type Class1 en tapant le code C# suivant dans la fenêtre Exécution et en appuyant sur Entrée. Ce code managé fonctionne pour C# et Visual Basic, avec les changements de syntaxe appropriés :

    Class1 obj = new Class1();
    

    En C#, tous les noms doivent être qualifiés complets. Toutes les méthodes ou variables doivent se trouver dans l’étendue et le contexte actuels quand le service de langage tente d’évaluer l’expression.

  3. En supposant que Test nécessite un paramètre int , évaluez Test à l'aide de la fenêtre Exécution :

    ?obj.Test(10);
    

    Le résultat est imprimé dans la fenêtre Exécution.

  4. Vous pouvez continuer à déboguer Test en y insérant un point d’arrêt, puis en réévaluant la fonction.

    Le point d’arrêt est atteint et vous pouvez exécuter un pas à pas de Test. Une fois que l’exécution a quitté Test, le débogueur repasse en mode Création.

Débogage en mode mixte

Vous pouvez écrire une application appelante pour une DLL en code managé ou natif. Si votre application native appelle une DLL managée et que vous souhaitez déboguer les deux, vous pouvez activer les débogueurs managés et natifs dans les propriétés du projet. Le processus exact varie selon que vous souhaitez commencer le débogage à partir du projet DLL ou du projet de l’application appelante. Pour plus d’informations, consultez Guide pratique pour déboguer en mode mixte.

Vous pouvez également déboguer une DLL native à partir d’un projet appelant managé. Pour plus d’informations, consultez Guide pratique pour déboguer du code managé et natif.