¿Puedo averiguar el valor de retorno antes de regresar mientras depuro en Eclipse?

99

¿Es posible ver el valor de retorno de un método después de ejecutar la línea y antes de que el puntero de instrucción regrese a la función que llama?

Estoy depurando un código que no puedo modificar (léase: no quiero volver a compilar una biblioteca de terceros) y, a veces, salta al código para el que no tengo fuente o la expresión de retorno tiene efectos secundarios que me impiden ser capaz de ejecutar la expresión en la pestaña Visualización .

A menudo, el valor de retorno se usa en una declaración compuesta, por lo que la vista de Variables nunca me mostrará el valor (por lo tanto, quiero ver el resultado antes de que el control regrese a la función de llamada).

ACTUALIZACIÓN: No puedo usar el visor de expresiones ya que hay efectos secundarios en la declaración.

RodeoPayaso
fuente
7
Es por eso que cambié a la versión comunitaria de IntelliJ: la gente de Eclipse simplemente no parece entender lo importante que es esto. (Si alguna vez lo arreglan, lo volveré a cambiar el día de su lanzamiento.)
@James Mitchell, esto parece una gran idea para un complemento. Lo
agregaré
@ user672348 ¿Pero cómo hacer eso en IntelliJ IDEA?
Alexey Tigarev
@AlexeyTigarev: IIRC, solo se muestra cuando haces "Step Return" (o el equivalente).
Blaisorblade
1
Prepárese para Eclipse Oxygen (fecha de lanzamiento de mediados de 2017). El hito M2 incluye esta característica .
Abdull

Respuestas:

36

Esta función se agregó a la versión 4.7 M2 de Eclipse bajo el error 40912 de Eclipse .

Para usarlo:

  • pasar por encima de la returndeclaración (utilizando "Paso sobre" o "Paso hacia atrás ")
  • ahora la primera línea en la vista de variables mostrará el resultado de la declaración de retorno, como "[declaración xxx] devolvió:"

Consulte Eclipse Project Oxygen (4.7) M2 - Nuevo y notable para obtener más detalles.

sleske
fuente
Yo también. Echo de menos esta característica cuando uso Eclipse.
m24p
1
Este error de Eclipse se volvió a abrir posteriormente a finales de 2009 . Sin embargo, todavía estoy esperando una solución, sin nadie asignado y sin Target Milestone. :)
Mark A. Fitzgerald
1
Esto se ha solucionado en las compilaciones recientes de Eclipse 4.7 (M2 en adelante)
AbdullahC
1
Se puede encontrar información sobre cómo usar la solución en New And Noteworthy for 4.7 M2. Busque "Resultado del método después de las operaciones de paso" aquí: eclipse.org/eclipse/news/4.7/M2
Joshua Goldberg
@JoshuaGoldberg: Gracias por señalar esto, lo edité en la respuesta.
sleske
34

Encontré un atajo realmente bueno para esto. Seleccione la expresión que devuelve el valor y presione

Ctrl + Shift + D

Esto mostrará el valor de la declaración de devolución. Esto es realmente útil en los casos en los que no puede o no desea cambiar solo con fines de depuración.

Espero que esto ayude.

Nota: No he probado esto con bibliotecas de terceros, pero funciona bien para mi código. Probé esto en Eclipse Java EE IDE para desarrolladores web. Versión: Juno Service Release 1

Satish
fuente
4
+1 porque esto funciona no solo para valores de retorno, sino para expresiones en general. Mucho más conveniente que usar la pestaña de expresiones. Cabe señalar que esto ejecuta el código, por lo que si tiene efectos secundarios, tenga cuidado. help.eclipse.org/indigo/…
cabra
1
Ctrl + Shift + Itambién fue útil para mí.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
2
como mencionó @goat, esto ejecuta el código varias veces, así que, por ejemplo, si la función hiciera esto return System.currentTimeMillis();, obtendría un resultado diferente al que la función realmente devolvió.
Brad Parks
Equivalente en un Apple machine?
Adrien Be
Este es un consejo problemático; esto reevaluará la expresión, lo que puede ser desastroso si tiene efectos secundarios.
sleske
5

