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


126

带有:

Object method(){
    ...
    return /* some complex expression */
}

有没有办法查看调试时将返回的值?就像以某种方式设置一个断点,该断点将在返回之后立即执行,但是在执行转到调用代码之前执行?我希望能够知道返回值是什么,也能够看到所有局部变量的值是什么。

我现在的方法是制作一个临时变量:Object ret = /* something complex */; return ret;。但这很麻烦,还增加了不必要的代码行。

注意:这与在Visual Studio中在调试时返回之前是否可以找到返回值是一个相同的问题,但适用于intellij。

Answers:


31

似乎有几种方法可以做到这一点。第一个涉及在方法签名上设置断点,在这种情况下,您将在Object method(){上设置断点。这将使您注意该方法的进入和退出。我相信您必须将其与如上所述的“ Watch方法返回值”结合使用,但是由于计算时间太长,因此我无法完全测试它。请注意,这确实会大大降低调试器的性能,并且调试时间会更长。

您也可以手动执行以下操作。

  1. 在返回行上设置断点。
  2. 当点击返回行时,单击返回行,将光标专门放在要查看的操作上,然后转到Run-> Evaluate Expression(或Alt-F8),它将在该点运行表达式,然后返回它返回的内容。

注意:如果创建一个断点,您可以告诉IDEA很多事情来处理它们,例如,如果您在断点处中断,您可以告诉他们执行一个表达式并将其记录下来。如果右键单击断点并单击属性,则可以查看周围的情况。

更新:与第一种方法一起尝试此操作。不要使用“监视方法返回值”,因为它会减慢或冻结调试会话。而是执行以下操作

  1. 右键单击要查看的返回表达式,然后单击“添加到手表”
  2. 接下来,添加一个如上所述的方法断点。
  3. 调试程序,您的方法将在方法签名上中断。
  4. 按F9键继续,它应该在计算返回表达式之后再次中断,并且您的返回表达式应该在watch列中。

请记住,方法断点速度较慢,因此可能需要更多时间,如果您注意到过多的性能损失,则可以通过以下方法轻松解决此问题:仅设置return语句断点(不包含方法断点),然后添加方法断点AFTER return语句的断点,然后继续。

希望这可以帮助,


1
实际上,一旦向(new X())添加了一个断点和一个监视,就可以对该监视执行简单的Alt + F8键来“分析”返回的对象。这真的很有用。
Kedar Mhaswade 2014年

如果我正确理解这一点,则此处提出的解决方案仅在表达式没有副作用的情况下才有效。我绝对不建议一般将复杂的表达式放在变量/监视窗口中。
Mashmagar

从至少2016.3开始,还有更好的方法。有关详细信息,请参见Birchlabs的答案。现在应该是公认的答案。
Mikezx6r

150

在IntelliJ IDEA 2016.3上:它隐藏在调试面板的cog按钮内。确保Show Method Return Values检查

IntelliJ IDEA 2016.3“显示方法返回值”

使用调试器可以在函数内部某个地方中断,您希望看到其返回值。

进入功能

走出函数(或单步执行,直到你逃脱):

走出去

观察到返回值出现在变量中:

观察返回值


3
@Stan我已经更新了答案以提供一个可行的示例。
Birchlabs

40

调试器面板中Watch方法返回值按钮。

监视方法返回值:单击此按钮可以监视最后执行的方法的返回值。

监视方法的返回值

IDEA 12配置:

理念12


2
“变量”或“监视”选项卡中似乎没有任何显示。如果那很重要,我正在使用Groovy。同样,这似乎将显示从调用代码的上下文而不是从方法本身的上下文执行的最后一个方法的返回值。这样做的重要区别在于,如果您可以从方法本身的上下文中看到它,那么您还可以查看该方法的局部变量的值。如果该方法返回的值不正确,这可以让您查看出了什么问题。
凯尔

3
它在“变量”窗格中显示返回值(使用完全限定的方法名称)。这应该是公认的答案。@CrazyCoder +1 from me :-)
Omri Spector

4
@CrazyCoder:IDEA 13仍然存在此功能吗?我找不到它了。
kevinarpe 2014年

1
我在Intellij 15上,也看不到。您可以发布屏幕截图吗?
Sanjiv Jivan,2015年

3
在2017年1月(Idea 2016.3.2):您必须单击“设置”图标(齿轮,在第二幅图像的黄色菜单项的正上方),然后显示一个包含“显示方法返回值”的菜单。无需重新启动任何东西:从方法中下次返回后,其ObjectClassName.methodName()出现在this下方的Variables视图中。
18446744073709551615 '17

1

之前有人问过这个问题,但是当我想处理这种情况时,我使用了另一种方法。

调试时,您可以标记表达式(在您的情况下,在“返回”之后的表达式),然后按CTRL + ALT + F8(快速评估表达式)。IntelliJ将弹出一个小窗口,向您显示将返回的值。


2
如果使用Intel图形芯片,则此键盘快捷键将关闭辅助监视器

1
Linux用户:Ctrl + Alt + F8-将用户发送到第二个GUI终端。在Ubuntu中,我按Ctrl + Alt + F2返回。
Dmitriy Pavlukhin,
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.