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

132

J'ai deux solutions dans mon espace de travail, disons 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 de l'un des projets de la solution A.

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

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

Cependant, c'est très gênant et je ne peux déboguer A OU B qu'à la fois.

Existe-t-il un moyen d'autoriser l'accès au code des dll référencées (pour lesquelles j'ai le code source)?


Solution: Mon erreur a été de penser qu'un projet ne peut faire partie que d'une seule solution. En fait, un projet peut faire partie de n'importe quel nombre de solutions.
Lorsque vous avez besoin de 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 à tout autre code que vous pourriez avoir besoin de modifier et de déboguer).

Une très bonne référence à la façon dont les solutions doivent être conçues peut être trouvée dans MSDN .

Elad
la source
Ce lien MSDN est une lecture incontournable pour les développeurs .net (quel que soit le contrôle de source qu'ils utilisent). Je suis surpris de ne pas l'avoir vu plus tôt. Merci!
Pat
Nouveaux venus, si vous connaissez déjà les références de projet, et que ce n'est pas une option (par exemple, vous devez déboguer un package NuGet), ignorez la réponse acceptée et passez directement à celle-ci: stackoverflow.com/a/26029208/398630
BrainSlugs83

Réponses:

113

Si vous avez une référence de projet , cela devrait fonctionner immédiatement.

S'il s'agit d'une référence de fichier (dll), vous avez besoin que les symboles de débogage (le fichier «pdb») se trouvent 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 => Build => Advanced => Output / Debug Info = full); et si vous avez copié la dll, mettez la pdb avec elle.

Vous pouvez également charger des symboles directement dans l'EDI si vous ne souhaitez copier aucun fichier, mais c'est plus de travail.

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

Marc Gravell
la source
3
Malheureusement, je pense qu'il n'est pas possible d'ajouter une référence de projet au projet à partir d'une autre solution (corrigez-moi si je me trompe!).
Elad
7
@Elad je viens de faire ça. Ajoutez d'abord «projet existant» à la solution. Ajoutez ensuite une référence au projet en cliquant sur Ajouter une référence de projet. Vous pouvez définir les points d'arrêt dans les fichiers de projet existants. C'est bien car les fichiers ne sont pas copiés.
user420667
3
J'ai un projet DLL comme référence de projet mais les points d'arrêt à l'intérieur sont ignorés.
Slav
1
En fait, j'ai pu déboguer un assembly (release-) aujourd'hui qui a été ajouté comme référence de fichier. Tant mieux pour moi, mais comment est-ce arrivé? MSVC2010, C #, (ASP) .NET 4.0, l'assembly référencé existe en tant que debug + release (mais uniquement le fichier de version ajouté au projet). Voudrais vraiment clarifier cela.
Tobias81
1
Pour moi, cela fonctionnait un jour, mais le lendemain ne fonctionnait pas (avec des DLL et des fichiers PDB). En appuyant sur le bouton "Vider le cache de symboles" sur Outils> Options> Débogage> Symboles, le problème a été résolu.
Paul
45

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 Framework (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> Symboles, effacez tous les symboles mis en cache, décochez et supprimez tous les emplacements de dossier sous la zone de liste "Emplacements des fichiers de symboles (.pdb)", à l'exception de la valeur par défaut "Serveurs de symboles Microsoft", mais décochez-la également. Supprimez également tous les chemins statiques dans la zone de texte "Symboles de cache dans ce répertoire". Cliquez sur le bouton "Vider le cache de symboles". Enfin, assurez-vous que le bouton radio "Uniquement les modules spécifiés" est coché.

4) dans le menu Build / Configuration Manager pour tous les projets, assurez-vous que la configuration est en mode Debug.

scott_f
la source
3
Mon problème était que mes deux projets utilisaient des frameworks .Net différents: 4.0 et 4.5. Tx!
user627283
1) et 4) sont cruciaux. N'oubliez pas de construire en mode Debug et d'utiliser le même framework.
scott_f
12

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 faire des tests au niveau du système. Plus tard, quand j'ai dû déboguer à nouveau mon code, je ne pouvais pas entrer dans les assemblys référencés jusqu'à ce que je les ai supprimés du GAC.

