Posso descobrir o valor de retorno antes de retornar durante a depuração no Eclipse?

99

É possível ver o valor de retorno de um método depois que a linha foi executada e antes que o ponteiro de instrução retorne à função de chamada?

Estou depurando um código que não consigo modificar (leia-se: não quero recompilar uma biblioteca de terceiros) , e às vezes pula para o código que não tenho fonte ou a expressão de retorno tem efeitos colaterais que me impedem de ser capaz de apenas executar a expressão na guia Exibir .

Freqüentemente, o valor de retorno é usado em uma instrução composta e, portanto, a visualização Variáveis nunca me mostrará o valor (portanto, querendo ver o resultado antes que o controle retorne à função de chamada).

ATUALIZAÇÃO: não posso usar o visualizador de expressão, pois há efeitos colaterais na instrução.

RodeoClown
fonte
7
É por isso que mudei para a versão da comunidade do IntelliJ - o pessoal do Eclipse parece não entender como isso é importante. (Se eles consertarem, voltarei no dia do lançamento.)
@James Mitchell parece uma ótima ideia para um plugin. Vou adicioná-lo à minha lista de tarefas e tentarei fazê-lo quando tiver tempo (não em breve)
IAdapter
@ user672348 Mas como fazer isso no IntelliJ IDEA?
Alexey Tigarev
@AlexeyTigarev: IIRC, é apenas exibido quando você faz "Step Return" (ou equivalente).
Blaisorblade de
1
Prepare-se para Eclipse Oxygen (data de lançamento em meados de 2017). O marco M2 inclui esse recurso .
Abdull

Respostas:

36

Este recurso foi adicionado ao Eclipse versão 4.7 M2 no bug 40912 do Eclipse .

Para usá-lo:

  • passar por cima da returndeclaração (usando "Step Over" ou "Step Return")
  • agora, a primeira linha na visualização da variável mostrará o resultado da instrução de retorno, como "[instrução xxx] retornou:"

Consulte Eclipse Project Oxygen (4.7) M2 - Novo e notável para obter detalhes.

Sleske
fonte
Eu também. Sinto falta desse recurso ao usar o Eclipse.
m24p
1
Este bug do Eclipse foi posteriormente reaberto no final de 2009 . Ainda aguardando uma correção, porém, sem ninguém atribuído e nenhum Marco de destino. :)
Mark A. Fitzgerald
1
Isso foi corrigido nas compilações recentes do Eclipse 4.7 (M2 em diante)
AbdullahC
1
Algumas informações sobre como usar a correção podem ser encontradas em Novo e digno de nota para 4.7 M2. Procure "Resultado do método após operações de etapa" aqui: eclipse.org/eclipse/news/4.7/M2
Joshua Goldberg
@JoshuaGoldberg: Obrigado por apontar isso - eu editei na resposta.
sleske
34

Encontrou um atalho realmente bom para isso. Selecione a expressão que retorna o valor e pressione

Ctrl + Shift + D

Isso exibirá o valor da instrução de retorno. Isso é realmente útil nos casos em que você não pode ou não deseja alterar apenas para fins de depuração.

Espero que isto ajude.

Nota: Não testei isso com bibliotecas de terceiros, mas está funcionando bem para o meu código. Testei no Eclipse Java EE IDE para desenvolvedores da Web. Versão: Juno Service Release 1

Satish
fonte
4
+1 porque isso funciona não apenas para valores de retorno, mas para expressões em geral. Muito mais conveniente do que usar a guia de expressões. Deve-se observar que isso executa o código, portanto, se houver efeitos colaterais, cuidado. help.eclipse.org/indigo/…
cabra
1
Ctrl + Shift + Itambém foi útil para mim.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
2
como @goat mencionou, isso executa o código várias vezes; por exemplo, se a função fizesse isso return System.currentTimeMillis();, você obteria um resultado diferente do que a função realmente retornada!
Brad Parks
Equivalente em um Apple machine?
Adrien Be
Este é um conselho problemático - reavaliará a expressão, o que pode ser desastroso se tiver efeitos colaterais.
sleske
5

