我可以在Eclipse中进行调试时在返回之前找出返回值吗?


99

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

我正在调试无法修改的代码(阅读:不想重新编译第三方库),有时它会跳转到我没有源代码的代码,或者return表达式有副作用,使我无法只需在“ 显示”标签中运行表达式即可。

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

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


7
这就是为什么我切换到IntelliJ的社区版本的原因-Eclipse的人们似乎并不了解这有多么重要。(如果他们修复了该问题,我将在发布之日改回它。)

@James Mitchell,对于插件来说,这似乎是个好主意。我将其添加到待办事项列表中,并在我发现时间(不久之后)时尝试执行此操作
IAdapter 2011年

@ user672348但是如何在IntelliJ IDEA中做到这一点?
阿列克谢·蒂加列夫

@AlexeyTigarev:IIRC,它仅在您执行“ Step Return”(或等效步骤)时显示。
Blaisorblade

1
为Eclipse Oxygen做好准备(2017年中发布日期)。M2里程碑具有此功能
阿卜杜勒

Answers:


36

此功能已添加到Eclipse错误40912下的Eclipse 4.7 M2版本中。

要使用它:

  • 跳过return语句(使用“ Step Over”或“ Step Return”)
  • 现在,变量视图的第一行将显示return语句的结果,如“ [statement xxx]返回:”

有关详细信息,请参阅Eclipse Project Oxygen(4.7)M2-新功能和值得注意的功能。


我也是。使用Eclipse时,我错过了此功能。
m24p 2014年

1
此Eclipse错误随后在2009年末重新开放。但是,仍在等待修复,没有分配任何人,也没有目标里程碑。:)
马克·A·菲茨杰拉德

1
在Eclipse 4.7的最新版本(从M2开始)中已解决此问题
AbdullahC

1
有关如何使用此修复程序的某些信息,可以在4.7 M2的“新增功能”中找到。在此处查找“步骤操作后的方法结果”:eclipse.org/eclipse/news/4.7/M2
Joshua Goldberg'Mar

@JoshuaGoldberg:感谢您指出这一点-我将其编辑为答案。
sleske '19

34

找到了一个非常好的快捷方式。选择返回值的表达式,然后按

Ctrl + Shift + D

这将显示return语句的值。在您不能或不想仅出于调试目的而进行更改的情况下,这确实很有用。

希望这可以帮助。

注意:尚未使用第三方库对此进行测试,但是对于我的代码而言,它运行良好。在针对Web开发人员的Eclipse Java EE IDE上进行了测试。版本:Juno Service Release 1


4
+1是因为这不仅适用于返回值,而且通常适用于表达式。比使用表达式选项卡方便得多。应当注意,这将执行代码,因此,如果有副作用,请当心。help.eclipse.org/indigo/…–
山羊

1
Ctrl + Shift + I对我也有帮助
Ciro Santilli郝海东冠状病六四事件法轮功2015年

2
正如@goat所提到的,这将多次执行代码,因此例如,如果函数执行了this return System.currentTimeMillis();,那么您将获得与实际返回的函数不同的结果!
布莱德·帕克斯

等效于Apple machine
阿德里安Be

这是有问题的建议-这将重新评估表达式,如果它具有副作用,则可能是灾难性的。
sleske '19


5

这就是为什么我始终坚持使用以下方法模式的原因:

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

我的规则:

  1. 仅一个return语句,仅在方法的末尾(最终允许在它之后)
  2. 始终有一个本地调用的结果,该结果保存从默认值开始的返回值。

自然,最琐碎的吸气剂是免税的。


3
嘿zvikico-当我编写自己的代码时,通常使用类似的模式。不幸的是,我的问题是当我使用的代码不是由我编写或修改时。:S
RodeoClown

我也这样做,但是SonarLint在抱怨...。现在我在模棱两可: stackoverflow.com/questions/31733811/…–
HDave

@WitoldKaczurba,这是您的意见,这很好。只是接受还有其他意见,并向那些这样做的人表示尊重。
zvikico

嗨zvikco。感谢您的留言。我接受有不同的方法,但是我提到了pmd.sourceforge.io/pmd-4.3.0/rules/…。干杯
Witold Kaczurba

2

我也很想知道这个问题的答案。

过去,像这样处理第三方库时,我要做的是创建一个包装类或子类,委托给父类,然后在包装子类中进行调试。但是,这需要额外的工作。


1
该解决方案的问题(除了您提到的有关额外工作的问题)是,仅当您在外部库中没有多个类/方法时,该解决方案才有效。但是在处理方法的外层时很有用。
RodeoClown


0

坚强的。我在Eclipse之外的经验是,如果您可能需要查看返回值,则最好将其分配给函数中的局部变量,这样return语句将变得简单return varname;而不是return(some * expression || other);。但是,这对您没有明显的帮助,因为您说您不能(或不想)修改甚至重新编译代码。因此,我对您没有一个好的答案-也许您需要重新考虑您的要求。


在我的代码中,我通常有一个中间步骤,因此我可以检查结果,但是我正在使用的某些代码具有太多的组织开销,无法修改(特别是如果库已更新,则实际上并不想维护派生的版本仅用于调试)。
RodeoClown

0

根据return语句,您可以突出显示要返回的表达式,然后从右键单击菜单中选择“ evaluate expression”(评估表达式)之类的东西(我现在没有先见之明,但是就像这样) )。它会告诉您将要退还什么。


4
问题是,当评估返回功能有副作用(例如正在创建数据库条目)时,评估返回表达式将改变系统状态。(还是)感谢你的建议。
RodeoClown

0

这有点牵强,但似乎没有一种简单的方法:

您可以使用AspectJ来利用具有您感兴趣的方法的返回值的方面来对JAR进行检测。根据Eclipse的文档,可以像其他程序一样调试 AspectJ 程序。

有两种方法可以编织类而不重新编译库:

  • 如果可以接受二进制JAR,则进行编译后编织;

  • 加载时编织,这需要在VM中激活编织代理。

请参阅Eclipse文档(上面的链接),以及《AspectJ开发环境指南》

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.