web-dev-qa-db-fra.com

Comment déboguer une dll référencée (ayant pdb)

Ma question concerne Visual Studio 2008, bien que je suppose que cela devrait être la même chose dans VS2005. 

J'ai deux solutions dans mon espace de travail, dites A et B.

La solution A est un projet plus ancien que j'ai fini de coder il y a quelque temps . Dans la solution B, je dois utiliser certaines classes de la solution A. Pour ce faire, j'ajoute une référence à la dll d'un des projets de la solution A .

Le problème, c'est quand j'essaie de déboguer. Je veux aussi pouvoir entrer dans le code de A. Visual studio n'est pas en mesure de charger le code pour ces classes ("Il n'y a pas de code source disponible pour l'emplacement actuel") et je ne peux que visualiser le désassemblage, ce qui n'est pas utile.

Le seul moyen que je connaisse pour déboguer des classes à partir de la solution A consiste à exécuter la solution B, à détacher tous les processus (dans l'élément de menu Débogage) et à attacher le processus à partir de la solution A.

Cependant, ceci est très gênant et je ne peux que déboguer A OR B à la fois.

Existe-t-il un moyen d'autoriser à entrer dans le code des DLL référencées (pour lequel j'ai le code source)?


Solution: Mon erreur est que je pensais qu'un projet ne pouvait faire partie que d'une solution unique. En fait, un projet peut faire partie de nombreuses solutions.
Lorsque vous devez référencer l'ancien projet, vous devez simplement ajouter le projet à la solution. Pour ce faire, cliquez avec le bouton droit sur la nouvelle solution dans l'explorateur de solutions> Ajouter> Projet existant.
Ensuite, vous pourrez ajouter la référence du projet. Comme d'autres l'ont écrit, vous devriez probablement éviter complètement d'utiliser des références DLL à votre propre code (ou à un autre code dont vous pourriez avoir besoin pour changer et déboguer).

Vous trouverez une très bonne référence à la manière dont les solutions devraient être conçues dans MSDN .

107
Elad

Si vous avez un project reference, cela devrait fonctionner immédiatement.

S'il s'agit d'une référence fichier (dll), les symboles de débogage (le fichier "pdb") doivent se trouver dans le même dossier que la dll. Vérifiez que vos projets génèrent des symboles de débogage (propriétés du projet => Construire => Avancé => Informations de sortie/débogage = complet); et si vous avez copié la dll, placez-la avec le pdb.

Vous pouvez également charger des symboles directement dans IDE si vous ne voulez copier aucun fichier, mais cela demande plus de travail.

L'option la plus simple est d'utiliser des références de projet!

92
Marc Gravell

J'ai eu le même problème. Il est ce que j'ai trouvé:

1) assurez-vous que tous les projets utilisent le même cadre (c'est crucial!)

2) dans Outils/Options> Débogage> Général, assurez-vous que "Activer uniquement mon code (géré uniquement)" n'est pas coché.

3) dans Outils/Options> Débogage> Désactivez les symboles cachés, désélectionnez et supprimez tous les emplacements de dossier de la liste "Emplacements du fichier de symboles (.pdb)", à l'exception du "Serveur Microsoft Symbol" par défaut, mais désélectionnez-le également. Supprimez également tous les chemins statiques dans la zone de texte "Cache symboles dans ce répertoire". Cliquez sur le bouton "Vider le cache des symboles". Enfin, assurez-vous que le bouton radio "Uniquement les modules spécifiés" est coché.

4) dans le menu Build/Configuration Manager de tous les projets, assurez-vous que la configuration est en mode débogage.

37
scott_f

Un autre point à garder à l'esprit, assurez-vous que les dll référencées ne sont pas installées dans le GAC. Après les tests, j’ai installé mes dll dans le GAC pour effectuer des tests au niveau du système. Plus tard, quand j'ai dû déboguer à nouveau mon code, je n'ai pas pu accéder aux assemblys référencés tant que je ne les ai pas supprimés du GAC.

9
KevinHou

Lorsque vous souhaitez définir un point d'arrêt dans le code source d'une dll référencée, assurez-vous d'abord qu'un fichier pdb est disponible. Ensuite, vous pouvez simplement ouvrir le fichier de code source associé et définir un point d'arrêt là-bas. Le fichier source n'a pas besoin de faire partie de votre solution . Comme expliqué dans Comment définir un point d'arrêt dans le code référencé dans Visual Studio?

Vous pouvez examiner vos points d'arrêt via la fenêtre correspondante, accessible via Debug -> Windows -> Points d'arrêt.

Cette approche présente l'avantage que vous n'êtes pas obligé d'ajouter un projet existant à votre solution à des fins de débogage, car le laisser de côté m'a permis de gagner beaucoup de temps de génération. Évidemment, construire une solution avec un seul projet est beaucoup plus rapide que de construire une solution avec beaucoup d'entre eux.

2
Carl in 't Veld

Étape 1: Allez dans Outils -> Option -> Débogage  

Étape 2: Décochez la case Activer uniquement mon code

Étape 3: Décochez la case Exiger que le fichier source corresponde exactement à la version d'origine.

Étape 4: Décochez la case Etape sur les propriétés et les opérateurs

2
Arindam Dhar

J'ai eu les fichiers *.pdb dans le même dossier et utilisé les options de Arindam , mais cela ne fonctionnait toujours pas. Il s'avère qu'il me fallait activer Activer le débogage de code natif, qui se trouve sous Propriétés du projet> Debug.

0
Roald

Ça doit marcher. J'avais l'habitude de déboguer un fichier .exe et une dll en même temps! project 3) Contrôlez que le chemin pointe sur les fichiers A dll et de pdb .... 4) Après cela, vous démarrez en déboguant le projet B et si tout va bien, vous pourrez le déboguer en les deux projets!

0
Matthieu

Je ne souhaite pas inclure de projet de bibliothèque de classes externe dans certaines de mes solutions. Je vais donc dans des assemblys que je consomme différemment. 

Mes solutions ont un répertoire "Common Assemblies" qui contient mes propres DLL d'autres projets. Les fichiers DLL auxquels je fais référence ont également leurs fichiers PDB pour le débogage.

Afin de déboguer et de définir des points d'arrêt, j'ai défini un point d'arrêt dans le source de l'application consommatrice sur lequel j'appelle une méthode ou un constructeur à partir de l'assembly, puis j'étape INTO (F11) de l'appel méthode/constructeur.

Le débogueur chargera le fichier source de l'assembly dans VS et les nouveaux points d'arrêt à l'intérieur de l'assembly pourront être définis à ce stade.

Ce n'est pas simple, mais fonctionne si vous ne souhaitez pas inclure une nouvelle référence de projet et souhaitez simplement référencer une Assemblée partagée à la place.

0
jlafay