Posso descobrir o valor de retorno antes de retornar durante a depuração no Eclipse?
-
03-07-2019 - |
Pergunta
É possível ver o valor de retorno de um método após a linha foi executado e antes de o ponteiro de instrução retorna para a função de chamada?
Estou a depuração do código que não pode modificar (leia-se: não quero re-compilar uma biblioteca de terceiros) , e às vezes ele salta para código não tenho fonte ou a expressão de retorno tem efeitos secundários que parar de me ser capaz de simplesmente executar a expressão no Tela guia.
Muitas vezes, o valor de retorno é usado em uma instrução composta, e por isso o Variáveis ?? Vista nunca vai me mostrar o valor (daí querendo ver o resultado antes de o controle retorna para a função de chamada).
UPDATE:. Não consigo usar o visualizador de expressão, pois há efeitos colaterais na demonstração
Solução
Esta funcionalidade foi adicionada à versão Eclipse 4.7 M2 sob Eclipse bug 40912 .
Para usá-lo:
- passo sobre a declaração
return
(usando "Step Over" ou "Passo Return") - agora a primeira linha na exibição variável irá mostrar o resultado da instrução de retorno, como "[declaração xxx] retornado:"
Consulte Eclipse Projeto Oxigênio (4.7) M2 - Nova e Notável para mais detalhes.
Outras dicas
Encontrado um bom atalho para isso. Seleccione a expressão que retorna o valor e pressione
Ctrl + Shift + D
Isto irá exibir o valor da instrução de retorno. Isto é realmente útil em casos em que você não pode ou não quer mudar apenas para fins de depuração.
Espero que isso ajude.
Nota: não testei isso com bibliotecas de terceiros, mas ele está funcionando bem para o meu código. Testado isso em Eclipse Java EE IDE para desenvolvedores Web. Versão: Juno Service Release 1
Este é realmente um bug de longa data em Eclipse, que remonta desde os primeiros dias do IDE: https://bugs.eclipse.org/bugs/show_bug.cgi?id=40912
É por isso que eu sempre ficar com o seguinte padrão para métodos:
MyReturnedType foo() {
MyReturnedType result = null;
// do your stuff, modify the result or not
return result;
}
As minhas regras:
- Apenas uma instrução de retorno, apenas no final do método (finalmente permitiu depois dela)
- Sempre tem um chamado resultado local que detém o valor retornado, a partir de um padrão.
Naturalmente, a maioria dos getters triviais estão isentos.
Estou curioso sobre a aprender a resposta a esta questão também.
No passado, quando se lida com biblioteca parte 3 como aquele, o que eu fiz é criar uma classe de invólucro ou classe filha que delegado para a classe pai e fazer o meu depuração na classe wrapper / criança. É preciso trabalho extra embora.
"Agora, quando você retornar de um método, no método superior, na visão variável que mostra o valor de retorno da chamada anteriormente acabado" [1]
difícil. A minha experiência, fora do Eclipse, é que se você pode precisar para ver o valor de retorno, é melhor para atribuir a uma variável local na função para que a instrução de retorno é um return varname;
simples e não return(some * expression || other);
. No entanto, isso não é terrivelmente útil para você desde que você dizer que você não pode (ou não quer) modificar ou mesmo recompilar o código. Então, eu não tenho uma boa resposta para você -. Talvez você precisa reconsiderar sua exigência
Dependendo da instrução de retorno, você pode destacar a expressão que está sendo devolvido a partir do menu do botão direito, deve haver algo como "avaliar a expressão" (Eu não tenho eclipse na minha frente agora, mas é algo parecido). Ela vai mostrar o que vai ser devolvido.
Este é um pouco exagerado, mas como não parece ser uma maneira simples:
Você pode usar AspectJ para instrumentar o JAR com aspectos que se apossar do valor de retorno dos métodos que você está em interessado De acordo com a documentação do Eclipse, programas AspectJ pode ser Debugged como outros programas.
Existem duas opções para tecer suas aulas sem recompilar a biblioteca:
-
tecelagem Post-compilação se processar a JAR binário é aceitável;
-
tecelagem de tempo de carga, o 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 Guia ambiente .