eclipse 当变量被赋值时中断

jbose2ul  于 2023-03-01  发布在  Eclipse
关注(0)|答案(5)|浏览(213)

我希望jdb(我通过Eclipse调试器使用)在变量赋值时中断,我对在某个特定行设置断点不感兴趣,而是更一般地设置断点。
例如,每次x == null时中断。
这样的事情能够实现吗?

oymdgrw7

oymdgrw71#

是-您需要设置的是**“条件断点”-这使您能够在达到应用程序的某个状态时停止程序执行并单步执行调试器。
因此,假设您希望在满足某个条件时跳转到执行中的某个特定点(如所附图像所示),您可以按如下方式执行:
1.
打开调试器透视图并选择
“断点”选项卡
1.在代码文件中添加一个新的断点-在您希望观察程序执行的适当位置
1.然后返回到
“断点”选项卡,右键单击新添加的条目,并选择“断点属性”**
1.设置激活它的条件

(来源:ibm.com

wkftcu5l

wkftcu5l2#

Field Modification Watchpoints非常接近,它们仅限于放置在对象的字段上(而不是局部变量、参数或表达式),并且在写入字段时触发,但这是Eclipse所拥有的最接近您所需的方法。

kg7wmglp

kg7wmglp3#

EditThe ticket I've linked in this answer已经被标记为verified/fixed。它已经被集成到最新的Oxygen版本中,详细信息请参见发行说明。我将在下面留下我最初的答案,因为它包含了很多关于JDI和JDT如何在Eclipse中协同工作的有用信息。

我将从您问题的最终答案开始,因此如果您不想阅读详细信息,则不必阅读。基本上,这是可能的,但必须首先回答许多问题。如果您想跳过此部分,直接阅读票证here you go,但我建议您继续阅读。
Eclipse使用JDI(该页的最底部)向JVM注册观察点。(实现是由JVM本身提供的,而不是Eclipse),这些方法创建了观察点,即EventRequstManager.createModificationWatchpointRequest。(注意,这不是反射Field类)。所以简而言之,Eclipse不能直接通过Java来实现它。不用担心,Java也不处理条件断点。那些也是直接通过Eclipse来实现的,而不是依赖于Java。有,然而,有些警告使得条件观察点比条件断点更难实现。
让我们考虑一下普通的条件断点。为了使它们工作,你需要一个上下文来执行代码片段。如果没有代码的执行上下文,我们就无法计算代码片段中的表达式/语句,因为我们无法解析变量、值、类型。这是使用AST解析器完成的,它将Java代码处理成实际的指令。请记住,您可以在一个条件中键入许多语句,而不仅仅是一个表达式,求值器在解析表达式之后使用上下文(具体地说,是IJavaStackFrame)对表达式本身求值。
现在考虑一个条件观察点,因为最后一点非常重要。什么是观察点的执行上下文?变量访问不仅可以发生在同一个类中,而且可以发生在其他类中(想想protected和包成员),也可以发生在内部类中(通过MyClass.this.myField)。这意味着:
1.局部变量从不一致因为可以从多个方法访问字段,
1.从其调用访问的类的成员变量从不一致因为可以从多个类访问该字段,
1.由于与(2)相同的原因,在执行上下文中可用的导入类从不一致,以及
1.对字段本身的访问从来都不是一致的,因为它可能需要用示例、类名、super或用类似MyClass.this.myField的东西(用于内部类访问)来限定。
这样一个特性的可行性是有限的。你很难为一个观察点实际计算一个不变的条件语句,因为执行上下文中绝对没有什么是一致的。这意味着如果不对代码片段应用特殊的含义,代码就不能被轻松地解析和解释,比如:
myField始终与this.myFieldsuper.myFieldMyClass.myFieldMyClass.this.myField相同,具体取决于访问字段的位置。
这使事情变得相当复杂,特别是在一个已经相对复杂的系统中。条件断点代码的一个例子可以在here(使用Ctrl+F搜索getEvaluationEngine)中找到。现在,基于一组关于我们在哪里以及字段在哪里的规则,添加对表达式的预处理,这样做会变得复杂。
当然,你不能这样做,“如果旧的/新的值是这个,暂停”,因为你不能从堆栈帧中得到这个信息被赋值的表达式在命中观察点时已经被求值,但是其结果对调试器不可用,因此,它对观察点本身的求值器是不可用的。必须首先执行一个步骤来执行赋值,然后在该步骤之后对表达式求值。这将是非常混乱的,老实说,相当笨拙。
在任何情况下,如果你想表达你对这个特性的支持,你可以使用this Eclipse ticket。然而,它从2005年就已经出现了(到现在为止已经8年了),并且从社区得到的支持有限。TBH,我不认为它会走得很远,特别是在没有对这种特性请求背后的期望进行更多澄清的情况下,以及在没有首先考虑到它背后的一些主要设计因素的情况下。

baubqpgj

baubqpgj4#

是的,这些被称为 * 观察点 *,观察点可以有 * 观察表达式 *。
根据版本等的不同,您可以通过在Outline视图中选择一个变量并右键单击它,或者在Variables视图中控制/单击它来完成此操作。
上下文菜单将包含“添加监视表达式”和“编辑监视表达式”选项。

06odsfpq

06odsfpq5#

对不起,在Eclipse中没有办法做你想做的事情。你需要的是一个带有断点条件表达式的观察点。Eclipse中不存在。
你的问题也是特定的调试库。可能有其他的方法来达到你的需要。搜索论坛看看开发人员如何做。

相关问题