120 votes

Comment activer "Enable .NET Framework source stepping" ?

Mise à jour du 22 février 2013 : L'entrée Microsoft Connect comporte une note d'Alok Shriram (Program Manager, Base Class Libraries, .NET Framework) indiquant que le problème devrait maintenant être résolu. L'entrée Connect est marquée comme Résolu (Fixé) :

Ce problème devrait maintenant être résolu. Nous avons publié une mise à jour des sources de référence. Si votre problème n'est toujours pas résolu, veuillez nous le faire savoir.

Un an et demi.

Liens bonus

Question originale

Comment activer le suivi des sources du framework .NET dans Visual Studio 2010 ?


Note : Cette question est une pièce d'un ensemble plus vaste :


Visual Studio 2010 est doté d'une nouvelle fonctionnalité :

  • Outils, Options, Débogage, Général, Activer le stepping source de .NET Framework

Screenshot of options menu

En suivant les instructions de la page MSDN Comment faire : Déboguer les sources de .NET Framework :

Pour activer le débogage des sources de .NET Framework

  1. Sur le Outils cliquez sur Options .

  2. Dans le Options cliquez sur le bouton Débogage catégorie.

  3. Dans le Général sélectionnez les cases à cocher suivantes :

    • Activer le stepping source de .NET Framework
    • Activer le support du serveur source

Je fais ça :

Screenshot of options menu, highlighting the relevant options selected

Note : Vous noterez, comme la page MSDN le fait, et comme je l'ai remarqué, que la vérification Activer le stepping source de .NET Framework décochera automatiquement la case **Activer Just My Code (géré uniquement). J'ai également activé les messages de diagnostic du support du serveur source.

L'activation de ces options a automatiquement défini un emplacement de téléchargement du cache des symboles pour moi :

Screenshot of options menu, showing cache directory (highlighted)

Note : Le site Microsoft Symbol Server est déjà présente (et ne peut être supprimée).


La page MSDN dit de charger les symboles :

Pour charger les symboles Framework à l'aide de la fenêtre Modules

  1. Dans le Modules cliquez avec le bouton droit de la souris sur un module pour lequel les symboles ne sont pas chargés. Vous pouvez savoir si les symboles sont chargés ou non en regardant l'icône Statut des symboles colonne.

  2. Pointer vers Chargement des symboles à partir de et cliquez sur Serveurs Microsoft Symbol pour télécharger des symboles à partir du serveur public de symboles de Microsoft ou Symbol Path pour charger à partir d'un répertoire où vous avez précédemment stocké des symboles.

J'essaie ça :

enter image description here

et ensuite tous les symboles sont chargés :

Screenshot of modules window, as described above

Je suis assis sur un point d'arrêt, qui est sur le point d'appeler le code du cadre .NET :

Screenshot of code, transcribed below

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);

Pousser F11 fait en sorte que le débogueur passe simplement à la ligne suivante :

Screenshot of code, transcribed below

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);

    //Record the running scale factor used
    this.scaleFactor = new SizeF(
            this.scaleFactor.Width * factor.Width,
            this.scaleFactor.Height * factor.Height);

Comment activer l'extraction des sources de .NET Framework dans Visual Studio 2010 ?


Je me trouve à un point d'arrêt dans mon code. J'essaie de double-cliquer sur une fonction située plus haut dans la pile d'appels. Cela me permettrait, je l'espère, de saut au code .NET :

enter image description here

Sauf que ça ne fonctionne pas : Visual Studio me dit qu'il n'y a pas de source disponible :

Screenshot of error message saying No Source Available

Comment activer l'extraction des sources de .NET Framework dans Visual Studio 2010 ?


Si je passe en vue désassemblage avant d'essayer d'entrer dans le code .NET ( Déboguer -> Windows -> Démontage ), je peux voir un call dans le code .NET :

Screenshot of code

Et quand je le fais, je finis par déboguer un désassemblage de System.Windows.Forms.ScaleControl :

Screenshot of disassembly window

Ce qui n'est pas la même chose que, ou aussi utile que, d'être capable d'entrer dans la source du .NET Framework.

Comment activer l'extraction des sources de .NET Framework dans Visual Studio 2010 ?


Le chemin configuré pour le cache des symboles sur mon ordinateur contient bien des fichiers de cache des symboles :

Screenshot of folder listing

Il s'agit donc de télécharger pdb des fichiers de symboles, mais en refusant de les utiliser.

Comment activer l'extraction des sources de .NET Framework dans Visual Studio 2010 ?


