Comment activer «Activer la progression des sources .NET Framework»?

118

Mise à jour du 22 février 2013 : L'entrée Microsoft Connect a une note d'Alok Shriram (Gestionnaire de programmes, bibliothèques de classes de base, .NET Framework) que le problème doit maintenant être résolu. L'entrée Connect est marquée comme résolue (fixe) :

Ce problème devrait maintenant être résolu. Nous avons publié une mise à jour des sources de référence. Veuillez nous en informer si votre problème n'est toujours pas résolu.

Un an et demi.

Liens bonus

Question originale

Comment activer la progression de la source .NET Framework dans Visual Studio 2010?


Remarque : cette question fait partie d'un tout plus grand:


Visual Studio 2010 est livré avec une nouvelle fonctionnalité:

  • Outils, Options, Débogage, Général, Activer la progression des sources .NET Framework

Capture d'écran du menu d'options

En suivant les instructions de la page MSDN Comment: déboguer la source .NET Framework :

Pour activer le débogage de la source .NET Framework

  1. Dans le menu Outils , cliquez sur Options .

  2. Dans la boîte de dialogue Options , cliquez sur la catégorie Débogage .

  3. Dans la zone Général , cochez les cases suivantes:

    • Activer la progression des sources .NET Framework
    • Activer la prise en charge du serveur source

Je fais ça:

Capture d'écran du menu des options, mettant en évidence les options pertinentes sélectionnées

Remarque : Vous noterez, comme le note la page MSDN, et comme je l'ai remarqué, que cocher Activer le pas à pas de la source .NET Framework décochera automatiquement ** Activer juste mon code (géré uniquement). J'ai également activé les messages de diagnostic de la prise en charge du serveur source.

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

Capture d'écran du menu d'options, montrant le répertoire de cache (en surbrillance)

Remarque : l' entrée Microsoft Symbol Server est déjà présente (et ne peut pas être supprimée).


La page MSDN dit de charger les symboles:

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

  1. Dans la fenêtre Modules , cliquez avec le bouton droit sur un module pour lequel les symboles ne sont pas chargés. Vous pouvez savoir si les symboles sont chargés ou non en consultant la colonne État des symboles .

  2. Pointez sur Charger les symboles à partir de et cliquez sur Serveurs de symboles Microsoft pour télécharger des symboles à partir du serveur de symboles publics Microsoft ou sur Chemin des symboles pour les charger à partir d'un répertoire dans lequel vous avez précédemment stocké des symboles.

J'essaye ceci:

entrez la description de l'image ici

puis tous les symboles sont chargés:

Capture d'écran de la fenêtre des modules, comme décrit ci-dessus

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

Capture d'écran du code, transcrit ci-dessous

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

Si vous F11appuyez sur, le débogueur passe simplement à la ligne suivante:

Capture d'écran du code, transcrit ci-dessous

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 la progression de la source .NET Framework dans Visual Studio 2010?


Je suis assis à un point d'arrêt dans mon code. J'essaye de double-cliquer sur une fonction plus haut dans la pile d'appels. Cela me permettrait, je l'espère, de passer au code .NET:

entrez la description de l'image ici

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

Capture d'écran du message d'erreur indiquant Aucune source disponible

Comment activer la progression de la source .NET Framework dans Visual Studio 2010?


Si je passe en mode désassemblage avant d'essayer d'entrer dans le code .NET ( Débogage -> Windows -> Désassemblage ), je peux voir un calldans le code .NET:

Capture d'écran du code

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

Capture d'écran de la fenêtre de démontage

Ce qui n'est pas la même chose ou aussi utile que de pouvoir accéder à la source .NET Framework.

Comment activer la progression de la source .NET Framework dans Visual Studio 2010?


Le chemin du cache de symboles configuré sur mon ordinateur contient des fichiers de cache de symboles:

Capture d'écran de la liste des dossiers

Il télécharge donc des pdbfichiers de symboles, mais refuse de les utiliser.

Comment activer la progression de la source .NET Framework dans Visual Studio 2010?


