Impossible d'obtenir la valeur de local ou de l'argument car il n'est pas disponible sur ce pointeur d'instruction, peut-être parce qu'il a été optimisé

212

Visual Studio 2010 tue (il n'y a pas d'autre mot) des données dans l'un des arguments de la fonction dans le bloc dangereux. Qu'est-ce qui pourrait provoquer cette erreur? Le message suivant s'affiche par le débogueur.

Cannot obtain value of local or argument as it is not available at this instruction pointer, possibly because it has been optimized away.
curiosité
la source
2
j'ai exactement le même problème et j'utilise la version Debug. Cannot obtain value of local or argument '<this>' as it is not available at this instruction pointer, possibly because it has been optimized away. System.Threading.Tasks.TaskExceptionHolder
javapowered
19
Oups, je viens de faire sélectionner une version par erreur ..
Daniel Little
J'ai ce problème dans VS 2017 et j'ai suivi toutes les instructions dans les messages ci-dessous. Il y a-t-il des alternatives?
Matt W
N'oubliez pas Menu Build -> Configuration Manager. La configuration doit être définie sur Déboguer là ou vous obtenez toujours le problème.
Bob Clegg

Réponses:

347

Allez dans Propriétés du projet et sous Créer Assurez-vous que la case "Optimiser le code" n'est pas cochée.

Définissez également la liste déroulante "Informations de débogage" sur "Complète" dans les options avancées (sous l'onglet Création).

Karthik
la source
129
Tout d'abord, vérifiez que la configuration de construction est Debug, pas Release.
ApceH Hypocrite
Par ailleurs, si vous souhaitez le tester en mode Release, vous pouvez ajouter "Debugger.Launch ();" dans le code
Jason
A fait les deux étapes et changé la configuration de "Release" en "Build". A travaillé sur Visual Studio 2017 Community Edition.
Neo
1
Si vous avez VS 2017, la réponse acceptée et la réponse de xyq.384.b vous aideront. Pour moi, la réponse xyq.384.b était le correctif car c'était le débogueur JIT qui supprimait le pointeur ... Je suis désolé JIT l'a "optimisé" ...
BillRuhl
Après être passé à la configuration de débogage, j'ai découvert que la boîte de code d'optimisation était déjà décochée. Leçon apprise: ne déboguez pas en mode de configuration de version.
eliteproxy
135

Aussi dans VS 2015 Community Edition

allez dans Debug-> Options or Tools-> Options

et vérifiez Débogage-> Général-> Supprimer l'optimisation JIT sur la charge du module (Géré uniquement)

xyq.384.b
la source
7
Cela a résolu mon problème après avoir appliqué toutes les solutions mentionnées ci-dessus.
masih
1
Aucune des réponses suggérées ne fonctionne pour moi. Mes variables sont toujours optimisées ...
Sushi271
Je ne sais pas pourquoi cela a soudainement commencé à se produire .. mais cela l'a corrigé!
Murphybro2
Putain de merde, cela l'a également corrigé pour moi dans la communauté VS2017! Aucune idée quand ni comment cette option a été désélectionnée ...
Ian Kemp
Fonctionne comme un champion!
BillRuhl
59

Si vous compilez avec les optimisations activées, de nombreuses variables seront supprimées; par exemple:

SomeType value = GetValue();
DoSomething(value);

ici, la variable locale valueserait généralement supprimée, en conservant la valeur sur la pile à la place - un peu comme si vous aviez écrit:

DoSomething(GetValue());

De plus, si une valeur de retour n'est pas utilisée du tout , elle sera supprimée via "pop" (plutôt que stockée dans un local via "stloc", et encore; le local n'existera pas).

Pour cette raison, dans une telle version, le débogueur ne peut pas obtenir la valeur actuelle de valuecar elle n'existe pas - elle n'existe que pour le bref instant entre GetValue()et DoSomething(...).

Alors; si vous voulez déboguer ... n'utilisez pas de build de version! ou au moins, désactivez les optimisations pendant le débogage.

