ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

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

s
sleske

此功能已添加到 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:感谢您指出这一点-我将其编辑为答案。
S
Satish

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

Ctrl + Shift + D

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

希望这可以帮助。

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


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

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

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

我的规则:

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

当然,最琐碎的吸气剂是例外的。


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

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


D
DJ.

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

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


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

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

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


J
Jonathan Leffler

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


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

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


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

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

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

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

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

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

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