41

我希望 jdb(我通过 Eclipse 调试器使用)在为变量分配某个值时中断。我对在某个特定行设置断点不感兴趣,而是更普遍地设置断点。

例如,每次 x == null 时都中断。

这样的事情可以实现吗?

4

5 回答 5

40

是的 - 您需要设置一个“条件断点” - 这使您能够在达到应用程序的某个状态时停止程序执行并逐步执行调试器。

因此,假设您想在满足特定条件时跳到执行中的特定点(根据所附图像),您可以按如下方式执行此操作:

  1. 打开您的调试器透视图并选择“BreakPoints”选项卡

  2. 在代码文件中添加一个新的 BreakPoint - 在您想观察程序执行的适当位置

  3. 然后回到“断点”选项卡,右键单击新添加的条目,然后选择“断点属性”

  4. 设置它应该被激活的条件

替代文字

于 2010-02-20T17:11:11.750 回答
10

您可以使用Field Modification Watchpoints非常接近。它们仅限于放置在对象的字段上(不是局部变量、参数或表达式),并且只要写入字段就会触发它们,但它是 Eclipse 最接近您想要的。

于 2013-04-29T07:41:20.620 回答
9

编辑我在这个答案中链接的票已被标记为已验证/已修复。如发行说明中所述,它已集成到最新的 Oxygen 版本中。我将在下面留下我原来的答案,因为它有很多关于 JDI 和 JDT 如何在 Eclipse 中协同工作的有用信息。


我将从您问题的最终答案开始,因此如果您不想阅读详细信息,则不必阅读。基本上,这是可能的,但有很多问题需要首先回答。如果你想跳过那个直接去买票,给你,但我建议你继续阅读。

Eclipse 使用JDI(该页面的最底部)向 JVM 注册观察点。这是通过EventRequestManager创建观察点的方法(实现由 JVM 本身提供,而不是 Eclipse)完成的,即EventRequstManager.createModificationWatchpointRequest. 这些方法唯一接受的是 a Field(请注意,这不是反射Field类)。所以简而言之,Eclipse不能直接通过Java来做。不用担心,Java 也不处理条件断点。这些也是通过 Eclipse 直接实现的,而不是依赖于 Java。然而,有一些注意事项使得条件观察点比条件断点更难实现。

让我们考虑简单的条件断点。为了让它们工作,您需要一个可以在其中执行代码片段的上下文。如果没有代码的执行上下文,我们无法评估代码片段中的表达式/语句,因为我们无法解析变量、值、类型等。这是使用AST解析器完成的,该解析器将 Java 代码处理为实际指令. 请记住,您可以在条件中键入多个语句,而不仅仅是单个表达式。然后,评估器在解析表达式后使用上下文(特别是 an IJavaStackFrame)来评估表达式本身。

现在考虑一个条件观察点,因为最后一点非常重要。什么是观察点的执行上下文?变量访问不仅可以发生在同一个类中,还可以发生在其他类(thinkprotected和 package 成员)中,也可以发生在内部类中(via MyClass.this.myField)。这意味着:

  1. 局部变量永远不会一致,因为可以从多种方法访问该字段,
  2. 调用访问的类的成员变量永远不会一致,因为可以从多个类访问该字段,
  3. 由于与 (2) 相同的原因,在执行上下文中可用的导入类永远不会一致,并且
  4. 字段本身的访问永远不会一致,因为它可能需要使用实例、类名super或类似的东西MyClass.this.myField(用于内部类访问)进行限定。

这种功能的可行性是有限的。您将很难实际评估观察点的不变条件语句,因为执行上下文中绝对没有任何内容是一致的。这意味着如果没有对代码片段应用特殊含义,就无法轻松解析和解释代码,例如:

myField始终与this.myFieldorsuper.myFieldMyClass.myFieldor相同MyClass.this.myField,具体取决于访问字段的位置。

这使事情变得相当复杂,尤其是在一个已经相对复杂的系统中。可以在此处getEvaluationEngine找到条件断点代码的示例(使用 Ctrl+F搜索)。现在接受它并根据一组关于我们在哪里和字段在哪里的规则对表达式进行预处理,并且做事可能会变得复杂。

AFAIK,你不能做类似“如果旧/新值是这个,暂停”之类的事情,因为这些信息根本无法从堆栈帧中获得的信息中获得(因此也无法从调试器中获得)。分配给该值的表达式已按观察点被命中的时间进行评估,但其结果对调试器不可用,因此它对观察点本身的评估器不可用。必须首先执行一个步骤来执行分配,然后必须在该步骤之后评估表达式。这将是非常混乱的,老实说,相当老实。

无论如何,如果你想表达你对这个特性的支持,你可以使用这张 Eclipse 票。然而,它自 2005 年以来(截至目前 8 年)就已经存在,并且社区的支持有限。TBH,我认为它不会走得太远,特别是没有更多地澄清这种功能请求背后的期望,也没有首先考虑一些主要的设计考虑。

于 2013-05-01T04:18:53.523 回答
5

是的,那些叫做观察点,观察点可以有观察表达式

根据版本等,您可以通过在大纲视图中选择一个变量并右键单击它来执行此操作,或者在变量视图中,控制/单击它。

上下文菜单将包含Add Watch ExpressionEdit Watch Expression的选项。

于 2010-02-17T05:23:07.017 回答
0

抱歉,没有办法在 Eclipse 中做你想做的事。您需要的是带有断点条件表达式的观察点。它在 Eclipse 中不存在。

您的问题也是具体调试库。可能还有其他方法可以实现您所需要的。在论坛上搜索以了解开发人员如何做到这一点。

于 2013-04-29T06:45:00.250 回答