No se puede obtener el valor de local o argumento, ya que no está disponible en este puntero de instrucciones, posiblemente porque se ha optimizado


212

Visual Studio 2010 mata (no hay otra palabra) datos en uno de los argumentos de la función en el bloque inseguro. ¿Qué podría causar este error? El siguiente mensaje se muestra por el depurador.

Cannot obtain value of local or argument as it is not available at this instruction pointer, possibly because it has been optimized away.

2
Tengo exactamente el mismo problema y estoy usando Debug build. 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
¡Vaya! Acabo de liberar el lanzamiento seleccionado por error ..
Daniel Little

Tengo este problema en VS 2017 y he seguido todas las instrucciones en las publicaciones a continuación. ¿Hay más opciones?
Matt W

No olvides Menú Build -> Configuration Manager. La configuración debe establecerse en Depurar allí o aún obtendrá el problema.
Bob Clegg

Respuestas:


347

Vaya a Propiedades del proyecto y en Compilar. Asegúrese de que la casilla de verificación "Optimizar código" esté desmarcada.

Además, configure el menú desplegable "Información de depuración" en "Completo" en las Opciones avanzadas (en la pestaña Compilar).


129129
Primero, verifique que la Configuración de compilación sea Debug, no Release.
ApceH Hypocrite

Por cierto, si quieres probarlo en modo Release, puedes agregar "Debugger.Launch ();" en el código
Jason

Realicé ambos pasos y cambié la configuración de "Release" a "Build". Trabajó en Visual Studio 2017 Community Edition.
Neo

1
Si tiene VS 2017, tanto la respuesta aceptada como la respuesta de xyq.384.b ayudarán. Para mí la respuesta xyq.384.b era el punto de referencia, ya que era depurador JIT que estaba suprimiendo el puntero ... Lo siento JIT "optimizado" que ...
BillRuhl

Después de cambiar a la configuración de depuración descubrí que el cuadro de código de optimización ya estaba desmarcado. Lección aprendida: No depure en modo de configuración de lanzamiento.
eliteproxy

135

También en VS 2015 Community Edition

vaya a Depurar-> Opciones o Herramientas-> Opciones

y marque Depuración-> General-> Suprimir la optimización JIT en la carga del módulo (solo administrado)


77
Esto resolvió mi problema después de haber aplicado todas las soluciones mencionadas anteriormente.
masih

1
Ninguna de las respuestas sugeridas me funciona. Mis variables todavía están optimizadas ...
Sushi271

No tengo idea de por qué esto de repente comenzó a suceder ... ¡pero esto lo solucionó!
Murphybro2

¡Santo cielo, esto también me lo arregló en la comunidad VS2017! No tengo idea de cuándo o cómo esta opción se deseleccionó ...
Ian Kemp

Funciona como un campeón!
BillRuhl

59

Si compila con optimizaciones habilitadas, se eliminarán muchas variables; por ejemplo:

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

aquí la variable local valuenormalmente se eliminaría, manteniendo el valor en la pila en su lugar, un poco como si hubiera escrito:

DoSomething(GetValue());

Además, si no se utiliza un valor de retorno , se eliminará a través de "pop" (en lugar de almacenarse en un local a través de "stloc", y de nuevo; el local no existirá).

Debido a esto, en tal compilación, el depurador no puede obtener el valor actual de valueporque no existe , solo existe por un breve instante entre GetValue()y DoSomething(...).

Entonces; si quieres depurar ... ¡no uses una versión de lanzamiento! o al menos, deshabilite las optimizaciones mientras depura.


