"No se puede evaluar la expresión porque el código del método actual está optimizado" en Visual Studio 2010

153

Estoy usando Visual Studio 2010 en modo de depuración y tengo "optimizar código" sin marcar. No puedo ver rápidamente (ni pasar el mouse) ninguna variable en el depurador. Me sale este error "No se puede evaluar la expresión porque el código del método actual está optimizado".

Incluso una línea como: int i = -3, haciendo una observación rápida en i, obtengo "No se puede obtener el valor de local o argumento 'i' ya que no está disponible en este puntero de instrucción, posiblemente porque se ha optimizado".

Este enlace al que se hace referencia en una pregunta similar no parece aplicarse.

¿Hay alguna configuración que me falta?

Tony_Henrich
fuente
44
torulflundgren.blogspot.com.au/2010/03/… Esta es la mejor solución que encontré para esto.
Probé

Respuestas:

167

Mientras el proyecto estaba en modo de depuración, la solución no. Cuando lo cambié, funcionó.

Tony_Henrich
fuente
9
Tuve este problema en VS2012, sin embargo, la solución y todos los proyectos se configuraron para depurar sin optimización. Limpié la solución / reconstrucción lo arreglé para mí.
saarp
20
Entonces ... ¿Cómo se configura la solución en modo sin depuración?
user1431072
user1431072: hace clic con el botón derecho en su solución o proyecto y elige la propiedad, luego puede configurarlo para que sea el modo de depuración
Yevgraf Andreyevich Zhivago
48

Tuve este problema cuando estaba usando VS 2010. Mi configuración de solución ha seleccionado (Depurar). Resolví esto desmarcando la propiedad Optimizar código en las propiedades del proyecto. Proyecto (clic derecho) => Propiedades => Compilación (pestaña) => desmarque Optimizar código

Vin
fuente
29

Parece que está depurando una compilación optimizada / lanzamiento, a pesar de tener la casilla optimizada sin marcar. Las cosas que puedes probar son:

  • Realice una reconstrucción completa de su archivo de solución (haga clic con el botón derecho en la solución y seleccione Reconstruir todo)
  • Mientras realiza la depuración, abra la ventana de módulos (Depuración -> Windows -> Módulos) y busque su ensamblaje en la lista de módulos cargados. Compruebe que la ruta que figura en el ensamblado cargado es lo que espera que sea, y que la marca de tiempo modificada del archivo indica que el ensamblado se ha reconstruido realmente.
  • La ventana de módulos también debe indicarle si el módulo cargado está optimizado o no; asegúrese de que la ventana de módulos indique que no está optimizado.

Si no puede ver el elemento del menú Módulos en el menú Depurar -> Windows, es posible que deba agregarlo en el menú "Personalizar ...".

