"Impossible d'évaluer l'expression car le code de la méthode actuelle est optimisé" dans Visual Studio 2010

153

J'utilise Visual Studio 2010 en mode débogage et je n'ai pas coché "Optimiser le code". Je ne peux pas regarder rapidement (ou survoler) une variable dans le débogueur. J'obtiens cette erreur "Impossible d'évaluer l'expression car le code de la méthode actuelle est optimisé".

Même une ligne comme: int i = -3, faisant une rapide surveillance sur i, j'obtiens "Impossible d'obtenir la valeur du local ou de l'argument 'i' car il n'est pas disponible à ce pointeur d'instruction, probablement parce qu'il a été optimisé."

Ce lien référencé dans une question similaire ne semble pas s'appliquer.

Y a-t-il un paramètre qui me manque?

Tony_Henrich
la source
4
torulflundgren.blogspot.com.au/2010/03/… C'est la meilleure solution que j'ai trouvée pour cela. J'ai testé cela sur Visual Studio 2013. et travaillé ....
Dulanjana Wickramatantri

Réponses:

167

Alors que le projet était en mode débogage, la solution ne l'était pas. Quand je l'ai changé, cela a fonctionné.

Tony_Henrich
la source
9
J'ai eu ce problème dans VS2012, mais la solution et tous les projets ont été définis sur Debug sans optimisation. Je nettoie la solution / reconstruit la solution pour moi.
saarp le
20
Alors ... Comment définissez-vous la solution en mode non-débogage?
user1431072
user1431072 - vous faites un clic droit sur votre solution ou projet et choisissez la propriété, puis vous pouvez la définir en mode débogage
Yevgraf Andreyevich Zhivago
48

J'ai eu ce problème lorsque j'utilisais VS 2010. Ma configuration de solution a sélectionné (Débogage). J'ai résolu ce problème en décochant la propriété Optimiser le code sous les propriétés du projet. Projet (clic droit) => Propriétés => Construire (onglet) => décocher Optimiser le code

Vin
la source
29

Il semble que vous déboguez une version optimisée / de version, malgré la case optimisée non cochée. Les choses que vous pouvez essayer sont:

  • Faites une reconstruction complète de votre fichier de solution (faites un clic droit sur la solution et sélectionnez Tout reconstruire)
  • Pendant le débogage, ouvrez la fenêtre des modules (Debug -> Windows -> Modules) et trouvez votre assembly dans la liste des modules chargés. Vérifiez que le chemin répertorié par rapport à votre assembly chargé correspond à ce que vous attendez et que l'horodatage modifié du fichier indique que l'assembly a été réellement reconstruit.
  • La fenêtre des modules devrait également vous dire si le module chargé est optimisé ou non - assurez-vous que la fenêtre des modules indique qu'il n'est pas optimisé.

Si vous ne voyez pas l'élément de menu Modules dans le menu Déboguer -> Windows, vous devrez peut-être l'ajouter dans le menu "Personnaliser ...".

Justin
la source
2
La solution est reconstruite. La fenêtre des modules montre que l'assemblage est optimisé. J'ai décoché la case Optimiser, donc je ne sais pas pourquoi l'assemblage est toujours optimisé. La solution a un projet Web mais le code que je regarde est dans un projet de bibliothèque de classes en mode débogage.
Tony_Henrich
@Tony - Question idiote, mais la bibliothèque de classes a-t-elle la case à cocher "Optimisé" désélectionnée?
Justin
Oui. J'ai mentionné ce fait dans ma question. J'ai déjà répondu à ma propre question.
Tony_Henrich
1
Mon Project.Weba Optimisation décoché mais il apparaît toujours comme Optimisé quand je regarde son assemblage dans Debug > Modules:(
J86
Le seul moyen que j'ai trouvé pour forcer VS à mettre à jour les informations de débogage était d'augmenter la version d'assemblage du module qui était toujours considérée comme optimisée alors que l'option n'était pas cochée.
alphanoch
14

Dans VS2013, allez dans: Outils -> Options -> Débogage -> Général et activez «Utiliser le mode de compatibilité gérée». Cela désactive le nouveau comportement d'évaluation de la fonction.

Jesse
la source
Merci! Parmi les autres solutions proposées, c'est celle qui comptait pour moi. Chose étrange, c'est arrivé soudainement, je me demande ce qui l'a fait changer.
squid808
10

Essayez d'exécuter en mode débogage.Si vous exécutez en mode version, vous obtiendrez ce message.

thejustv
la source
5
La question dit, tout simplement, "J'utilise Visual Studio 2010 en mode débogage et j'ai" Optimiser le code "décoché." ... vous devez supprimer cette non-réponse.
Jim Balter
Sérieusement. Il le dit dans la question qu'il s'exécute en débogage. Je ne comprends pas pourquoi les votes positifs. Cette réponse pollue les résolutions possibles
John Demetriou
1
FWIW, cette question se classe très bien sur Google lorsque vous recherchez ce message d'erreur. Cette réponse était correcte pour moi (je ne savais pas que j'étais en mode release).
Nate Barbettini
Il peut avoir plus d'un assembly et dans le gestionnaire de configuration, l'assembly qu'il débogue peut être défini sur release ou sth.
madoxdev
8

