web-dev-qa-db-fra.com

Comment déboguer le code source du framework .NET 4.6 dans Visual Studio 2017?

Voici ce que j'ai essayé:

Création d'une nouvelle application console (.NET Framework) dans Visual Studio 2017.

Ajout du code suivant:

static void Main(string[] args)
{
    new Dictionary<int, int>().TryGetValue(3, out int x); //I want to step into TryGetValue() (this is just an example)
}

Configuré les paramètres répertoriés ici: https://blogs.msdn.Microsoft.com/sburke/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code/ =

Les symboles confirmés sont chargés dans la fenêtre Modules:

mscorlib.dll Symboles chargés. 4.6.1586.0 construit par: NETFXREL2

Essayé: "Pas à pas (F11)"

Essayé: "Entrez dans le détail" | "System.Collections.Generic.Dictionary.TryGetValue"

Les deux ne font que franchir la ligne.

J'ai essayé de configurer VS en utilisant les détails ici: http://www.symbolsource.org/Public/Home/VisualStudio

Même résultat, le débogueur parcourt la ligne.

J'ai regardé la réponse ici: https://stackoverflow.com/a/12432029/297451

Mais cette version ne semble pas être une mise à jour de sécurité, et une recherche sur "site: support.Microsoft.com/kb 4.6.1586.0" ne donne rien.

Qu'est-ce que je fais mal?

18
Jon

Voici la réponse, merci à Hans Passant. Notez que cette solution soulève des questions supplémentaires.

  1. Assurez-vous que https://referencesource.Microsoft.com/ contient la version exacte que vous déboguez.

  2. Configurez Visual Studio comme spécifié ici: https://referencesource.Microsoft.com/setup.html

    • Décochez "Activer juste mon code"
    • Cochez "Activer le pas de source .NET Framework" (cela aurait dû être la seule étape nécessaire)
    • Cochez "Activer la prise en charge du serveur source"
    • Décochez "Exiger que les fichiers source correspondent exactement à la version d'origine"
  3. Vérifiez que les symboles sont chargés dans la fenêtre Modules, avec l'indexation des sources incluse.

    • Comment savoir si l'indexation des sources est incluse? La fenêtre des modules ne spécifie pas si un PDB a supprimé les informations source.

Microsoft pourrait rendre ce processus beaucoup plus robuste en donnant des messages d'erreur utiles au lieu d'échouer en silence.

13
Jon

tilisez la fonction Symbol Server dans JetBrains dotPeek . A fonctionné comme un charme pour moi après avoir eu du mal à faire fonctionner la fonctionnalité standard:

  1. Exécutez dotPeek et accédez à Outils> Options ...> Serveur de symboles.
  2. Assurez-vous que "Tous les assemblages" est sélectionné et copiez l'URL du serveur de symboles local dans le presse-papiers. Démarrez le serveur de symboles dotPeek en cliquant dessus dans le menu Outils.
  3. Dans Visual Studio, accédez à Outils> Options ...> Débogage> Symboles et ajoutez l'URL du serveur dotPeek à la liste. Déplacez le serveur de symboles dotPeek aussi haut que possible dans la liste et décochez tous les autres serveurs de symboles de la liste ( en particulier, les "Microsoft Symbol Servers" et "NuGet.org Symbol Server" doivent ne pas être sélectionné ).
  4. Commencez le débogage - lorsque vous essayez d'entrer dans le code source de Framework, vous verrez dotPeek faire un travail de décompilation de l'assembly pour vous, puis vous serez dans sa source.

Si cela ne fonctionne pas, c'est probablement parce que Visual Studio a précédemment téléchargé les "mauvais" symboles pour l'assembly en question à partir de Microsoft/NuGet, et les utilise au lieu de demander à dotPeek. Pour vérifier cela, démarrez le débogage et recherchez l'assembly approprié dans la liste des modules (Debug> Windows> Modules) - supprimez le fichier PDB au chemin affiché sous "Symbol File" pour cet assembly , puis redémarrez le débogage, et dotPeek devrait démarrer.

7
Phil Haselden