Es por eso que siempre me quedo con el siguiente patrón de métodos:

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

Mis reglas:

  1. Solo una declaración de devolución, solo al final del método (finalmente se permite después)
  2. Siempre tenga un resultado llamado local que contenga el valor devuelto, comenzando por un valor predeterminado.

Naturalmente, los captadores más triviales están exentos.

zvikico
fuente
3
Hola zvikico: cuando trabajo en mi propio código, suelo usar un patrón similar. Desafortunadamente, mi problema es cuando estoy usando código que no está escrito o que no puedo modificar. : S
RodeoClown
Yo también hago esto, pero SonarLint se queja ... ahora me equivoco: stackoverflow.com/questions/31733811/…
HDave
@WitoldKaczurba esa es tu opinión, y está bien. Simplemente acepte que hay otras opiniones y muestre algo de respeto a quienes las tienen.
zvikico
Hola zvikco. Gracias por el mensaje. Acepto que hay diferentes enfoques, pero me referí a pmd.sourceforge.io/pmd-4.3.0/rules/… . Saludos
Witold Kaczurba
2

También tengo curiosidad por conocer la respuesta a esta pregunta.

En el pasado, cuando trataba con una biblioteca de terceros como esa, lo que hacía era crear una clase contenedora o una clase secundaria que delegaba en la clase principal y realizaba mi depuración en la clase contenedora / secundaria. Sin embargo, requiere un trabajo extra.

DJ.
fuente
1
El problema con esta solución (aparte de la que anotó sobre el trabajo adicional) es que solo funciona si no tiene varias clases / métodos dentro de una biblioteca externa. Pero es útil cuando se trata de la capa externa de métodos.
RodeoClown
0

Una dificil. Mi experiencia, fuera de Eclipse, es que si necesita ver el valor de retorno, es mejor asignarlo a una variable local en la función para que la declaración de retorno sea simple return varname;y no return(some * expression || other);. Sin embargo, eso no es tremendamente útil para usted ya que dice que no puede (o no quiere) modificar o incluso recompilar el código. Entonces, no tengo una buena respuesta para usted, tal vez deba reconsiderar su requisito.

Jonathan Leffler
fuente
En mi código, generalmente tengo el paso intermedio para poder verificar el resultado, pero parte del código que estoy usando tiene demasiada sobrecarga organizativa para modificar (especialmente si la biblioteca se actualiza, realmente no quiero mantener una versión bifurcada solo para depurar).
RodeoClown
0

Dependiendo de la declaración de devolución, puede resaltar la expresión que se está devolviendo y, en el menú del botón derecho, debería haber algo como "evaluar expresión" (no tengo eclipse frente a mí ahora, pero es algo así ). Le mostrará lo que se le devolverá.

Stephmara
fuente
4
El problema es que cuando la evaluación de la función de devolución tiene efectos secundarios (como la creación de entradas en la base de datos, por ejemplo), la evaluación de la expresión de devolución cambiará el estado del sistema. Sin embargo, gracias por la sugerencia.
RodeoClown
0

Esto es un poco exagerado, pero como no parece haber una forma sencilla:

Puede usar AspectJ para instrumentar el JAR con aspectos que se apoderan del valor de retorno de los métodos que le interesan. De acuerdo con la documentación de Eclipse, los programas de AspectJ se pueden depurar como otros programas.

Hay dos opciones para tejer tus clases sin volver a compilar la biblioteca:

  • Tejido posterior a la compilación si el procesamiento del JAR binario es aceptable;

  • Tejido en tiempo de carga, que requiere la activación de un agente de tejido en la VM.

Consulte la documentación de eclipse (enlace anterior) y también la Guía del entorno de desarrollo de AspectJ .

Olivier
fuente