KevinHou
la source
2
MERCI! C'était mon problème. Je ne peux pas croire que je n'ai pas compris cela: - / Je pensais que la définition de la référence du projet remplacerait d'une manière ou d'une autre ce qui était installé dans le GAC.
SnookerC
Absolument! C'est un très bon point. Même si vous avez la même version de .NET Framework, si vous avez du code dans le GAC lorsque vous essayez de déboguer, il n'atteindra pas le point d'arrêt si le fichier .PDB dans le GAC est différent de celui de votre dossier de projet. Une solution pour cela est de désinstaller la DLL, de créer, puis de re-GAC l'assembly.
DigiOz Multimedia
7

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

Étape 2: décochez Activer uniquement mon code

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

Étape 4: décochez Pas au-dessus des propriétés et des opérateurs

Arindam Dhar
la source
3

J'avais les *.pdbfichiers dans le même dossier et utilisé les options d' Arindam , mais cela ne fonctionnait toujours pas. Il s'est avéré que j'avais besoin d'activer Activer le débogage de code natif qui se trouve sous Propriétés du projet> Déboguer .

Roald
la source
1
cette information devrait avoir été incluse dans la réponse acceptée. c'est ce que je cherchais spécifiquement. Merci d'avoir partagé! +1
Heriberto Lugo
2

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 que vous disposez d'un fichier pdb 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 puis-je définir un point d'arrêt dans le code référencé dans Visual Studio?

Vous pouvez consulter vos points d'arrêt via la fenêtre des points d'arrêt, disponible via Debug -> Windows -> Breakpoints.

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

Carl in 't Veld
la source
1
Cela ne fonctionne que si le fichier externe dans lequel vous avez placé le point d'arrêt correspond au chemin exact dans la PDB. (Par exemple, ne fonctionne que si vous avez créé la DLL sur votre machine.)
Josh M.
2

Assurez-vous que votre DLL n'est pas enregistrée dans le GAC. Visual Studio utilisera la version dans le GAC et il n'aura probablement aucune information de débogage.

Guillermo Prandi
la source
1

Je ne veux pas inclure un projet de bibliothèque de classes externe dans certaines de mes solutions, alors j'entre dans les assemblys que je consomme d'une manière différente.

Mes solutions ont un répertoire "Common Assemblies" qui contient mes propres DLL d'autres projets. Les DLL que je référence ont également leurs fichiers PDB d'accompagnement 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 la source de l'application consommatrice où j'appelle une méthode ou un constructeur de l'assembly, puis j'étape INTO (F11) l'appel de méthode / constructeur.

Le débogueur chargera le fichier source de l'assembly dans VS et de nouveaux points d'arrêt à l'intérieur de l'assembly peuvent ê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 un assemblage partagé à la place.

Jeff LaFay
la source
0

Ça doit marcher. J'avais l'habitude de déboguer un fichier .exe et une dll en même temps! Ce que je suggère est 1) Incluez le chemin de la dll dans votre projet B, 2) Ensuite compilez dans le débogage de votre projet A 3) Contrôlez que le chemin pointe sur le fichier A dll et de pdb .... 4) Après cela, vous commencez par déboguer le projet B et si tout va bien, vous pourrez déboguer dans les deux projets!

Matthieu
la source
0

Le moyen le plus simple que j'ai trouvé en utilisant VisualStudio 2019 pour déboguer une bibliothèque externe à laquelle vous faites référence dans NuGet consiste à suivre les étapes suivantes:

  1. Outils> Options> Débogage> Général> Décochez "Activer uniquement mon code"

  2. Accédez à l'Explorateur d'assembly> Ouvrir à partir du cache de packages NuGet Élément de liste

  3. Tapez le nom du package NuGet que vous souhaitez déboguer dans le champ de recherche et cliquez sur 'OK' entrez la description de l'image ici

  4. Depuis l'Explorateur d'assemblage, cliquez avec le bouton droit sur l'assemblage importé et sélectionnez 'Générer Pdb' entrez la description de l'image ici

  5. Sélectionnez un chemin personnalisé dans lequel vous souhaitez enregistrer le fichier .PDB et le cadre pour lequel vous souhaitez qu'il soit généré

    entrez la description de l'image ici

  6. Copiez le fichier .PDB du dossier généré dans votre dossier Debug et vous pouvez maintenant définir des points d'arrêt sur le code de la bibliothèque de cet assembly

magicode118
la source
Sonne bien, sauf que je ne trouve aucun explorateur d'assemblage; cela ne fait pas partie de Resharper?
Robert Massa