我可以在Intellij中调试时返回返回值吗?

Kyl*_*yle 111 java groovy intellij-idea

附:

Object method(){
    ...
    return /* some complex expression */
}
Run Code Online (Sandbox Code Playgroud)

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

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

注意:这是同一个问题,我可以在Visual Studio中调试时返回返回值,但是对于intellij.

Bir*_*abs 134

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

IntelliJ IDEA 2016.3

使用调试器来破坏你希望看到的返回值的函数内部.

步入功能

退出该功能(或跨步直到你逃脱):

走出去

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

观察返回值

  • 伟大的!我们是否也可以使用条件断点来解决这个问题?用例是在函数返回之前停止,具体取决于其返回值。 (3认同)
  • 我们是否可以在不实际离开我们将要返回的方法的范围的情况下使其工作?在这个例子中,我指的是 `Test#test()` 的范围。那么我可以检查该方法中使用的其他可能用于计算结果的变量吗?由于 `Test#rand()` 可能产生的副作用,我不想调用 `rand()` 两次(一次是为了观看内容,一次是在实际返回时)。 (3认同)
  • @Stan我已经更新了我的答案以提供一个有用的例子. (2认同)

Cra*_*der 37

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

监视方法返回值:单击此按钮可以查看上次执行的方法的返回值.

watch方法返回值

IDEA 12配置:

IDEA 12

  • @CrazyCoder:IDEA 13的这个功能是否仍然存在?我找不到它了. (4认同)
  • 它显示"变量"窗格中的返回值(使用完全限定的方法名称).这应该是公认的答案.来自我的@CrazyCoder +1 :-) (3认同)
  • 在2017年1月(想法2016.3.2):您必须单击设置图标(齿轮,在第二个图像上的黄色菜单项的正上方),一个菜单显示包括"显示方法返回值".无需重新启动任何内容:在从方法返回后,其ObjectClassName.methodName()出现在__this__下面的Variables视图中. (3认同)
  • 似乎没有任何内容出现在"变量"或"手表"选项卡中.如果重要的话,我正在使用Groovy.此外,这似乎将显示从调用代码的上下文执行的最后一个方法的返回值,而不是从方法本身的上下文.这个的重要区别在于,如果您可以从方法本身的上下文中看到它,您还可以查看方法的局部变量的值.如果方法返回的值不正确,这可以让您看到出了什么问题. (2认同)

jlu*_*ick 29

似乎有几种方法可以做到这一点.第一个涉及在方法签名上设置断点,在您的情况下,您将在Object方法(){上设置断点.这将允许您观察方法的入口和出口.我相信你必须将它与上面提到的" Watch方法返回值"一起使用,但是由于计算时间太长,我无法完全测试它.请注意,这会极大地降低调试器的性能,并且调试时间会更长.

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

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

注意:如果你创建一个断点,你可以告诉IDEA很多事情,比如你在断点上断点,你可以告诉他们执行一个表达并记录它.如果右键单击断点并单击属性,则可以查看可以执行的操作.

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

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

请记住,方法断点较慢,因此可能需要更多时间,如果您注意到太多的性能损失,通过设置return语句断点(没有方法断点)然后添加方法断点,这是一种难以改进的方法AFTER return语句的断点,然后继续.

希望这可以帮助,

  • 至少从2016.3开始,就有了更好的方法。详情请参阅 Birchlabs 的回答。现在应该是公认的答案。 (3认同)
  • 如果我正确理解这一点,那么这里提出的解决方案仅在表达式没有副作用时才有效。一般来说,我绝对不建议在变量/观察窗口中放置复杂的表达式。 (2认同)

归档时间:

查看次数:

26166 次

最近记录:

7 年,2 月 前