Leppie a suggéré que je vérifie le Debug log (avec la fenêtre du journal de débogage ouverte ; sinon, il n'enregistre rien) :

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

Plus tôt dans le journal, je vois qu'il charge les symboles pour System.Windows.Forms.dll :

Loaded 'C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll', Symbols loaded.

enter image description here

Donc, il est trouver mes symboles, mais en prétendant qu'il ne pouvait pas les trouver.

Comment activer l'extraction des sources de .NET Framework dans Visual Studio 2010 ?


Un gars de Microsoft Italie suggère de désactiver Exiger que les fichiers sources correspondent exactement à la version originale :

Screenshot of options window

Ça n'a pas réglé le problème.

Comment activer l'extraction des sources de .NET Framework dans Visual Studio 2010 ?


Il a été suggéré qu'il y a un bug avec le serveur de source de Microsoft pour .NET Framework 4.0 . En suivant cette suggestion, j'ai changé le projet pour cibler .NET Framework 3.5 :

enter image description here

Ça n'a pas réglé le problème.

Comment activer l'extraction des sources de .NET Framework dans Visual Studio 2010 ?


Quelqu'un, quelque part, s'est demandé si une autre personne rencontrant le même problème utilisait la version 64-bit du débogueur . Il n'existe pas de version 64 bits de Visual Studio, mais j'ai essayé de faire passer mon projet de la version 64 bits à la version 64 bits. AnyCPU à x86 (il était en train d'être JITé en x64), au cas où Microsoft ne prendrait pas en charge les processeurs 64 bits :

enter image description here

Ça n'a pas réglé le problème :

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

Comment activer l'extraction des sources de .NET Framework dans Visual Studio 2010 ?


Voir aussi

0 votes

Avez-vous vérifié le code source 'cache' ?

0 votes

@leppie Qu'entendez-vous par "cache" du code source ? Si vous voulez dire le dossier dans lequel se trouve le code source, il est en train d'être rempli (Voir Mise à jour 4 )

0 votes

Oui. Est-il possible d'ouvrir ce fichier source et de définir un point d'arrêt ?

35voto

Matt Smith Points 6843

Les PDB permettant de parcourir le code source ne sont publiées que pour les RTM et les Service Packs. En tant que tel, lorsque la mise à jour de sécurité sort et qu'elle modifie la dll que vous essayez de déboguer, l'extraction du code source ne fonctionnera pas (c'est-à-dire que vous obtiendrez le message "No source Available" avec un "Browse to find Source" grisé).

Cependant, une fois que vous avez effectué tous les réglages appropriés, vous pouvez utiliser la solution de contournement suivante. Cette solution consiste essentiellement à trouver les mises à jour de sécurité qui ont entraîné la modification de la dll, puis à les supprimer. Cette solution présente l'inconvénient évident d'entraîner la suppression de ces mises à jour de sécurité sur votre machine.

Solution de rechange

  1. Identifiez la dll dans laquelle vous voulez déboguer (par exemple, System.Windows.Forms.dll).
  2. Pendant le débogage, ouvrez le Modules dans Visual studio, trouvez le Version colonne. Si la version n'est pas la version RTM ou Service pack, vous devrez effectuer le workflow. Généralement, la dll RTM indique "built by : RTMRel". Alors qu'une dll qui fait partie d'une mise à jour de sécurité dira "built by : RTMGDR". Notez le numéro de version (par exemple 4.0.30319.269 construit par : RTMGDR).
  3. Maintenant, nous voulons trouver la mise à jour qui a créé cette version. Pour ce faire, recherchez la dll et le numéro de version sur le site support.microsoft.com/kb/. Par exemple, j'ai fait la recherche google suivante : site:support.microsoft.com/kb System.Windows.Forms.dll 4.0.30319.269
  4. La recherche devrait donner des informations sur une mise à jour. Notez le numéro de KB dans la barre d'adresse. Dans mon exemple, l'adresse était http://support.microsoft.com/kb/2604121 donc KB2604121, est ce qui nous intéresse.
  5. Allez dans Panneau de configuration->Programmes et fonctionnalités, et cliquez sur "Afficher les mises à jour installées".
  6. Trouvez une mise à jour qui mentionne le numéro de KB (vous pouvez utiliser la recherche dans le cadre supérieur droit).
  7. Désinstallez cette mise à jour.
  8. Répétez ce processus pour cette même dll jusqu'à ce que la dll soit revenue à sa version RTMRel ou SP. Par exemple, pour System.Windows.Forms.dll, j'ai dû supprimer les KB2686827, KB2604121, KB2518870 avant de retrouver la version RTMRel.

Vous devez effectuer cette opération pour chaque dll du cadre .NET que vous souhaitez déboguer.

Une fois que c'est fait, définissez un point d'arrêt dans la source .net (par exemple, allez dans l'onglet Breakpoints, dites New->Break at Function, et entrez System.Windows.Forms.Form.Form) ou entrez dans une des méthodes .net de cette dll.

1 votes

C'est vrai, l'astuce consiste à localiser les bons éléments à désinstaller (puisque vous avez généralement une lot d'entre eux installés, et ils prennent un certain temps à désinstaller).

0 votes

Je ne peux pas désinstaller les mises à jour de sécurité. C'est contraire à la politique de l'entreprise. Existe-t-il un moyen d'obtenir des copies de mscorlib.dll (et d'autres) qui correspondent au serveur Microsoft Symbols ? Mon mscorlib.dll est de la version 4.0.30319.269 (RTMGDR.030319-2600). Je pourrais éventuellement mettre temporairement à jour le GAC avec cette nouvelle DLL et essayer de faire un pas de côté.

0 votes

C'est probablement aussi contraire à la politique de mon entreprise - je les réinstalle simplement après avoir terminé. Je ne pense pas que vous puissiez simplement insérer une ancienne version de mscorlib.dll indépendamment des autres dll qui devraient être réinitialisées avec elle (pour qu'elle fonctionne correctement). De plus, la mise à jour temporaire du GAC avec d'anciennes dlls serait essentiellement équivalente à la désinstallation temporaire de la mise à jour de sécurité.

6voto

yo hal Points 1949

Alors que malheureusement il y a un problème avec un Microsoft, comme Leppie l'a souligné (et j'ai obtenu le même résultat voir

il faut noter que votre tentative échouerait de toute façon, puisque vous avez fait référence :

  • Microsoft Symbol Server

au lieu de :

  • referencesource.microsoft.com/symbols

Voir la section FAQ/dépannage de Configuration de Visual Studio pour déboguer le code source de .NET Framework

4voto

leppie Points 67289

J'ai trouvé la réponse, je pense.

J'ai tracé ce qui se passait sur Fiddler. Il semble que seuls les symboles soient actuellement disponibles, et aucune source.

Lorsque VS essaie de charger les symboles à partir du serveur 'referencesource', il échoue (404). Comme cela échoue, je pense qu'il ne peut pas se connecter aux fichiers source sur ce serveur.

http://referencesource.microsoft.com/symbols/mscorlib.pdb/ED96A7F38A2940F39B9CA7AD9BC5CB671/mscorlib.pdb

Après l'échec ci-dessus, il essaie un serveur appelé 'msdl' où il trouve le PDB réel (mais il semble que celui-ci n'a pas d'information sur le code source).

http://msdl.microsoft.com/download/symbols/mscorlib.pdb/ED96A7F38A2940F39B9CA7AD9BC5CB671/mscorlib.pd_

Dans l'ensemble, il semble qu'il s'agisse d'un problème (temporaire) de Microsoft avec ses serveurs.

Je suis sûr que j'avais un code source il y a quelque temps. Mais maintenant, ça ne fonctionne pas.

Edit :

J'ai essayé avec différentes versions de .NET, mais le résultat est le même. :(

1 votes

Eh bien, ce serait très intéressant si mes étapes exactes devrait fonctionnent (mais ne fonctionnent pas), sera travail (à l'avenir), et faire travail (mais pas aujourd'hui). Ce serait aussi extraordinairement frustrant, car j'ai passé 11 heures sur ce problème.

2 votes

Msdl.microsoft.com semble être Microsoft Symbol Server

2 votes

Et c'est encore cassé

1voto

watbywbarif Points 1253

Pour l'instant, cela ne fonctionne pas si vous avez installé SP1. Voici quelques commentaires de MS sur le problème : http://social.msdn.microsoft.com/Forums/en-US/refsourceserver/thread/41388c7b-582b-4e3f-8178-3d38a3c99639

0voto

Mare Infinitus Points 4177

Vous pouvez trouver la source de référence ici, disponible en téléchargement :

.NET Framework 4.0 Source de référence

Les sources pour WCF, WF, et même la 4.5 Beta / RC et bien d'autres encore peuvent être trouvées là aussi :

Microsoft Referencesource NetFramework

3 votes

Le code source est inutile sans les symboles. À moins que vous n'aimiez rechercher un morceau de code spécifique ;p

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X