【问题标题】:Eclipse: Inline breakpointsEclipse:内联断点
【发布时间】:2019-04-05 19:49:22
【问题描述】:

有没有办法在 Eclipse IDE 中设置内联断点(使用插件)?

例如,当在同一行中调用多个方法时,有没有办法为该行中的特定方法调用设置断点,而不是为整个行设置断点?

foo(bar(), baz());
           ^

(在这个例子中,可以在方法baz的定义处设置一个断点,但是如果它也被其他方法调用,那么如果你大部分时间都必须继续的话可能会很烦人.)

如果我理解正确,Java 调试接口将允许这样做,请参阅 Location#codeIndex()

【问题讨论】:

    标签: java eclipse debugging jdi


    【解决方案1】:
    foo(bar(), 
        baz());
    

    最简单的方法是在 baz() 之前进行换行并将断点正常放置在 baz() 所在的行上。在 Java 中,以这种方式用换行符包围方法调用不会影响其评估。

    screenshot from eclipse

    更新:

    OP 希望选择 baz 的调用并在该表达式本身的评估上设置一个断点,而不需要在断点或编辑源代码时添加任何额外条件。

    据我所知,Eclipse 附带的标准调试工具无法做到这一点。

    但是,您可以使用conditional breakpoints 实现此效果。在 Eclipse 中,您可以正常创建或选择断点,然后访问断点视图中的条件选项。

    通过菜单项 Window -> Show View -> Breakpoints 访问断点视图。在那里,选择或创建断点,然后检查条件选项。然后,您必须描述一个适合您周围代码和需求的条件。当条件为真时,您的断点将触发。例如,通过指定调用站点行号或方法名称。

    Breakpoints View in Eclipse, with conditionals enabled

    我的回答基于this SO answer

    在我自己的示例代码中,我有以下设置:

    a(){
      baz(); 
      m();
    }
    
    m(){
      foo(bar(), baz());
    }
    

    我的断点位于 baz() 中。添加条件语句

    Thread.currentThread().getStackTrace()[2].getMethodName().equals("m")
    

    到我的断点意味着它仅在从 m() 调用 baz() 时触发,而不是从 a() 调用。

    【讨论】:

    • 是的,谢谢,这会起作用,但在这种特定情况下,我希望不必为了更好地调试而更改源代码。
    • 您可以使用条件断点做您想做的事情。这是文档的link:通常,您转到菜单 Window-> Show View -> Breakpoints,在您的 foo(bar(), baz()) -line 或内部正常设置行断点baz(),并描述一个合适的条件来触发它。如果没有关于您的程序的更多信息,我不可能就条件向您提供进一步的建议。
    • 非常感谢。这些变通办法很好,但我正在寻找所描述问题的通用解决方案。因此,我没有要分享的特定代码,它可以适用于任何代码,但如果(目前)没有直接的解决方案,这对我来说也不是问题。
    • 让我确保我理解正确:您想选择 baz 的调用并在该表达式本身的评估上设置一个断点,而不在您的断点或编辑源代码上添加任何额外条件?据我所知,使用 Eclipse 附带的标准调试工具是不可能的。但是,您可以使用条件来做到这一点,并编写您的conditions against the surrounding code,例如,通过指定调用站点行号或方法名称。
    • 是的,这正是我想要的。我想您的解决方法已经足够接近了,您介意将其写在单独的答案中还是更新您现有的答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 2012-04-06
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多