在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 中调试时,我可以在返回之前找出返回值吗?