Leppie a suggéré que je vérifie le Debugjournal (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 le vois charger des 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.

entrez la description de l'image ici

Donc , il est de trouver mes symboles, mais affirmant qu'il ne pouvait pas les trouver.

Comment activer la progression de la source .NET Framework dans Visual Studio 2010?


Un gars de Microsoft Italie suggère de désactiver Exiger les fichiers source pour correspondre exactement à la version originale :

Capture d'écran de la fenêtre d'options

Cela ne l'a pas réglé.

Comment activer la progression de la source .NET Framework dans Visual Studio 2010?


Il a été suggéré qu'il y a un bogue avec le serveur source de Microsoft pour .NET Framework 4.0 . Suite à cette suggestion, j'ai basculé le projet vers la cible .NET Framework 3.5 :

entrez la description de l'image ici

Cela ne l'a pas réglé.

Comment activer la progression de la source .NET Framework dans Visual Studio 2010?


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

entrez la description de l'image ici

Cela n'a pas résolu le problème:

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

Comment activer la progression de la source .NET Framework dans Visual Studio 2010?


Voir également

Ian Boyd
la source
Avez-vous vérifié le «cache» du code source?
leppie
@leppie Qu'entendez-vous par "cache du code source"? Si vous voulez dire le dossier qui met en cache le code source, il est en cours de remplissage (voir mise à jour 4 )
Ian Boyd
Oui. Est-il possible d'ouvrir ce fichier source et de définir un point d'arrêt?
leppie
1
excellente rédaction du problème!
andersonbd1
1
Cela ne fonctionne pas non plus dans VS2012. Cela a fonctionné pendant un jour, après avoir tout configuré et arrêté de fonctionner. Deux jours, des dizaines de cafés, des centaines de pages Web plus tard, cela ne fonctionne tout simplement pas. Dans le même temps, les sources publiées par symbolesource.org fonctionnent comme un charme.
Wiktor Zychla

Réponses:

35

Les PDB pour parcourir le code source ne sont publiés 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, la progression de la source ne fonctionnera pas (c'est-à-dire que vous obtiendrez le message "Aucune source disponible" avec un grisé "Parcourir pour trouver la source ").

Cependant, une fois que vous avez défini tous les paramètres appropriés, vous pouvez utiliser la solution de contournement suivante. La solution de contournement consiste essentiellement à rechercher les mises à jour de sécurité qui ont provoqué la modification de la DLL, puis à les supprimer. Cela présente l'inconvénient évident de supprimer ces mises à jour de sécurité sur votre ordinateur.

solution de contournement

  1. Identifiez dans quelle DLL vous souhaitez déboguer (par exemple System.Windows.Forms.dll)
  2. Lors du débogage, ouvrez la fenêtre Modules dans Visual studio, recherchez la colonne Version . Si la version n'est pas la version RTM ou Service Pack, vous devrez effectuer le workflow. En règle générale, la dll RTM dira "construit par: RTMRel". Alors qu'une dll qui faisait partie d'une mise à jour de sécurité dira "construit par: 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 support.microsoft.com/kb/ Par exemple, j'ai effectué la recherche google suivante: site:support.microsoft.com/kb System.Windows.Forms.dll 4.0.30319.269
  4. La recherche devrait révéler des informations sur une mise à jour. Notez le numéro KB dans la barre d'adresse. Dans mon exemple, l'adresse était http://support.microsoft.com/kb/2604121, donc KB2604121, c'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 répertorie le numéro de la base de connaissances (vous pouvez utiliser la recherche dans la zone supérieure droite).
  7. Désinstallez cette mise à jour.
  8. Répétez ce processus pour cette même dll jusqu'à ce que la dll revienne à sa version RTMRel ou à sa version SP. Par exemple, pour System.Windows.Forms.dll, j'ai dû supprimer KB2686827, KB2604121, KB2518870 avant de revenir à la version RTMRel.

Vous devrez le faire pour chaque dll dans le framework .NET dans lequel vous vous souciez du débogage.

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

Matt Smith
la source
1
Bon, l'astuce consiste à localiser les bons à désinstaller (car généralement vous en avez beaucoup installés et ils prennent un certain temps à désinstaller).
Matt Smith
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 autres) qui correspondent au serveur Microsoft Symbols? Mon mscorlib.dll est la version 4.0.30319.269 (RTMGDR.030319-2600). Peut-être que je pourrais temporairement mettre à jour GAC avec cette nouvelle DLL et essayer la progression de la source.
kevinarpe
Cela va probablement aussi à l'encontre de la politique de mon entreprise - je viens de les réinstaller après avoir terminé. Je ne pense pas que vous pourriez simplement utiliser une ancienne version de mscorlib.dll indépendante des autres dll qui devraient être restaurées avec (pour que cela fonctionne correctement). De plus, la mise à jour temporaire du GAC avec d'anciennes dll équivaudrait essentiellement à désinstaller temporairement la mise à jour de sécurité.
Matt Smith
La raison probable pour laquelle Microsoft ne publie pas la source des mises à jour de sécurité est que quelqu'un pourrait comparer les modifications du code, comprendre la vulnérabilité de sécurité et créer ses propres exploits. Ce que Microsoft ne réalise pas, c'est que le "code source" est déjà disponible en utilisant ILSpy ou Relfector. Donc, Microsoft, en ne publiant pas le code source, ne rend personne plus sûr - ce sont juste les développeurs qui vivent plus difficile.
Ian Boyd
2
@IanBoyd Je doute que ce soit la motivation de MS. Je suppose que leur flux de travail ne prend tout simplement pas en charge la mise à jour des PDB source pour le débogage. Leur principal souci de fermer les failles de sécurité.
xanadont
6

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

il convient de noter que votre tentative échouerait de toute façon, puisque vous avez référencé:

  • Serveur de symboles Microsoft

au lieu de:

  • referencesource.microsoft.com/symbols

Consultez la section FAQ / Dépannage de la configuration de Visual Studio pour déboguer le code source .NET Framework

yoel halb
la source
4

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

J'ai retracé ce qui se passait sur Fiddler. Il semble que seuls les symboles sont 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 mapper 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'ait aucune information sur le code source).

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

