.net - una - Depuración mientras está en pausa y ''no se puede evaluar la expresión''
la aplicacion se encuentra en modo de interrupcion visual studio 2017 (7)
Aquí hay un link a una discusión sobre este tema. Aparentemente, cuando los argumentos de la función son estructuras, y la memoria total necesaria en la pila para llamar a la función excede algunos números mágicos de Visual Studio, depuradores de depuración.
link adicional de la discusión del marco de OpenTK.
Al usar Visual Studio, después de asociarse a un Proceso y presionar Pausa (Break-All), cambia al hilo deseado y usa la ventana de Observación rápida para revisar algunos datos,
MySingletonClass.Instance.Data
A veces me sale esto:
No se puede evaluar la expresión porque el subproceso actual está en suspensión, espera o unión
o esto (cuando se trata de ver ciertas propiedades de los datos):
No se puede evaluar la expresión porque un marco nativo está en la parte superior de la pila de llamadas.
Francamente, no me importa, ¡solo quiero ver los datos! Sé que hay varias maneras de evitar esto, a saber:
- Establecer un punto de interrupción en el hilo y esperar hasta que sea golpeado (engorroso, no siempre posible)
- Tomando un volcado del proceso y volviendo a cargar en VS (incluso en ese caso, todavía obtengo el segundo error)
- windbg
Teniendo en cuenta que podría ver estos datos si supuestamente usó windbg, ¿por qué no podemos aprovechar el VS mucho más fácil y más bonito para inspeccionar objetos cuando se adjunta a un proceso?
El problema es que no se trata de datos que desea ver, es el resultado de ejecutar algún código. En .Net las propiedades son realmente solo métodos disfrazados, por lo que para obtener el valor de una propiedad, Visual Studio necesita ejecutar el código de la aplicación (esta función se conoce como FuncEval).
Este código debe ejecutarse en algún subproceso y lo que hace VS es que utiliza uno de los subprocesos de la aplicación para esto. Hay una serie de situaciones en las que VS no puede ejecutar el código para producir el resultado, y es cuando ves los mensajes de error de los que estás hablando.
Sé que esto es un problema, pero estoy contento con la forma en que funciona. Al final de mi método Main (), que originalmente inicia todo y crea todas las otras estructuras de datos y subprocesos y luego termina, me quedo con esto:
while (true)
{
// This infinite while loop just gives me a convenient place for a
// breakpoint, so I can see everything everywhere during debugging.
Thread.Sleep(100);
}
En lugar de hacer un "Romper todo", simplemente coloco un punto de interrupción en la abrazadera rizada {. El programa se rompe. Tengo un hilo disponible y una referencia a todo, por lo que puedo explorar fácilmente todas las estructuras de datos y todos los hilos, ver todo en todas partes.
Si pasa a la siguiente instrucción, el depurador podría tener tiempo suficiente para evaluarla antes de que se agote el tiempo de espera.
Tenga en cuenta, esto no siempre funciona.
Si su proyecto es un servidor cliente, intente volver a cargar la referencia MySql.Data.dll
Simplemente presiona Shift-F11 hasta que el marco de la pila administrada esté en la parte superior de la pila y puedas hacer lo que quieras en VS.
Básicamente, se reduce al hecho de que no es seguro evaluar expresiones en ciertos puntos durante la ejecución del proceso, o corre el riesgo de dañar el tiempo de ejecución. WinDbg no protege el tiempo de ejecución de usted. VS lo hace.
¿Por qué no podemos hacer esto? No podemos hacer esto porque la ventana de visualización de Visual Studio no solo recupera datos de la memoria y los muestra. En realidad, ejecuta código administrado (eso es lo que significa "evaluar la expresión"). En particular, casi siempre ejecuta el método ToString()
para mostrar el resultado legible por el usuario.
El problema es que ejecuta este código dentro del proceso / subproceso que está depurando . Esto garantiza que la expresión se evalúe de la misma manera que lo haría si estuviera realmente en el código que está depurando. Esto deja la desventaja de que solo se puede ejecutar entre las instrucciones administradas, pero no mientras el código nativo esté activo y no en un hilo bloqueado.
¿Qué podemos hacer al respecto? Si en realidad está depurando una aplicación administrada, y está en un stackframe nativo, simplemente presione F10 o Shift + F11 varias veces hasta que vuelva a estar en el código administrado. Luego puedes evaluar expresiones. Sin embargo, para procesos totalmente nativos y para hilos en un estado bloqueado, no tengo conocimiento de ninguna solución.