Pregunta

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 () está directamente acoplado a una cuadrícula de datos 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 incómodo. ¿No hay otra manera?

¿Fue útil?

Solución

No que yo sepa. Tenga en cuenta que si do agrega una variable, el compilador la eliminará en las versiones de lanzamiento de todos modos ...

Actualización: Esta funcionalidad se ha agregado a VS2013 . Puede ver los valores de retorno en las ventanas automáticas o usar $ ReturnValue en la ventana de vigilancia / 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 poner un punto de interrupción en la llamada a la función y pasar (F10) la llamada.


Actualización para VS2015: ¡boo! desafortunadamente, no parece estar en VS2015 (devenv v14)
Actualización para VS2017: está de vuelta. (devenv v15)

Otros consejos

Esto se puede hacer en Visual Studio 2013 con CLR 4.5.1 según el sitio de comentarios del cliente . No estaba disponible en versiones anteriores para C #.

(Visual & nbsp; Studio & nbsp; 2008 y anteriores lo admitían para VB.NET. Siempre ha estado disponible para los desarrolladores de C / C ++).

Estoy de acuerdo en que es algo muy útil: no solo ver el valor de retorno del método antes de abandonarlo, 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 HUD:

Visualización de instrucciones

Para obtener más información, consulte este video .

Según Microsoft, no hay forma de implementar esto de manera confiable con código administrado. Este es un problema del que conocen y están trabajando:

  

Para aquellos que tienen experiencia en la depuración de código nativo C ++ o VB6, es posible que haya utilizado una función en la que se proporcionan valores de retorno de función 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 complicado determinar cuál es el valor de retorno de una función que ha superado. Nos dimos cuenta de que no podíamos hacer lo correcto de manera consistente aquí, por lo que eliminamos la función en lugar de brindarle resultados incorrectos en el depurador. Sin embargo, queremos traer esto de vuelta para usted y nuestros equipos CLR y depuradores están buscando una serie de posibles soluciones a este problema. Lamentablemente, esto no formará parte de Visual Studio 11.

https://connect.microsoft.com/VisualStudio/feedback/details/597933/add-a-return-pseudo-variable-to-the-visual-studio-debugger-for-net- código

Según la respuesta actualmente aceptada por Marc Gravell:

  

Esto se ha agregado la funcionalidad a Visual & nbsp; Studio & nbsp; 2013 . Puedes ver el regreso   valores en las ventanas de autos o use $ ReturnValue en el reloj / inmediato   ventana

Esa respuesta también indicó que esta funcionalidad no funciona en Visual & nbsp; Studio & nbsp; 2015. Esto no es enteramente verdad. En Examine los valores de retorno de las llamadas a métodos hay la siguiente nota:

  

Debe tener activados los evaluadores de expresiones heredadas para que $ ReturnValue se reconozca (Herramientas / Opciones / Depuración / Usar los evaluadores de expresiones C # y VB heredados ). De lo contrario, puede usar $ ReturnValue1 .

Probé esto en Visual & nbsp; Studio & nbsp; 2015 Enterprise:

  • Con los evaluadores de expresiones heredadas desactivados: solo $ ReturnValue1 funciona
  • Con los evaluadores de expresiones heredadas activados: ambos $ ReturnValue y $ ReturnValue1 funcionan

Si va al menú Herramientas ? Opciones , IntelliTrace, y cambia la configuración para recopilar información de eventos y 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 elemento secundario del nombre del método.

Esto no le muestra el valor de retorno para el método en el que se encuentra. Simplemente le muestra el valor de retorno del último método llamado en el método actual.

Entonces, 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;}

Viejo truco de los días anteriores a .NET: abra la ventana Registros y observe el valor del registro EAX. Contiene el valor de retorno de la última función llamada.

Salga del método go () usando Shift-F11, y luego en el " Autos " ventana de depuración mostrará el valor de retorno de la llamada al método que acaba de salir de la pila (en este caso, el método go () que es lo que desea). 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.

