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

Posted

技术标签:

【中文标题】在Eclipse中调试时,我可以在返回之前找出返回值吗?【英文标题】:Can I find out the return value before returning while debugging in Eclipse? 【发布时间】:2010-09-18 01:01:39 【问题描述】:

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

我正在调试我无法修改的代码(阅读:不想重新编译第三方库),有时它会跳转到我没有源代码的代码或return 表达式有副作用,使我无法在 Display 选项卡中运行表达式。

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

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

【问题讨论】:

这就是我切换到 IntelliJ 社区版的原因——Eclipse 的人似乎不明白这有多重要。 (如果他们修复它,我会在它发布的那一天切换回来。) @James Mitchell 这看起来是一个很棒的插件创意。我会将它添加到我的待办事项列表中,并会在我找到时间时尝试执行(不会很快) @user672348 但是如何在 IntelliJ IDEA 中做到这一点? @AlexeyTigarev:IIRC,它只是在您执行“Step Return”(或等效)时显示。 为 Eclipse Oxygen(2017 年中发布日期)做好准备。 The M2 milestone includes this feature. 【参考方案1】:

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

使用它:

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

详情请见Eclipse Project Oxygen (4.7) M2 - New and Noteworthy。

【讨论】:

我也是。我在使用 Eclipse 时错过了这个功能。 这个 Eclipse 错误随后是 reopened in late 2009。不过,仍在等待修复,没有分配任何人,也没有目标里程碑。 :) 这已在最近的 Eclipse 4.7(M2 及以上版本)版本中得到修复 有关如何使用该修复程序的一些信息可以在 4.7 M2 的 New And Noteworthy 中找到。在此处查找“步骤操作后的方法结果”:eclipse.org/eclipse/news/4.7/M2 @JoshuaGoldberg:感谢您指出这一点 - 我将其编辑为答案。【参考方案2】:

为此找到了一个非常好的捷径。 选择返回值的表达式并按

Ctrl + Shift + D

这将显示返回语句的值。这在您不能或不想仅出于调试目的进行更改的情况下非常有用。

希望这会有所帮助。

注意:尚未使用第三方库对此进行测试,但它适用于我的代码。 在 Eclipse Java EE IDE for Web Developers 上对此进行了测试。版本:Juno Service Release 1

【讨论】:

+1 因为这不仅适用于返回值,也适用于一般的表达式。比使用表达式选项卡方便得多。应该注意的是,这会执行代码,所以如果它有副作用,请小心。 help.eclipse.org/indigo/… Ctrl + Shift + I 对我也有帮助。 正如@goat 提到的,这会多次执行代码,例如,如果函数执行此return System.currentTimeMillis();,那么您将得到与实际返回的函数不同的结果! 等价于Apple machine ? 这是有问题的建议 - 这将重新评估表达式,如果它有副作用,这可能是灾难性的。【参考方案3】:

这实际上是 Eclipse 中一个长期存在的错误,可以追溯到 IDE 的最初几天:https://bugs.eclipse.org/bugs/show_bug.cgi?id=40912

【讨论】:

【参考方案4】:

这就是为什么我总是坚持以下方法模式:

MyReturnedType foo() 
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;

我的规则:

    只有一个return语句,只在方法的最后(最后允许在它之后) 总是有一个本地调用的结果,它保存返回的值,从默认值开始。

当然,最琐碎的吸气剂是豁免的。

【讨论】:

嘿 zvikico - 当我编写自己的代码时,我通常使用类似的模式。不幸的是,我的问题是当我使用不是我编写或修改的代码时。 :S 我也这样做,但 SonarLint 抱怨......现在我模棱两可:***.com/questions/31733811/… @WitoldKaczurba 这是你的意见,没关系。接受有其他意见,并对提出意见的人表示尊重。 嗨zvikco。感谢您的留言。我接受有不同的方法,但我提到了 pmd.sourceforge.io/pmd-4.3.0/rules/… 。干杯【参考方案5】:

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

过去,在处理这样的 3rd 方库时,我所做的是创建一个包装类或子类,委托给父类并在包装/子类中进行调试。不过这需要额外的工作。

【讨论】:

这个解决方案的问题(除了你提到的额外工作之外)是它只有在你不是在外部库中的多个类/方法时才有效。但在处理外层方法时它很有用。【参考方案6】:

“现在当你从一个方法返回时,在上面的方法中,在变量视图中它会显示之前完成的调用的返回值”[1]

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

【讨论】:

【参考方案7】:

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

【讨论】:

在我的代码中,我通常有中间步骤,所以我可以检查结果,但是我正在使用的一些代码有太多的组织开销来修改(尤其是如果库得到更新,不要' t 真的想维护一个仅用于调试的分叉版本)。【参考方案8】:

根据 return 语句,您可以突出显示正在返回的表达式,并且从右键菜单中,应该有类似“评估表达式”的内容(我现在没有 eclipse,但它是类似的东西)。它将向您显示将要返回的内容。

【讨论】:

问题是当评估返回特性有副作用时(例如创建数据库条目),评估返回表达式会改变系统状态。不过感谢您的建议。【参考方案9】:

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

您可以使用 AspectJ 对 JAR 进行检测,其中包含获取您感兴趣的方法的返回值的方面。根据 Eclipse 的文档,AspectJ 程序可以像其他程序一样debugged。

有两个选项可以在不重新编译库的情况下编织您的类:

如果处理二进制 JAR 是可接受的,则进行编译后编织;

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

请参阅 eclipse 文档(上面的链接)以及 AspectJ Development Environment Guide。

【讨论】:

以上是关于在Eclipse中调试时,我可以在返回之前找出返回值吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 中调试时,我可以在返回之前找出返回值吗?

在eclipse中调试时实时更改变量?

是否可以像在 VS 中拖动箭头一样在 java eclipse 调试器中“返回”

方法返回值在 Eclipse 调试器中不可见

eclipse如何返回上一步代码处?

为啥在调试没有断点的访问区域时使用eclipse?