2008-09-25 79 views
44

Escribí un código con mucha recursión, que lleva bastante tiempo completar. Cada vez que "pausa" la carrera para ver lo que está pasando me sale:¿Qué significa "No se puede evaluar la expresión porque el código del método actual está optimizado"? ¿media?

No se puede evaluar la expresión porque el código del método actual se optimiza.

Creo que entiendo lo que eso significa. Sin embargo, lo que me desconcierta es que después de dar el paso, el código ya no está "optimizado" y puedo mirar mis variables. ¿Como sucedió esto? ¿Cómo puede el código cambiar entre códigos optimizados y no optimizados?

+0

¿Ha encontrado una solución a este problema? –

+2

No creo que la respuesta seleccionada sea útil. Cuando tengas la oportunidad, verifica la respuesta que dejó unos meses más tarde "Nadie". Hacerlo ayudará a aquellos que buscan resolver su pregunta original. – Catskul

+3

Estaba depurando en modo de lanzamiento (sonrojado). La respuesta de Lamar me hizo verificar. – mayu

Respuesta

26

El depurador usa FuncEval para permitirle "mirar" las variables. FuncEval requiere que los subprocesos se detengan en código administrado en un punto seguro GarbageCollector. Al "pausar" manualmente la ejecución en el IDE, todos los hilos se detienen lo antes posible. Su código altamente recursivo tenderá a detenerse en un punto inseguro. Por lo tanto, el depurador no puede evaluar expresiones.

Al presionar F10 se pasará al siguiente punto seguro de Funceval y se habilitará la evaluación de la función.

Para más información, revise el rules of FuncEval.

+6

Me he preguntado sobre esto yo mismo, sería bueno resumir los puntos más destacados de la publicación del blog en su respuesta. – Joe

+0

Este enlace es realmente interesante. – Lamar

+0

¿Este blog publicado señaló una solución o simplemente explicó el problema? –

25

Probablemente esté intentando depurar la aplicación en modo de lanzamiento en lugar de depurar, o tiene optimizaciones activadas en la configuración de compilación.

Cuando el código se compila con optimizaciones, ciertas variables se descartan una vez que ya no se utilizan en la función, por lo que está recibiendo ese mensaje. En el modo de depuración con optimizaciones desactivadas, no debería obtener ese error.

+1

No, no estoy tratando de depurar una aplicación que se creó en modo de lanzamiento. –

+0

"o tiene activadas las optimizaciones en la configuración de compilación" <- ¿también este no es el caso? – Biri

+5

Correcto, sin optimizaciones tampoco. –

-1

Creo que lo que está viendo es el resultado de las optimizaciones, a veces se reutilizará una variable, especialmente las que se crean en la pila. Por ejemplo, supongamos que tiene un método que usa dos enteros (locales). El primer entero se declara al inicio del método y se utiliza únicamente como contador de un ciclo. Su segundo número entero se usa después de completar el ciclo, y almacena el resultado de un cálculo que luego se escribe en el archivo. En este caso, el optimizador PUEDE decidir reutilizar su primer entero, guardando el código necesario para el segundo entero. Cuando intenta ver el segundo entero al principio, aparece el mensaje que pregunta acerca de "No se puede evaluar la expresión". Aunque no puedo explicar las circunstancias exactas, es posible que el optimizador transfiera el valor del segundo entero a un elemento de la pila por separado más adelante, lo que le permite acceder al valor del depurador.

44

Mientras que la línea Debug.Break() está en la parte superior de la pila de llamadas, no se pueden evaluar las expresiones. Eso es porque esa línea está optimizada. Presione F10 para pasar a la siguiente línea, una línea válida de código, y el reloj funcionará.

+2

Esta es la respuesta. Con suerte, eventualmente se marcará como tal. – Catskul

+2

La pregunta era "¿qué significa esto?", ¿Cómo puedo solucionar esto? –

+7

Mis primeras 2 oraciones también responden esa parte. –

1

Tenía el mismo problema pero fue capaz de resolverlo desactivando la captura de excepciones en el depurador. Haga clic en [Depurar] [Excepciones] y establezca las excepciones en "Usuario no controlado".

Normalmente lo tengo apagado, pero me viene bien de vez en cuando.Solo necesito recordar apagarlo cuando termine.

2

Busque una llamada a función con muchos params e intente disminuir el número hasta que la depuración regrese.

7

Esto me volvía loco. Intenté adjuntarme con código administrado y nativo, no ir.

Esto funcionó para mí y que finalmente fue capaz de evaluar todas las expresiones:

  • Id por Proyecto/Propiedades
  • seleccione la ficha Generar y haga clic avanzada ...
  • Asegúrese La información de depuración está configurada como "completa" (no solo pdb)
  • Depure su proyecto - ¡listo!
