Debugging 使用IntelliJ IDEA在Groovy中调试迭代(闭包)

Debugging 使用IntelliJ IDEA在Groovy中调试迭代(闭包),debugging,groovy,intellij-idea,closures,iteration,Debugging,Groovy,Intellij Idea,Closures,Iteration,我有一个混合Java和Groovy代码的代码库。对于Groovy代码中的迭代,我们倾向于使用闭包: String[] strings = ["First", "Second", "Third"] strings.each { string -> println string } 当我在IntelliJ IDEA(第11节)中通过一次单步执行一行来调试时,在字符串中执行的代码将被单步执行。each()(即println string)。我可以在println行中设置一个断点,并可以

我有一个混合Java和Groovy代码的代码库。对于Groovy代码中的迭代,我们倾向于使用闭包:

String[] strings = ["First", "Second", "Third"]
strings.each { string ->
    println string
}
当我在IntelliJ IDEA(第11节)中通过一次单步执行一行来调试时,在
字符串中执行的代码将被单步执行。each()
(即
println string
)。我可以在
println
行中设置一个断点,并可以对其进行调试,但这是一个可以避免的小解决方法

有没有办法将intelliJ配置为不跳过Groovy闭包?文件->设置->调试器->Groovy中没有适用的选项

编辑:

为了澄清我希望intelliJ做什么:

假设我有一个Java风格的迭代,如下所示:

for (String string : strings) {
    println string
}
如果我使用“单步执行”,调试器将毫无问题地进入迭代。我可以继续“跳过”循环,直到没有更多的对象可以迭代为止。这就是我对上述闭包的期望


在一个或两个闭包的情况下,手动设置断点可能不是问题。但是如果有很多,那么“自动”进入它们将是非常好的。

我完全同意IntelliJ中需要更好的闭包调试支持,因为您要求做的事情并不总是像它应该做的那样简单,而不会跳过一些障碍

正如您所发现的,您可以在
println
行上放置一个断点,这通常会让您在闭包中中断(但并不总是)。一旦有了断点,IntelliJ就有了一个非常强大的条件断点系统,它可以让您更好地控制何时中断


我发现另一个有用的方法是将这些闭包中的所有内容都放入闭包调用的方法中,而不是将代码直接放入闭包中。这不会太多地改变运行时的行为,而且我发现它给了我更多的控制权。这通常也是我需要重构的一个迹象,因为深入研究代码已经太痛苦了。

你是在“逐步深入”吗?(F7快捷方式)@Nebelmann如果我“进入”,我必须一步一步地遍历设置迭代的整个Groovy类堆栈。我最终进入了环路,但要到达那里还是有很多麻烦。恐怕你无能为力,然后。。。据我所知,
每一个
都是一个闭包,因此如果你跳过它,就会跳过整个函数,如果你介入,你将不得不处理大量的“噪音”,就像在Java中,当你想要进入一个SpringBean方法调用并最终进入代理时。。。在闭包的第一行设置断点是我知道的唯一解决方案。编辑:我刚刚发现了IntelliJ的
调试器>单步执行
选项,它可以防止您与groovy的内部构件发生冲突。。。值得一试:)真可惜。由于intelliJ与Groovy配合得非常好,我希望默认行为是进入闭包。但是我明白你的意思了,谢谢。内伯曼是正确的,一步一步地跳过一个方法调用(这是每个方法,或者任何其他方法的闭包),而不进入内部。如果您有设置| Debugger | Groovy |不单步执行特定的Groovy方法,那么单步执行可能会将您直接转移到闭包,也可能不会,具体取决于您的Groovy版本。Groovy运行时无法很好地使用步进过滤器:。另请参阅,谢谢你的建议,它们很有帮助。不过,将“闭包代码”移动到方法中并不能真正帮助我。我真正想要的是进入闭包,就像进入Java循环一样。我同意。希望IntelliJ开发者能看到这篇文章,并在即将发布的版本中将其作为高优先级功能添加。我知道他们看到堆栈溢出,我知道我和一大堆不同的人处理过这个问题。