Marc Gravell
la source
4
Merci pour votre réponse - mais je vérifie Optimiser la propriété du code dans mon projet et il n'est pas sélectionné = (
curiosité
4
@Marc - Je comprends ce que vous dites, cependant, j'utilise les bibliothèques de sources de référence de Microsoft pour coder leur propre merde. Je suis en train de parcourir les méthodes maintenant, mais je n'arrive pas à regarder les valeurs des sections locales. Quel est l'intérêt de déboguer la source .Net alors? Aucune suggestion? stackoverflow.com/questions/13147132/…
one.beat.consumer
Il semble que je fasse la même chose que @ one.beat.consumer: essayer de parcourir les symboles publics Microsoft pour comprendre pourquoi le cadre ASP.NET ne fonctionne pas. Dans mon cas, reliure de modèle en MVC 3 ...
bambams
@ one.beat.consumer Je suppose que parce que les références Microsoft ont été compilées avec l'optimisation activée, donc même si vous pouvez télécharger leur code source pour le regarder, les valeurs ont disparu, tout comme si vous compiliez votre projet avec des optimisations activée. Il est spécifique au projet (dll) - si vous pouvez obtenir des versions de «débogage» des références MS, vous pourrez voir les valeurs. N'oubliez pas que si la DLL MS a été référencée par un autre projet référencé par votre projet principal, la "sous-référence" peut correspondre aux paramètres de l'autre projet.
drzaus
22

http://www.guntucomputerhacks.blogspot.com.au/2014/07/cannot-obtain-value-of-local-or.html

Cela a fonctionné pour moi dans Visual Studio 2013.

Tout ce que tu dois faire est..

  1. Cliquez avec le bouton droit de la souris sur le projet que vous ne pouvez pas déboguer.
  2. Accédez aux propriétés du projet.
  3. Cliquez sur le menu de construction.
  4. Cliquez sur le bouton avancé.
  5. Définissez la valeur déroulante des informations de débogage sur full.
  6. Reconstruisez votre projet.
Dulanjana Wickramatantri
la source
20

Je suis juste tombé sur cela et je courais sous la Releaseconfiguration de Debugbuild au lieu de la configuration de build. Une fois que je suis revenu à Debugma variable affichée à nouveau dans la montre.

JabberwockyDecompiler
la source
14

Dans Visual Studio 2017, passez à Debug-> Option, puis vérifiez Debugging-> general-> et cochez cette option

Options Visual Studio 2017 pertinentes

Zahid Hasan
la source
Il s'agit d'une réponse en double d'une réponse de 2015 ci-dessus: stackoverflow.com/a/34385875/1250319
Daniel
8

Lorsque j'ai été confronté au même problème, je devais simplement nettoyer ma solution avant de reconstruire. Cela a pris soin de moi.

CJe
la source
6

Concernant le problème avec la propriété "Optimiser le code" non vérifiée mais le code toujours compilé comme optimisé: Ce qui m'a finalement aidé après avoir tout essayé, cochez la case "Activer le débogage du 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
1
La deuxième suggestion a tout fait fonctionner à nouveau merci!
CodeMilian
1
Dans VS 2015, je ne vois pas Enable unmanaged code debugging. Il y a Enable native code debugging, j'ai essayé de vérifier cela mais cela n'a fait aucune différence.
Al Lelopath
1
Dans VS 2015, j'ai vérifié le "code natif" activé dans la construction du projet, le Web, les débogueurs et tout a fonctionné.
Mouffette
6

J'ai rencontré le même problème et la solution pour moi est de passer Solution Configurationde Releaseà Debug. J'espère que ça aide

Hoang Tran
la source
4

Dans mon cas, je travaillais sur un projet d'API Web et bien que le projet ait été correctement défini pour un débogage complet, je voyais toujours cette erreur chaque fois que je me connectais au processus IIS que j'essayais de déboguer. Ensuite, j'ai réalisé que le profil de publication était défini pour utiliser la configuration Release. Donc, un autre endroit à vérifier est votre profil de publication si vous utilisez la fonction «Publier» de votre projet API web dotnet.

user8683595
la source
3

J'ai constaté que j'avais le même problème lors de l'exécution d'un projet et du débogage en l'attachant à un processus IIS. J'exécutais également en mode débogage avec les optimisations désactivées. Alors que je pensais que le code s'était bien compilé, lorsque je me suis détaché et j'ai essayé de compiler, aucune des références n'a été trouvée. Cela était dû à un autre développeur ici qui a apporté des modifications et changé l'emplacement de la référence. La référence n'est pas apparue avec le symbole d'alerte, j'ai donc pensé que tout allait bien jusqu'à ce que je fasse la compilation. Une fois la référence fixée et exécutée à nouveau, cela a fonctionné.