Justin
fuente
2
La solución está reconstruida. La ventana de módulos muestra que el ensamblaje está optimizado. Tengo la casilla de verificación Optimizar sin marcar, así que no sé por qué el ensamblaje siempre está optimizado. La solución tiene un proyecto web, pero el código que estoy viendo está en un proyecto de biblioteca de clase en modo de depuración.
Tony_Henrich
@ Tony - Pregunta tonta, pero ¿la biblioteca de clases tiene la casilla de verificación "Optimizado" desactivada?
Justin
Si. Mencioné este hecho en mi pregunta. Ya respondí mi propia pregunta.
Tony_Henrich
1
Mi Project.Weboptimización no está marcada, pero aún se muestra como Optimizada cuando miro su ensamblaje en Debug > Modules:(
J86
La única forma en que encontré forzar a VS a actualizar la información de depuración fue aumentar la versión de ensamblaje del módulo que todavía se consideraba optimizado, mientras que la opción no estaba marcada.
alphanoch
14

En VS2013, vaya a: Herramientas -> Opciones -> Depuración -> General y active 'Usar modo de compatibilidad administrada'. Esto deshabilita el comportamiento de evaluación de la nueva función.

Jesse
fuente
¡Gracias! De las otras soluciones ofrecidas, esta fue la que me importó. Lo extraño fue que sucedió de repente, me pregunto qué causó que cambiara.
squid808
10

Intente ejecutar en modo de depuración. Si está ejecutando en modo de liberación, recibirá este mensaje.

thejustv
fuente
55
La pregunta dice, claro como el día, "Estoy usando Visual Studio 2010 en modo de depuración y tengo" optimizar el código "sin marcar" ... debe eliminar esta falta de respuesta.
Jim Balter
Seriamente. Lo dice en la pregunta que se está ejecutando en depuración. No entiendo por qué los votos positivos. Esta respuesta está contaminando las posibles resoluciones
John Demetriou
1
FWIW, esta pregunta ocupa un lugar destacado en Google cuando busca este mensaje de error. Esta respuesta fue correcta para mí (no me di cuenta de que estaba en modo de liberación).
Nate Barbettini
Es posible que tenga más de un ensamblaje y en el administrador de configuración el ensamblaje que está depurando se puede configurar para liberar o algo.
madoxdev
8

Mi situación no estaba cubierta por ninguna de las respuestas anteriores. Encontré lo siguiente: artículo de MSDN sobre subprocesos que explica que cuando está atrapado en algunas operaciones primitivas de subprocesamiento nativo, el depurador no puede acceder a los datos. Como ejemplo, cuando hay un hilo en Task.Wait (), aparece.

Alan Baljeu
fuente
8

Yo tuve el mismo problema. Pero en mi caso, el Debuggableatributo estaba codificado en el AssemblyInfo.csarchivo de mi proyecto y, por lo tanto, no (sobre) escrito por compilación. Funcionó después de eliminar la línea que especifica el Debuggableatributo.

riQQ
fuente
8

Para mí estaba sucediendo en VS2017 y VS2019. Dejó de suceder después de que seleccioné la opción "Optimización JIT suprimida en la carga del módulo".

ingrese la descripción de la imagen aquí

farfareast
fuente
+1, este fue la causa de mi problema. VS no parece demasiado bueno para comprender realmente las opciones de csproj, ya que tengo la optimización desactivada en el XML cuando la configuración termina con "Depurar". Funciona bien cuando se llama a MSBuild directamente, pero no del todo en VS.
TheBeardedQuack
5

Tuve el mismo problema en VS2008. En mi caso, se resolvió a través de la solución de reconstrucción.

Ingmar
fuente
4

Además de @Kragen mencionado, si está depurando un proyecto web

cierre el estudio visual e intente eliminar los archivos temporales en C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Archivos temporales ASP.NET

usuario de prueba
fuente
La solución tiene un proyecto web pero el código está en el proyecto de biblioteca de clases. He eliminado los archivos temporales muchas veces.
Tony_Henrich
4

Otra cosa que puede hacer es crear un archivo con el mismo nombre que el archivo dll que está optimizado pero con extensión ini y agregarle lo siguiente:

[Control de depuración de .NET Framework]
GenerateTrackingInfo = 1
AllowOptimize = 0

Esto le dirá al JIT que no optimice sus variables.

Tenga en cuenta que todavía necesita el pdb, por lo que terminará con algo como esto: yourDll.dll yourDll.pdb yourDll.ini

Esto funciona especialmente bien en escenarios en los que no tiene acceso para volver a generar los dlls con la opción de depuración.

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

Bongo Sharp
fuente
4

Cuando vea el mensaje " No se puede evaluar la expresión porque el código del método actual está optimizado " después de emitir una Debugger.Break()declaración, asegúrese de presionar F10 para pasar a la siguiente declaración.

Una vez que pase a la siguiente declaración, y suponiendo que esté ejecutando una compilación de depuración, este mensaje debería desaparecer.

Jeroen Ritmeijer
fuente
2
Eso fue todo. He probado todas las soluciones anteriores y esta pequeña cosa funcionó ... Gracias por compartirla, perdería aún más horas sin ver esta pista trivial ...
Krzysztof Szynter
Nop. No funcionó. Vs17 todavía piensa que estoy depurando una versión de lanzamiento
John Demetriou
3

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 intentar 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.

Milos
fuente
3

Tuve el mismo problema al depurar una biblioteca de clases desde una aplicación web de banco de pruebas. Estaba haciendo referencia a la versión de lanzamiento en el banco de pruebas y estaba configurado para ser optimizado en las propiedades de la biblioteca de clases.

Desactivar la casilla de verificación optimizar código para la versión de lanzamiento en las propiedades de la biblioteca de clases, justo mientras lo estoy escribiendo, ha resuelto el problema.

tekiegirl
fuente
Gracias por hacerlo. Puede encontrar esta casilla de verificación haciendo clic derecho en cada proyecto y seleccionando su opción de menú "Propiedades", luego la pestaña "Crear".
goamn
3

Me doy cuenta de que esta es una respuesta posterior, pero encontré otra referencia a una forma de abordar este problema que podría ayudar a otros en el futuro. Esta página web describe cómo configurar una variable de entorno (COMPLUS_ZapDisable = 1) que impide la optimización, ¡al menos lo hizo para mí! (No olvide la segunda parte de deshabilitar el proceso de alojamiento de Visual Studio). En mi caso, esto podría haber sido aún más relevante porque estaba depurando una DLL externa a través de un servidor de símbolos, pero no estoy seguro.

Michael Bray
fuente
3

Tuve este problema con un proyecto de F # que había estado aquí y allá entre Visual Studio y MonoDevelop, quizás originado en este último (lo olvidé). En VS, la casilla de optimización no estaba marcada, pero la optimización ciertamente parecía estar ocurriendo en lo que respecta al depurador.

Después de comparar el XML del archivo del proyecto con el de un archivo saludable, el problema era obvio: el proyecto saludable tenía un valor explícito <optimize>false</optimize> línea , mientras que al malo le faltaba por completo. VS obviamente deducía de su ausencia que la optimización estaba deshabilitada, mientras que el compilador estaba haciendo lo contrario.

La solución fue agregar esta propiedad al archivo del proyecto y volver a cargar.

Jason Holloway
fuente
1

Comencé a recibir este mensaje cuando migré a Visual Studio 2017. Ninguna de las ideas en esta página que probé funcionó para mí. En otra publicación encontré esta sugerencia y funcionó: eliminar:

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

... desde su archivo AssemblyInfo.

Gato loco
fuente
Te amo @Crazy Cat. Me ha sucedido cuando migré a VS2019.
Antonio Rodríguez
0

Tuve el mismo problema en VS 2010. Limpié y reconstruí la solución y funcionó.

Sanjay Gupta
fuente
0

El comentario de vickramds anterior, que se refiere a http://torulflundgren.blogspot.com.au/2010/03/cannot-obtain-value-of-local-or.html , lo hizo por mí. Verifiqué todo: eliminé todos los archivos dll, pdb de las carpetas bin locales, limpié, reconstruí, borré todas las carpetas de archivos temporales ASP.NET, me aseguré de que los indicadores TRACE / DEBUG estuvieran configurados, verifiqué las rutas DLL, etc.

Para dejarlo para que no se pierda, para los proyectos afectados:

Propiedades del proyecto -> Compilación -> Avanzado -> Información de depuración: Completo.

Desea comprobar que tiene seleccionada la configuración de Depuración antes de hacer esto, a menos que, por supuesto, tenga la intención de lo contrario.

Mayyit
fuente
0

Si está intentando depurar un proyecto ASP.NET, asegúrese de que el menú desplegable Propiedades> Web> Servidores del proyecto esté configurado en "IIS Express" (además de verificar todo lo demás aquí).

Overlord Zurg
fuente
0

Había mezclado dlls de extensión c ++ / cli mfc, que se optimizaron incluso si la configuración de depuración (vista desde la ventana de Módulos VS 2017). Como sugirió la respuesta anterior, cambié "En VS2013, vaya a: Herramientas -> Opciones -> Depuración -> General y habilite 'Usar modo de compatibilidad administrada'. Esto deshabilita el comportamiento de evaluación de la nueva función". Esa configuración también se encuentra en VS 2017.

Pero eso no fue suficiente, por lo que también copié la configuración UseDebugLibraries del archivo de proyecto de otra aplicación MFC al archivo de proyecto dll de extensión.

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

Luego reconstruir y eso solucionó el problema.

owluCoder
fuente
0

En Visual Studio 2012, habilitar la opción " Administrado " desde Herramientas> Depuración> Just-In-Time funcionó para mí.

ingrese la descripción de la imagen aquí

QMaster
fuente