É por isso que sempre mantenho o seguinte padrão para métodos:

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

Minhas regras:

  1. Apenas uma instrução de retorno, apenas no final do método (finalmente permitida depois)
  2. Sempre tenha um resultado chamado local que contém o valor retornado, começando de um padrão.

Naturalmente, os getters mais triviais estão isentos.

Zvikico
fonte
3
Ei zvikico - quando estou trabalhando no meu próprio código, geralmente uso um padrão semelhante. Infelizmente, meu problema é quando estou usando um código que não foi escrito ou modificável por mim. : S
RodeoClown
Eu também faço isso, mas SonarLint está reclamando ... agora estou equivocado: stackoverflow.com/questions/31733811/…
HDave
@WitoldKaczurba essa é a sua opinião, e tudo bem. Apenas aceite que existem outras opiniões e mostre algum respeito por aqueles que as aceitam.
zvikico
Olá, zvikco. Obrigado pela mensagem. Aceito que existem abordagens diferentes, mas me referi a pmd.sourceforge.io/pmd-4.3.0/rules/… . Saúde
Witold Kaczurba de
2

Estou curioso para saber a resposta a essa pergunta também.

No passado, ao lidar com uma biblioteca de terceiros como essa, o que eu fazia era criar uma classe wrapper ou classe filha que delegava à classe pai e fazia minha depuração na classe wrapper / filha. Porém, é preciso um trabalho extra.

DJ.
fonte
1
O problema com esta solução (além da que você notou sobre trabalho extra) é que ela só funciona se você não tiver várias classes / métodos dentro de uma biblioteca externa. Mas é útil quando você está lidando com a camada externa de métodos.
RodeoClown
0

Uma difícil. Minha experiência, fora do Eclipse, é que se você precisar ver o valor de retorno, é melhor atribuí-lo a uma variável local na função para que a instrução de retorno seja simples return varname;e não return(some * expression || other);. No entanto, isso não é terrivelmente útil para você, pois você diz que não pode (ou não deseja) modificar ou mesmo recompilar o código. Portanto, não tenho uma boa resposta para você - talvez você precise reconsiderar sua exigência.

Jonathan Leffler
fonte
Em meu código, geralmente tenho a etapa intermediária para que possa verificar o resultado, mas alguns dos códigos que estou usando têm muita sobrecarga organizacional para modificar (especialmente se a biblioteca for atualizada, não quero realmente manter uma versão bifurcada apenas para depuração).
RodeoClown
0

Dependendo da instrução de retorno, você pode destacar a expressão que está sendo retornada e, no menu do botão direito, deve haver algo como "expressão de avaliação" (não tenho o eclipse diante de mim agora, mas é algo assim ) Ele irá mostrar o que será devolvido.

stephmara
fonte
4
O problema é que quando avaliar o recurso de retorno tem efeitos colaterais (como entradas de banco de dados sendo criadas, por exemplo), avaliar a expressão de retorno mudará o estado do sistema. Obrigado pela sugestão embora.
RodeoClown
0

Isso é um pouco rebuscado, mas como não parece haver uma maneira simples:

Você poderia usar AspectJ para instrumentar o JAR com aspectos que controlam o valor de retorno dos métodos nos quais você está interessado. De acordo com a documentação do Eclipse, os programas AspectJ podem ser depurados como outros programas.

Existem duas opções para tecer suas classes sem recompilar a biblioteca:

  • O entrelaçamento pós-compilação se o processamento do JAR binário for aceitável;

  • Tecelagem de tempo de carregamento, que requer a ativação de um agente de tecelagem na VM.

Consulte a documentação do eclipse (link acima) e também o AspectJ Development Environment Guide .

Olivier
fonte