在为变量分配某个值时中断

时间:2010-02-17 05:05:09

标签: java eclipse debugging jdb

我希望jdb(我通过Eclipse调试器使用)在为变量赋值时中断。 我不想在某个特定的行设置断点,而是更普遍。

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

这样的事情是否可以实现?

5 个答案:

答案 0 :(得分:32)

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

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

  1. 打开调试器透视图并选择'BreakPoints'标签

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

  3. 然后返回'断点'标签,右键点击新添加的条目,然后选择'断点属性'

    < / LI>
  4. 设置应激活它的条件

  5. alt text

答案 1 :(得分:9)

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

答案 2 :(得分:9)

修改The ticket I've linked in this answer已标记为已验证/已修复。它已被整合到最新的Oxygen版本as detailed in the release notes中。我将在下面留下我的原始答案,因为它有很多关于JDI和JDT如何在Eclipse中协同工作的有用信息。


我将从你的问题的最终答案开始,所以如果你不想,你不必阅读细节。基本上,这是有可能的,但有很多问题必须首先回答。如果你想跳过它并直接去票,here you go,但我建议你继续阅读。

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

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

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

  1. 局部变量永远不会一致,因为可以从多种方法访问该字段,
  2. 调用访问的类的成员变量永远不会一致,因为可以从多个类访问该字段,
  3. 执行上下文中可用的导入类永远不会出现与(2)和
  4. 相同的原因
  5. 字段本身的访问永远不会一致,因为它可能需要使用实例,类名super或类似MyClass.this.myField的内容进行限定(对于内部类访问)。
  6. 这种功能的可行性有限。你很难真正评估一个观察点的不变条件语句,因为执行上下文中的任何内容都不会保持一致。这意味着无法轻松地解析和解释代码,而无需对代码片段应用特殊含义,例如:

      

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

    这使事情变得非常复杂,特别是在已经相对复杂的系统中。可以找到条件断点代码的示例here(使用Ctrl + F搜索getEvaluationEngine)。现在接受它并根据一组规则添加对表达式的预处理,这些规则关于我们在哪里以及字段在哪里,并且做事情可能变得复杂。

    AFAIK,你不能做类似的事情,“如果旧/新值是这样,暂停”,因为这些信息根本无法从堆栈框架中获得的信息中获得(因此来自调试器) )。分配给该值的表达式已在命中观察点的时间内进行评估,但其结果对调试器不可用,因此观察点本身的评估程序无法使用它。必须首先执行步骤才能执行赋值,然后必须在步骤之后计算表达式。它太可怕了,老实说,相当狡猾。

    在任何情况下,如果您想表达对此功能的支持,您可以使用this Eclipse ticket。然而,它自2005年以来一直存在(截至目前为8年),并且社区的支持有限。 TBH,我认为它没有走得太远,特别是没有更多地澄清这种功能要求背后的期望,并且没有先考虑一些主要的设计考虑。

答案 3 :(得分:5)

是的,这些被称为观察点,观察点可以有观看表达式

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

上下文菜单可以选择添加监视表达式编辑监视表达式

答案 4 :(得分:0)

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

您的问题也是特定的调试库。可能还有其他方法可以实现您的需求。搜索论坛以了解开发人员是如何做到的。