Sí, hay una muy buena manera. Un inconveniente importante es que tendrías que esperar 5, quizás 6 años. Desde que vi que publicaste en noviembre de 2008, te sugiero que waaaaaa ...

... aaaait. Y voil & # 224 ;! 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ú Depuración & # 8594; Windows & # 8594; Autos ).

Hay muchas soluciones alternativas, pero ninguna parece satisfactoria.

Para citar a John Skeet a continuación (comentar una respuesta ahora eliminada):

  

Todavía me parece inconveniente:   especialmente si no sabes cual   valor de retorno que vas a necesitar   antes de comenzar a depurar. Yo realmente   no quiero tener que tener un temporal   variable abarrotando mi código cada   cada vez que devuelvo algo.t

En teoría, el depurador podría tener una variable 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));
  }
}

Considere esto una solicitud de función para Visual Studio.

Microsoft Visual C ++ solía hacer esto, pero Visual Studio no AFAIK .. :(

La única forma que sé es colocar un punto de interrupción en la línea de retorno y luego llamar a la ventana Quick Watch 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 reanude la ejecución).

Quería ampliar Respuesta de PascalK para que esto funcione en Visual & nbsp; Studio & nbsp; 2015, porque hay una característica oculta que no está documentada en Examine los valores de retorno de las llamadas a métodos .

Si ha anidado llamadas a funciones, las pseudovariables $ ResultValueX se crean automáticamente, donde la X se refiere al orden de las llamadas a funciones. Entonces, si tiene una llamada como Multiply (Five (), Six ()) , se crean las siguientes pseudovariables:

Five()     | $ResultValue1 = 5
Six()      | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30

También puede solicitar evaluar el valor en la ventana intermedia, si no establece indicadores u otras variables, sino que solo devuelve algo.

Creo que puede determinar esto mirando el registro RAX en la ventana Registros (Depuración / Windows / Registros). Después de salir (SHIFT + F11) de la función, verifique el registro RAX. No lo sé con certeza, pero una vez en la luna, podría verificar un registro (antes de los días .NET) y ver el valor de retorno allí. Incluso podría ser una combinación de RAX y RBX, etc.

Abrir la ventana Debug ? Autos te cierra. No mostrará el valor de retorno real, pero mostrará lo que se evaluó en la declaración de retorno.

Sí, cambiando a VB.NET. ; P (Acabas de decir " Visual Studio " ;.;)

Desde que tengo memoria (desde Visual Basic a través de 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 comienzo de la función y su valor actual también se usa como valor de retorno cuando la función sale a través de medios de declaración de no retorno (es decir, Exit Function o simplemente se cae) y, por supuesto, cuando se usa la declaración de devolución.

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 ejecute la instrucción return). C # no tiene esto y debería.

Esa pequeña característica VB.NET (más la declaración Exit Function que habilita, otra característica que C # no tiene y debería) es muy útil en forma de programación defensiva Practico donde siempre inicializo el nombre de la función al valor de falla / predeterminado como la primera instrucción. Entonces, en cualquier punto de falla (que normalmente ocurre con mucha más frecuencia que los puntos de éxito), simplemente puedo llamar a la declaración Exit Function (es decir, sin tener que duplicar la falla / expresión predeterminada o incluso una constante / variable nombre).

La respuesta aceptada no funciona correctamente con Visual & nbsp; Studio & nbsp; 2015, pero al colocar un punto de interrupción en la última línea del método y presionar F10 , se colocarán todos expresiones del valor de retorno en la ventana local.

Puede intentar seleccionar " someTableAdapter.getSomeData (); " , haga clic con el botón derecho sobre él y vaya a Quick Watch .

Arrastre y suelte la expresión de retorno en una ventana de observación.

Por ejemplo, en la declaración

return someTableAdapter.getSomeData();

arrastrar y soltar

someTableAdapter.getSomeData()

en una ventana de observación y verá el valor.

Puede hacer esto para cualquier expresión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top