Derreck Dean
la source
1

Comme réponse supplémentaire pour ceux qui rencontrent ce problème lors du débogage d'une application Web de sites Web Azure:

Lors du déploiement à partir de GitHub, par exemple, le code est compilé dans le serveur Azure optimisé par défaut.

Je dis au serveur de compiler de manière débogable en définissant SCM_BUILD_ARGSsur/p:Configuration=Debug

mais il y a plus d'options. Voir ceci: http://azure.microsoft.com/blog/2014/05/08/introduction-to-remote-debugging-on-azure-web-sites-part-3-multi-instance-environment-and-git /

diegosasw
la source
1

Dans Visual Studio 2012:

Allez dans les propriétés du projet -> Déboguer -> Décochez "Activer le processus d'hébergement Visual Studio"

Milana
la source
1

Pour les applications Web, un autre problème est important et il s'agit de sélectionner la configuration correcte pendant le processus de publication de l'application.

Vous pouvez créer votre application en mode débogage, mais il se peut que vous la publiiez en mode de publication qui supprime le code par défaut, mais l'EDI peut vous induire en erreur car elle affiche le mode de débogage alors que le code publié est en mode de publication. Vous pouvez voir les détails dans l'instantané ci-dessous: entrez la description de l'image ici

VSB
la source
0

Vérifiez si vous avez un attribut Debuggable dans votre fichier AssemblyInfo. S'il existe, supprimez-le et reconstruisez votre solution pour voir si les variables locales deviennent disponibles.

Mon attribut debuggable a été défini sur: DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints qui, selon cet article MSDN, indique au compilateur JIT d'utiliser les optimisations. J'ai supprimé cette ligne de mon fichier AssemblyInfo.cs et les variables locales étaient disponibles.

pseudo
la source
0

Dans Visual Studio 2017 ou 2015:

Accédez à la solution, cliquez avec le bouton droit sur la solution, puis sélectionnez Propriétés-> sélectionnez toutes les configurations-> Débogage, puis cliquez sur OK. Après cette reconstruction et cette exécution, cette solution a fonctionné pour moi.

Kalyan
la source
0

J'ai eu le même problème. J'ai essayé tout ce qui précède et j'ai constaté que je devais également supprimer tout ce qui se trouvait dans {PROJECT_ROOT} \ bin \ Release \ netcoreapp2.2 et {PROJECT_ROOT} \ obj \ Release \ netcoreapp2.2 pour mon projet. C'est définitivement lié à la publication parce que bien que j'utilise des outils de déploiement / bitbucket sur mon Azure Web App, j'ai essayé la construction >> Publier >> Publier sur Azure parce que je voulais inspecter les fichiers qui étaient réellement déployés.

ozzy432836
la source
0

A eu le même problème avant avec une application WPF et toutes les solutions ici n'ont PAS résolu le problème . Le problème était que le module était déjà optimisé, donc les solutions suivantes NE FONCTIONNENT PAS (ou ne suffisent pas à résoudre le problème):

  • Case " Optimiser le code " non cochée
  • " Suppression de l'optimisation JIT sur la charge du module " cochée
  • Configuration de la solution sur DEBUG

Le module est toujours chargé Optimisé. Voir la capture d'écran suivante: Module optimisé


Pour résoudre ce problème, vous devez supprimer le module optimisé. Pour trouver le chemin de module optimisé, vous pouvez utiliser un outil comme Process Hacker .

Double-cliquez sur votre programme dans le " panneau Processus " puis dans la nouvelle fenêtre ouvrez l'onglet " Assemblages .NET ". Ensuite, dans la colonne " Chemin de l'image native ", vous trouverez tous les chemins des modules optimisés . Localisez celui que vous souhaitez désoptimiser et supprimez le dossier (voir capture d'écran ci-dessous): entrez la description de l'image ici (J'ai brouillé le nom de mon entreprise pour des raisons évidentes)

Redémarrez votre application (avec la case à cocher à l'étape 1 correctement cochée) et cela devrait fonctionner.

Remarque : Le fichier peut être verrouillé car il a été ouvert par un autre processus, essayez de fermer Visual Studio. Si le fichier est toujours verrouillé, vous pouvez utiliser un programme comme Lock Hunter

Ludovic Feltz
la source