Ma situation n'a été couverte par aucune des réponses ci-dessus. J'ai trouvé ce qui suit: Article MSDN sur le threading qui explique que lorsqu'il est bloqué dans certaines opérations de threading natives primitives, le débogueur ne peut pas accéder aux données. Par exemple, lorsqu'un thread est assis sur Task.Wait (), cela se produit.

Alan Baljeu
la source
8

J'ai eu le même problème. Mais dans mon cas, l' Debuggableattribut était codé en dur dans le AssemblyInfo.csfichier de mon projet et donc pas (sur-) écrit par compilation. Cela a fonctionné après avoir supprimé la ligne spécifiant l' Debuggableattribut.

riQQ
la source
8

Pour moi, cela se passait dans VS2017 et VS2019. Cela a cessé de se produire après avoir sélectionné l'option "Optimisation JIT supprimée lors du chargement du module".

entrez la description de l'image ici

farfareast
la source
+1, celui-ci était la cause de mon problème. VS ne semble pas très bon pour comprendre réellement les options de csproj car j'ai désactivé l'optimisation dans le XML lorsque la configuration se termine par "Debug". Cela fonctionne bien lorsque vous appelez directement MSBuild, mais pas tout à fait correctement dans VS lui-même.
TheBeardedQuack
5

J'ai eu le même problème dans VS2008. Dans mon cas, cela a été résolu via la reconstruction de la solution.

Ingmar
la source
4

En dehors de @Kragen mentionné, si vous déboguez un projet Web

fermez le studio visuel et essayez de supprimer les fichiers temporaires dans C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files

utilisateur de test
la source
La solution a un projet Web mais le code est dans un projet de bibliothèque de classes. J'ai supprimé les fichiers temporaires à plusieurs reprises.
Tony_Henrich
4

Une autre chose que vous pouvez faire est de créer un fichier avec le même nom que la dll qui est optimisée mais avec l'extension ini et y ajouter ce qui suit:

[Contrôle de débogage .NET Framework]
GenerateTrackingInfo = 1
AllowOptimize = 0

Cela indiquera au JIT de ne pas optimiser vos variables.

Notez que vous avez toujours besoin du pdb, vous vous retrouverez donc avec quelque chose comme ceci: yourDll.dll yourDll.pdb yourDll.ini

Cela fonctionne particulièrement bien dans les scénarios où vous n'avez pas accès pour régénérer les dll avec l'option de débogage.

http://www.hanselman.com/blog/DebugVsReleaseTheBestOfBothWorlds.aspx

Bongo Sharp
la source
4

Lorsque vous voyez le message « Impossible d'évaluer l'expression car le code de la méthode actuelle est optimisé » après l'émission d'une Debugger.Break()instruction, assurez-vous d'appuyer sur F10 pour passer à l'instruction suivante.

Une fois passé à l'instruction suivante, et en supposant que vous exécutez une génération de débogage, ce message devrait disparaître.

Jeroen Ritmeijer
la source
2
C'était ça. J'ai essayé toutes les solutions ci-dessus et cette petite chose a fonctionné .. Merci de le partager, je
perdrais
Non. N'a pas marché. Vs17 pense toujours que je débogue une version de version
John Demetriou
3

En ce qui concerne le problème avec la propriété "Optimiser le code" qui n'est pas encore vérifiée, le code est toujours compilé comme optimisé: ce qui m'a finalement aidé après avoir tout essayé était de cocher la case "Activer le débogage de code non managé" sur la même page de paramètres (Propriétés du projet - Débogage). Cela ne concerne pas directement l'optimisation du code, mais avec cette option activée, VS n'optimise plus ma bibliothèque et je peux déboguer.

Miloš
la source
3

J'ai eu le même problème lors du débogage d'une bibliothèque de classes à partir d'une application Web testée. Je faisais référence à la version publiée dans le banc de test et qui a été définie pour être optimisée dans les propriétés de la bibliothèque de classes.