Dans l'ensemble, il semble être un problème (temporaire) de Microsoft avec leurs serveurs.

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

Éditer:

Je l'ai essayé avec différentes versions .NET, toutes avec le même résultat. :(

leppie
la source
1
Eh bien , ce serait très intéressant si mes étapes exactes devraient travailler (mais pas), va travailler (dans l'avenir), et faire le travail (mais pas aujourd'hui). Ce serait également extrêmement frustrant, car j'ai passé 11 heures sur le problème.
Ian Boyd
2
msdl.microsoft.com semble être Microsoft Symbol Server
yoel halb
2
et il est encore cassé
Simon_Weaver
Ne semble pas être un "problème de serveur temporaire", 7 ans plus tard et les liens sont toujours morts.
jrh
1

Dans mon cas, je déboguais une ancienne application WinForms .NET 2.0 et j'ai obtenu le message «Source non disponible» message . J'ai essayé tous les paramètres recommandés.

En fin de compte, j'ai reconstruit l'application pour cibler temporairement .NET 4.5 et j'ai pu faire fonctionner la source. Peut-être que mon application était trop ancienne pour la progression des sources. Un peu va à l'encontre de l'objectif, je sais, mais pour des tests rapides et sales, cela fonctionne. Le bogue que j'ai est toujours présent dans .NET 4.5 . :)

Cadre cible

Brian Chavez
la source
0

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

Source de référence .NET Framework 4.0

Les sources pour WCF, WF et même la version 4.5 Beta / RC et bien d'autres peuvent également être trouvées ici:

Microsoft Referencesource NetFramework

Mare Infinitus
la source
3
Le code source est inutile sans les symboles. Sauf si vous aimez rechercher un morceau de code spécifique; p
leppie
0

Voici les instructions officielles https://referencesource.microsoft.com/setup.html

Configurer Visual Studio 2013 pour le débogage du framework .NET

Afin de configurer Visual Studio 2013, procédez comme suit dans le menu Outils -> Options -> Débogage -> Général:

  • Désactiver uniquement mon code
  • Désactiver les propriétés et les opérateurs de pas à pas
  • Désactiver exiger que les fichiers source correspondent exactement à la version d'origine
  • Activer la progression des sources .NET Framework
  • Activer la prise en charge du serveur source
Colonel Panic
la source