1

Tuve este problema cuando estaba usando VS 2010. Mi configuración de solución tiene (Debug) seleccionada. Resolví esto desmarcando la propiedad Optimizar código debajo de las propiedades del proyecto. Proyecto (clic con el botón derecho) => Propiedades => Construir (pestaña) => desmarcar Optimizar código

0

En mi caso tenía 2 proyectos en mi solución y estaba ejecutando un proyecto que no era el proyecto de inicio. Cuando lo cambié al proyecto de inicio, la depuración comenzó a funcionar nuevamente.

Espero que ayude a alguien.

0

Evaluación:

En .NET, “la función de evaluación (funceval)” es la capacidad de CLR para inyectar algo de llamada arbitraria mientras que el depurador se detiene en algún lugar. Funceval se hace cargo del hilo elegido por el depurador para ejecutar el método solicitado. Una vez que termina funceval, se activa un evento de depuración. Técnicamente, CLR ha definido formas para que el depurador emita un funceval.

CLR permite iniciar funceval solo en los subprocesos que están en el punto seguro del GC (es decir, cuando el subproceso no bloqueará GC) y Funceval Safe (FESafe) punto (es decir, donde CLR puede hacer el secuestro para el funceval). juntos. Por lo tanto, los posibles escenarios para el CLR, un hilo deben ser:

  1. se detuvo en código administrado (y en un punto seguro GC): Esto implica que no podemos hacer una funceval en código nativo. Como el código nativo está fuera del control del CLR, no puede configurar el funceval.

  2. detenido en una primera oportunidad o excepción administrada no controlada (y en un punto seguro de GC): es decir, en el momento de la excepción, inspeccionar tanto como sea posible para determinar por qué ocurrió esa excepción. (Por ejemplo: depurador puede tratar de evaluar y ver la propiedad de mensajes en la excepción planteada.)

, formas comunes globales para detener en código administrado incluyen detenerse en un punto de interrupción, paso, llamada Debugger.Break, interceptando una excepción , o en un comienzo de hilo. Esto ayuda a evaluar el método y las expresiones.

Resoluciones posibles: Según la evaluación, si el subproceso no está en los puntos FESafe y GCSafe, CLR no podrá secuestrar el subproceso para iniciar funceval.En general, siguiendo ayuda a asegurarse de funceval inicia cuando se espera:

Paso # 1:

Asegúrese de que usted no está tratando de depurar un “Release” de generación. La versión está completamente optimizada y, por lo tanto, dará lugar al error en la discusión. Al usar la barra de herramientas Estándar o Configuration Manager, puede alternar entre la versión de Debug &.

Paso # 2:

Si sigue apareciendo el error, la opción de depuración puede estar configurado para la optimización. Verificar & Desactive la casilla “optimizar el código” propiedad bajo el proyecto “Propiedades”:

Haga clic derecho en el proyecto Seleccione la opción “Propiedades” vaya a “construir” ficha Desactive la casilla de verificación “Optimizar el código”

Paso # 3:

Si aún obtiene el error, el modo de información de depuración podría ser incorrecto. Verificar & otra vez en “completo” en “Avanzada la configuración de creación”:

Haga clic derecho en el proyecto Seleccione la opción “Propiedades” vaya a “construir” pestaña Haga clic en “Opciones avanzadas” botón Set “información de depuración” como “ completa”

Paso # 4:

Si continúa teniendo el problema, intente lo siguiente:

hacer un‘limpio’& luego un‘Reconstruir’de su solución f ile Al depurar: Ir a la ventana de módulos (Menú VS -> Depurar -> Windows -> Módulos) Busque su ensamblaje en la lista de módulos cargados. Compruebe la ruta de la lista contra el conjunto cargado es lo que se espera que sea Compruebe la fecha y hora de modificación del archivo para confirmar que el montaje fue en realidad reconstruida Comprobar si el módulo cargado está optimizado o no

Conclusión:

No se trata de un error, sino de una información basada en ciertas configuraciones y diseñada en función de cómo funciona .NET.

0

en mi caso yo estaba en los de modo de liberación i cambiado para depurar todo funcionó

5

La continuación trabajó para mí, gracias @Vin.

Tuve este problema cuando estaba usando VS 2015. Mi solución: la configuración tiene (Debug) seleccionada. Resolví esto desmarcando la propiedad Optimize Code en propiedades del proyecto.

Proyecto (clic derecho) => Propiedades => Construir (pestaña) => desmarque código Optimizar

2

Asegúrese de que usted no tiene algo así

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

en su AssemblyInfo

0

Tuve un problema similar y se resolvió cuando construí la solución en modo de depuración y reemplacé el archivo pdb en la ruta de ejecución.

Cuestiones relacionadas