44
Gracias por su respuesta, pero compruebo la propiedad Optimizar código en mi proyecto y no está seleccionada = (
curiosidad

44
@Marc: entiendo lo que estás diciendo, sin embargo, estoy usando las bibliotecas de fuentes de referencia de microsoft para codificar paso a paso su propia basura. Estoy caminando a través de métodos ahora, pero parece que no puedo ver ninguno de los valores de los locales. ¿Cuál es el punto de depurar la fuente .Net entonces? ¿Alguna sugerencia? stackoverflow.com/questions/13147132/…
one.beat.consumer

Parece que estoy haciendo lo mismo que @ one.beat.consumer: intentando recorrer los símbolos públicos de Microsoft para comprender por qué el marco ASP.NET no funciona. En mi caso, el modelo de encuadernación en MVC 3 ...
bambams

@ one.beat.consumer Supongo que las referencias de microsoft se compilaron con la optimización habilitada, por lo que, aunque puede descargar su código fuente para ver cómo desaparecen los valores, igual que si compilara su proyecto con optimizaciones habilitado Es específico del proyecto (dll): si puede obtener versiones de "depuración" de las referencias de MS, podrá ver los valores. No olvide que si otro proyecto hizo referencia a la dll de MS a la que hace referencia su proyecto principal, la "subreferencia" puede coincidir con la configuración del otro proyecto.
drzaus


20

Me encontré con esto y estaba ejecutando bajo Releaseconfiguración de Debugcompilación en lugar de configuración de compilación. Una vez que cambié a Debugmi variable mostrada en el reloj nuevamente.



8

Cuando tuve que enfrentar el mismo problema, solo tuve que limpiar mi solución antes de reconstruir. Eso se encargó de mí.


6

Con respecto al problema con la propiedad "Optimizar código" SIN COMPROBAR pero el código aún se compila como optimizado: Lo que finalmente me ayudó después de intentarlo todo fue marcar la casilla de verificación "Habilitar depuración de código no administrado" en la misma página de configuración (Propiedades del proyecto - Depuración). No se relaciona directamente con la optimización del código, pero con esto habilitado, VS ya no optimiza mi biblioteca y puedo depurar.


1
La segunda sugerencia hizo que todo volviera a funcionar, ¡gracias!
CodeMilian

1
En VS 2015, no veo Enable unmanaged code debugging. Hay Enable native code debugging, intenté comprobar esto, pero no hizo ninguna diferencia.
Al Lelopath

1
En VS 2015, verifiqué Habilitar "Código nativo" en la compilación del proyecto, Web, Depuradores y todo funcionó.
Mouffette

6

Me he enfrentado al mismo problema y la solución para mí es cambiar Solution Configurationde Releasea Debug. Espero eso ayude


4

En mi caso, estaba trabajando en un proyecto de API web y, aunque el proyecto se configuró correctamente para la depuración completa, todavía veía este error cada vez que me adjuntaba al proceso de IIS que intentaba depurar. Luego me di cuenta de que el perfil de publicación estaba configurado para usar la configuración de lanzamiento. Entonces, un lugar más para verificar es su perfil de publicación si está utilizando la función 'Publicar' de su proyecto de API web dotnet.


3

Descubrí que tenía el mismo problema cuando estaba ejecutando un proyecto y depurando al adjuntar a un proceso de IIS. También estaba corriendo en modo de depuración con optimizaciones desactivadas. Si bien pensé que el código se compilaba bien, cuando lo separé e intenté compilar, no se encontró una de las referencias. Esto se debió a otro desarrollador aquí que realizó modificaciones y cambió la ubicación de la referencia. La referencia no apareció con el símbolo de alerta, así que pensé que todo estaba bien hasta que hice la compilación. Una vez arreglada la referencia y funcionando nuevamente, funcionó.


1

Como respuesta adicional para quienes experimentan este problema al depurar la aplicación web de un sitio web de Azure:

Al implementar desde GitHub, por ejemplo, el código se compila en el servidor Azure optimizado de manera predeterminada.

Le digo al servidor que compile de forma depurable configurando SCM_BUILD_ARGS de/p:Configuration=Debug

Pero hay más opciones. Vea esto: http://azure.microsoft.com/blog/2014/05/08/introduction-to-remote-debugging-on-azure-web-sites-part-3-multi-instance-environment-and-git / /


1

En Visual Studio 2012:

Vaya a las propiedades del proyecto -> Depurar -> Desmarque "Habilitar el proceso de alojamiento de Visual Studio"


1

Para las aplicaciones web hay otro problema que es importante y es seleccionar la configuración correcta durante el proceso de publicación de la aplicación.

Puede compilar su aplicación en modo de depuración, pero puede suceder que la publique en modo de lanzamiento, lo que omite el código de manera predeterminada, pero IDE puede confundirlo ya que muestra el modo de depuración mientras el código publicado está en modo de lanzamiento. Puede ver los detalles en la siguiente instantánea: ingrese la descripción de la imagen aquí


0

Verifique si tiene un atributo Debuggable en su archivo AssemblyInfo. Si es así, elimínelo y reconstruya su solución para ver si las variables locales están disponibles.

Mi atributo debuggable se estableció en: DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints que, de acuerdo con este artículo de MSDN, le dice al compilador JIT que use optimizaciones. Eliminé esta línea de mi archivo AssemblyInfo.cs y las variables locales estaban disponibles.


0

En Visual Studio 2017 o 2015:

Vaya a la solución, haga clic derecho en la solución, luego seleccione Propiedades-> seleccione toda la Configuración-> Depurar y luego haga clic en Aceptar. Después de esa reconstrucción y ejecución, esta solución funcionó para mí.


0

Tuve el mismo problema. Intenté todo lo anterior y descubrí que también tenía que eliminar todo dentro de {PROJECT_ROOT} \ bin \ Release \ netcoreapp2.2 y {PROJECT_ROOT} \ obj \ Release \ netcoreapp2.2 para mi proyecto. Definitivamente está relacionado con la publicación porque, aunque utilizo herramientas de implementación / bitbucket en mi aplicación web de Azure, probé Build >> Publish >> Publish to Azure porque quería inspeccionar qué archivos se implementaron realmente.


0

Tuve el mismo problema antes con una aplicación WPF y todas las soluciones aquí NO resolvieron el problema . El problema era que el Módulo ya estaba optimizado, por lo que las siguientes soluciones NO FUNCIONAN (o no son suficientes para resolver el problema):

  • Casilla de verificación " Optimizar código " sin marcar
  • " Suprimir la optimización JIT en la carga del módulo " marcado
  • Configuración de la solución en DEBUG

El módulo todavía está cargado Optimizado. Ver la siguiente captura de pantalla: Módulo optimizado


Para resolver este problema , debe eliminar el módulo optimizado. Para encontrar la ruta del módulo optimizada, puede usar una herramienta como Process Hacker .

Haga doble clic en su programa en el " Panel de proceso " y luego, en la nueva ventana, abra la pestaña " Ensamblados .NET ". Luego, en la columna " Ruta de imagen nativa ", encontrará todas las rutas de los módulos optimizados . Localice el que desea des-optimizar y elimine la carpeta (vea la captura de pantalla a continuación): ingrese la descripción de la imagen aquí (borré el nombre de mi empresa por razones obvias)

Reinicie su aplicación (con la casilla de verificación en el paso 1 marcada correctamente) y debería funcionar.

Nota : El archivo puede estar bloqueado ya que fue abierto por otro proceso, intente cerrar Visual Studio. Si el archivo aún está bloqueado, puede usar un programa como Lock Hunter

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.