c# - una - la aplicacion se encuentra en modo de interrupcion visual studio 2017
¿Puedo averiguar el valor de retorno antes de regresar mientras se realiza la depuración en Visual Studio? (20)
Tome la siguiente función:
DataTable go() {
return someTableAdapter.getSomeData();
}
Cuando establezco un punto de interrupción en esta función, ¿existe la posibilidad de inspeccionar el valor devuelto? go()
se acopla directamente a un datagrid en una página .aspx
.
La única forma de inspeccionar la tabla de datos devuelta es usar una variable temporal. Sin embargo, eso es un poco inconveniente. ¿No hay otra manera?
Al abrir la ventana Debug → Autos, se le acerca. No mostrará el valor de retorno real, pero mostrará lo que se evaluó en la declaración de retorno.
Arrastre y suelte la expresión de retorno en una ventana de visualización.
Por ejemplo, en la declaración
return someTableAdapter.getSomeData();
arrastrar y soltar
someTableAdapter.getSomeData()
en una ventana de vigilancia, y verá el valor.
Puedes hacer esto para cualquier expresión.
Creo que puede determinar esto mirando el registro RAX en la ventana Registros (Depurar / Windows / Registros). Después de salir (MAYÚS + F11) de la función, verifique el registro RAX. No sé a ciencia cierta, pero una vez en la luna se puede consultar un registro (días anteriores a .NET) y ver el valor de retorno allí. Incluso podría ser una combinación de RAX y RBX, etc.
Esto se puede hacer en Visual Studio 2013 con CLR 4.5.1 de acuerdo con el sitio de comentarios de los clientes . No estaba disponible en versiones anteriores para C #.
(Visual Studio 2008 y versiones anteriores lo admitían para VB.NET. Siempre ha estado disponible para los desarrolladores de C / C ++).
Estoy de acuerdo en que es muy útil tener esto: no solo ver el valor de retorno del método antes de salir, sino también ver el valor de retorno de los métodos que acabo de pasar. Lo implementé como parte de una extensión comercial de Visual Studio llamada " OzCode ".
Con él, puede ver los valores de retorno del método directamente en el editor de código, como una especie de pantalla de HUD:
Para más información, por favor vea este video .
Hay muchas soluciones, pero ninguna parece satisfactoria.
Para citar a John Skeet a continuación (comente sobre una respuesta ahora eliminada):
Todavía me parece un inconveniente, especialmente si no sabe qué valor de retorno necesitará antes de comenzar la depuración. Realmente no quiero tener que tener una variable temporal saturando mi código cada vez que devuelvo algo.
En teoría, el depurador podría tener una variable de return
. Después de todo: es solo una variable en la pila:
unsafe {
int * sp = stackalloc int[1];
try {
return a+b;
}
finally {
Trace.WriteLine("return is " + *(sp+3));
}
}
Así que considere esto como una solicitud de características para Visual Studio.
La única forma que conozco es colocar un punto de interrupción en la línea de retorno y luego llamar a la ventana de Observación rápida e ingresar la expresión devuelta:
someTableAdapter.getSomeData();
Pero esto solo funciona si la llamada no cambia el estado de ningún objeto (ya que habrá una segunda llamada al mismo método cuando reanudará la ejecución).
Microsoft Visual C ++ solía hacer esto, pero Visual Studio no AFAIK ... :(
No que yo sepa. Tenga en cuenta que si agrega una variable, el compilador la eliminará en las compilaciones de lanzamiento de todos modos ...
Actualización: Esta funcionalidad se ha agregado a VS2013 . Puede ver los valores de retorno en las ventanas de autos o usar $ReturnValue
en la ventana de visualización / inmediata.
El valor solo se puede ver directamente después de regresar de la función, por lo tanto, la forma más fácil de acceder es poniendo un punto de interrupción en la llamada a la función y pisando (F10) la llamada.
Actualización para VS2015: boo! desafortunadamente, no parece estar en VS2015 (devenv v14)
Podría intentar seleccionar "someTableAdapter.getSomeData();"
, haz clic derecho en él y ve a Quick Watch .
Quería ampliar la respuesta de PascalK para que esto funcionara en Visual Studio 2015, porque hay una función oculta que no está documentada en Examinar los valores devueltos de las llamadas a métodos .
Si tiene llamadas de función anidadas, las pseudo-variables $ResultValueX
se crean automáticamente, donde X se refiere al orden de llamada de función. Por lo tanto, si tiene una llamada como Multiply(Five(), Six())
, se crean las siguientes pseudo-variables:
Five() | $ResultValue1 = 5
Six() | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30
Sí, cambiando a VB.NET. ; P (Acabas de decir "Visual Studio";;)
Mientras pueda recordar (desde Visual Basic hasta todas las versiones de VB.NET), simplemente puede consultar el nombre de la función. "Funciona" como una variable local que se declara implícitamente al inicio de la función y su valor actual también se usa como valor de retorno cada vez que la función sale a través de medios de declaración sin retorno (es decir, la Exit Function
o simplemente está cayendo) y por supuesto , cuando se utiliza la declaración de retorno.
También se establece en la expresión de la declaración de retorno. Al igual que una variable local, su valor se puede inspeccionar en cualquier punto de ejecución dentro de la función (incluso después de que se ejecuta la instrucción de retorno). C # no tiene esto y debería.
Esa pequeña característica de VB.NET (más la declaración de la Exit Function
que habilita - otra característica que C # no tiene y debería) es muy útil en una forma de programación defensiva que practico donde siempre inicializo el nombre de la función al valor de falla / predeterminado como la primera afirmación. Luego, en cualquier punto de falla (que normalmente ocurre mucho más a menudo que los puntos de éxito), simplemente puedo llamar a la declaración de la Exit Function
(es decir, sin tener que duplicar la expresión de falla / predeterminada o incluso un nombre de constante / variable).
Sí, hay una manera muy bonita. Un inconveniente importante es que tendrías que esperar 5, quizás 6 años. Desde que veo que publicaste en noviembre de 2008, te sugiero que waaaaaa ...
... aaaait. ¡Y voilá! Solo para usted, MS ha lanzado la última versión de Visual Studio 2013, donde es una función predeterminada accesible desde los menús mientras se ejecuta en modo de depuración (menú Depurar → Windows → Autos ).
Salga del método go () usando Shift-F11, y luego, en la ventana de depuración "Autos", se mostrará el valor de retorno de la llamada al método que se desprendió de la pila (en este caso, el método go () que es Lo que quieras). Este es el comportamiento en Visual Studio 2005; No he usado Visual Studio 2008, así que no sé si esto se comporta de la misma manera en esa versión.
Según Microsoft, no hay forma de implementar esto de manera confiable con código administrado. Este es un problema que conocen y en el que están trabajando:
Para aquellos que tienen experiencia en la depuración de códigos C ++ o VB6 nativos, es posible que haya utilizado una función en la que se proporcionan valores de retorno de funciones en la ventana Autos. Desafortunadamente, esta funcionalidad no existe para el código administrado. Si bien puede solucionar este problema asignando los valores de retorno a una variable local, esto no es tan conveniente porque requiere modificar su código. En el código administrado, es mucho más difícil determinar cuál es el valor de retorno de una función que ha superado. Nos dimos cuenta de que aquí no podíamos hacer lo correcto de manera consistente, por lo que eliminamos la función en lugar de darle resultados incorrectos en el depurador. Sin embargo, queremos traer esto de vuelta para usted y nuestros equipos de CLR y Debugger están buscando una serie de posibles soluciones a este problema. Desafortunadamente esto no será parte de Visual Studio 11.
Según la respuesta actualmente aceptada por Marc Gravell:
Esta funcionalidad se ha agregado a Visual Studio 2013 . Puede ver los valores de retorno en las ventanas de autos o usar $ ReturnValue en la ventana de visualización / inmediata
Esa respuesta también indicó que esta funcionalidad no funciona en Visual Studio 2015. Esto no es (totalmente) cierto. En Examinar los valores de retorno de las llamadas de método hay la siguiente nota:
Debe tener activados los evaluadores de expresiones heredadas para que se reconozca $ ReturnValue (Herramientas / Opciones / Depuración / Usar los evaluadores de expresiones heredadas de C # y VB ). De lo contrario, puede utilizar $ ReturnValue1 .
He probado esto en Visual Studio 2015 Enterprise:
- Con los evaluadores de expresiones heredadas desactivados: solo $ ReturnValue1 funciona
- Con los evaluadores de expresiones heredadas activados: tanto $ ReturnValue como $ ReturnValue1 funcionan
Si va al menú Herramientas → Opciones , IntelliTrace y cambia la configuración para recopilar eventos e información de llamadas.
Puede volver al evento de llamada anterior ( Ctrl + Shift + F11 ) y ver el valor temporal devuelto por la llamada al método en la ventana de autos como hijo del nombre del método.
Esto no le muestra el valor de retorno para el método en el que se encuentra. Solo le muestra el valor de retorno del último método llamado en el método actual.
Por lo tanto, está bien para
DataTable go(){return someTableAdapter.getSomeData();}
ya que le muestra el valor de retorno para someTableAdapter.getSomeData()
.
Pero no para:
int go(){return 100 * 99;}
También puede solicitar evaluar el valor en la ventana intermedia también, si no establece indicadores u otras variables, pero solo devuelve algo.
Truco anterior de los días anteriores a .NET: abra la ventana Registros y observe el valor del registro EAX. Esto contiene el valor de retorno de la última función llamada.
La respuesta aceptada no funciona correctamente con Visual Studio 2015, pero al colocar un punto de interrupción en la última línea del método y presionar F10 , se colocarán todas las expresiones del valor de retorno en la ventana local.