Décocher la case à cocher Optimiser le code pour la version publiée dans les propriétés de la bibliothèque de classes, juste au moment où je l'écris, a résolu le problème.

tekiegirl
la source
Merci de l'avoir fait. Vous pouvez trouver cette case à cocher en cliquant avec le bouton droit de la souris sur chaque projet et en sélectionnant leur option de menu "Propriétés", puis l'onglet "Construire".
goamn
3

Je me rends compte que c'est une réponse plus tardive, mais j'ai trouvé une autre référence à un moyen de résoudre ce problème qui pourrait aider d'autres à l'avenir. Cette page Web décrit la définition d'une variable d'environnement (COMPLUS_ZapDisable = 1) qui empêche l'optimisation, du moins pour moi! (N'oubliez pas la deuxième partie de la désactivation du processus d'hébergement de Visual Studio.) Dans mon cas, cela aurait pu être encore plus pertinent car je déboguais une DLL externe via un serveur de symboles, mais je ne suis pas sûr.

Michael Bray
la source
3

J'ai eu ce problème avec un projet F # qui avait été ici et là entre Visual Studio et MonoDevelop, peut-être originaire de ce dernier (j'oublie). Dans VS, la case d'optimisation n'était pas cochée, mais l'optimisation semblait certainement se produire en ce qui concerne le débogueur.

Après avoir comparé le XML du fichier de projet à celui d'un fichier sain, le problème était évident: le projet sain avait une <optimize>false</optimize>ligne explicite , alors que le mauvais la manquait complètement. VS déduisait évidemment de son absence que l'optimisation était désactivée, tandis que le compilateur faisait le contraire.

La solution consistait à ajouter cette propriété au fichier projet et à recharger.

Jason Holloway
la source
1

J'ai commencé à recevoir ce message lorsque j'ai migré vers Visual Studio 2017. Aucune des idées de cette page que j'ai essayées n'a fonctionné pour moi. Sur un autre message, j'ai trouvé cette suggestion et cela a fonctionné - supprimer:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

... à partir de votre fichier AssemblyInfo.

Chat fou
la source
Je t'aime @Crazy Cat. Cela m'est arrivé lorsque j'ai migré vers VS2019.
Antonio Rodríguez
0

J'ai eu le même problème dans VS 2010. Nettoyé et reconstruit la solution et cela a fonctionné.

Sanjay Gupta
la source
0

Le commentaire de vickramds ci-dessus, faisant référence à http://torulflundgren.blogspot.com.au/2010/03/cannot-obtain-value-of-local-or.html , l'a fait pour moi. J'ai tout vérifié - supprimé toutes les dll, les fichiers pdb des dossiers bin locaux, nettoyer, reconstruire, effacé tous les dossiers des fichiers ASP.NET temporaires, s'assurer que les indicateurs TRACE / DEBUG étaient définis, vérifier les chemins DLL, etc.

Pour le déposer afin qu'il ne soit pas perdu, pour le (s) projet (s) concerné (s):

Propriétés du projet -> Build -> Advanced -> Debug Info: Full.

Vous voulez vérifier que vous avez sélectionné la configuration de débogage avant de faire cela, à moins bien sûr que vous n'en ayez l'intention.

Mayyit
la source
0

Si vous essayez de déboguer un projet ASP.NET, assurez-vous que la liste déroulante Propriétés> Web> Serveurs du projet est définie sur «IIS Express» (en plus de vérifier tout le reste ici).

Overlord Zurg
la source
0

J'avais des dll d'extension mixtes c ++ / cli mfc, qui étaient optimisées même si la configuration de débogage (vue depuis la fenêtre Modules VS 2017). Comme la réponse précédente l'a suggéré, j'ai changé "Dans VS2013, allez dans: Outils -> Options -> Débogage -> Général et activez 'Utiliser le mode de compatibilité gérée'. Cela désactive le nouveau comportement d'évaluation des fonctions." Ces paramètres se trouvent également dans VS 2017.

Mais ce n'était pas suffisant, j'ai donc également copié le paramètre UseDebugLibraries du fichier de projet d'une autre application MFC vers le fichier de projet d'extension dll.

    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
      ...
      <UseDebugLibraries>true</UseDebugLibraries>

Puis reconstruisez et cela a résolu le problème.

owluCoder
la source
0

Dans Visual Studio 2012, l'activation de l' option « Géré » dans Outils> Débogage> Juste à temps a fonctionné pour moi.

entrez la description de l'image ici

QMaster
la source