2010-09-02 13 views
26

Usando Visual Studio, después de adjuntar a un Proceso y presionando Pausa (Romper-Todo), cambia al subproceso deseado y utiliza la ventana de Observación rápida para ver algunos datos, por ejemploDepuración mientras está en pausa y 'no se puede evaluar la expresión'

MySingletonClass.Instance.Data 

a veces yo tampoco sale esto:

no se puede evaluar la expresión debido a que el hilo actual está en un sueño, espera, o unirse a

o esto (al intentar 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:

  1. Establecer un punto de interrupción en el hilo y la espera hasta que recibe un golpe (engorroso, no siempre es posible)
  2. Tomar una descarga del proceso y la carga de vuelta en VS (aun así sigo teniendo el segundo error)
  3. windbg

dado podría ver estos datos si presumiblemente acostumbrado windbg ¿por qué es que todos no podemos tomar ventaja de la mucho más fácil y VS más bonita para inspeccionar objetos cuando Ttaching a un proceso?

Respuesta

21

¿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 el 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.

Lo crucial es que ejecuta este código dentro del proceso/subproceso que está depurando. Esto asegura que la expresión se evalúa de la misma manera que si estuviera realmente en el código que está depurando. Esto deja la desventaja de que solo se puede ejecutar entre instrucciones administradas, pero no mientras el código nativo esté activo, y no en una cadena bloqueada.

¿Qué podemos hacer al respecto? Si realmente está depurando una aplicación administrada, y se encuentra en un marco de pila nativo, simplemente presione F10 o Shift + F11 repetidamente hasta que vuelva al código administrado. Entonces puedes evaluar expresiones. Sin embargo, para procesos totalmente nativos y para subprocesos en estado bloqueado, no conozco ninguna solución alternativa.

3

Simplemente pulse Shift-F11 hasta que un marco de pila administrado esté en la parte superior de la pila y podrá hacer lo que desee en VS.

Básicamente se debe al hecho de que no es seguro la seguridad para evaluar expresiones en ciertos puntos durante la ejecución del proceso, o corres el riesgo de corromper el tiempo de ejecución. WinDbg no protege el tiempo de ejecución de usted. VS lo hace

+1

En la mayoría de los casos que he visto se debe a los métodos de larga ejecución, por ejemplo, consultas SQL. – leppie

2

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 solo métodos disimulados, 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 aplicación para esto. Hay a number of situations donde VS no puede ejecutar el código para producir el resultado, y es entonces cuando ve los mensajes de error de los que está hablando.

+0

Gracias, eso borra algunas cosas, sin embargo, cuando tomo el archivo de volcado, de alguna manera puedo ver los datos, por ejemplo, cargar el archivo de volcado, cambiar al hilo 'durmiente', y hacer un rápido vistazo a 'esto' y los datos aparece. – wal

+0

por 'muestra' quiero decir que no obtengo el 'No puedo evaluar la expresión porque el hilo actual está en suspensión, espere o se una' – wal

0

Si pasa a la siguiente instrucción, el depurador puede tener tiempo suficiente para evaluarlo antes de que se agote el tiempo de espera.

Nota, esto no siempre funcionará.

4

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 que se necesita en la pila para llamar a la función excede el número mágico de depuradores visuales del estudio de vómitos.

Adicional link de OpenTK framework discussion.

0

si su proyecto es cliente-servidor, tratar de volver a subir MySql.Data.dll referencia

0

Sé que esto es una chapuza, pero estoy feliz con la forma en que funciona. Al final de mi método Main(), que comienza originalmente todo y crea todas las otras estructuras de datos y los hilos y luego se termina, me quedo 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 vez de hacer una "pausa del Juego" Me acaba de pegar una punto de interrupción en el corsé {. El programa se rompe Tengo un hilo disponible y una referencia a todo, por lo que puedo navegar fácilmente por todas las estructuras de datos y todos los hilos, ver todo en todas partes.

Cuestiones relacionadas