在 Eclipse 中进行调试时,是否可以在返回之前找到返回值?

是否可以在运行该行之后和指令指针返回到调用函数之前查看方法的返回值?

我正在调试代码,我不能修改 (读: 不想重新编译第三方库),有时它跳转到代码,我没有源代码或返回表达式有副作用,阻止我能够只运行表达式在 展示选项卡。

返回值通常在复合语句中使用,因此 变量视图永远不会向我显示该值(因此希望在控件返回到调用函数之前看到结果)。

更新: 我不能使用表达式查看器,因为语句中存在副作用。

26212 次浏览

Tough one. My experience, outside of Eclipse, is that if you might need to see the return value, it is best to assign it to a local variable in the function so that the return statement is a simple return varname; and not return(some * expression || other);. However, that's not dreadfully helpful to you since you say you can't (or don't want to) modify or even recompile the code. So, I don't have a good answer for you - perhaps you need to reconsider your requirement.

Depending on the return statement, you can highlight the expression that is being returned and from the right-click menu, there should be something like "evaluate expression" (I don't have eclipse in front of me now, but it's something like that). It will show you what is going to be returned.

I am curious about to learn the answer to this question also.

In the past, when dealing with 3rd party library like that, what I did is to create a wrapper class or child class that delegate to the parent class and do my debugging in the wrapper/child class. It takes extra work though.

That's why I always stick with the following pattern for methods:

MyReturnedType foo() {
MyReturnedType   result = null;


// do your stuff, modify the result or not


return result;
}

My rules:

  1. Only one return statement, only at the end of the method (finally allowed after it)
  2. Always have a local called result which holds the returned value, starting from a default.

Naturally, the most trivial getters are exempt.

This feature was added to Eclipse version 4.7 M2 under Eclipse bug 40912.

To use it:

  • step over the return statement (using "Step Over" or "Step Return")
  • now the first line in the variable view will show the result of the return statement, as "[statement xxx] returned: "

See Eclipse Project Oxygen (4.7) M2 - New and Noteworthy for details.

This is a bit far-fetched, but as there doesn't seem to be a simple way:

You could use AspectJ to instrument the JAR with aspects that get hold of the return value of the methods you're interested in. According to Eclipse's documentation, AspectJ programs can be debugged like other programs.

There are two options to weave your classes without recompiling the library :

  • Post-compile weaving if processing the binary JAR is acceptable;

  • Load-time weaving, which requires activating a weaving agent in the VM.

See the eclipse documentation (link above) and also the AspectJ Development Environment Guide.

This is actually a long standing bug in Eclipse, dating back from the very first days of the IDE: https://bugs.eclipse.org/bugs/show_bug.cgi?id=40912

Found a really good shortcut for this. Select the expression which returns the value and press

Ctrl + Shift + D

This will display the value of the return statement. This is really helpful in cases where you can't or don't want to change just for debugging purpose.

Hope this helps.

Note: Have not tested this with third party libraries, but it is working fine for my code. Tested this on Eclipse Java EE IDE for Web Developers. Version: Juno Service Release 1

"Now when you return from a method, in the upper method, in the variable view it shows the return value of the previously finished call" [1]

[1] https://coffeeorientedprogramming.wordpress.com/2016/09/23/eclipse-see-return-value-during-debugging/

For @Daniel Meyer answer's to work, ensure that 'Show method result after a step operation (if supported by the VM; may be slow)' is checked. The option is accessible via;

Windows> Preferences> Java> Debug> Show method result......