当variables被分配一些值时中断
我想要jdb(我通过Eclipsedebugging器使用)打破当一个variables分配一些价值。 我不想在一些特定的行中设置断点,而是更一般地设置断点。
例如,每次打破x == null。
这样的事情是可以实现的吗?
是的 – 您需要设置的是“条件断点” – 这可以让您停止程序执行,并在达到特定状态时跳过debugging器。
所以,假设你想在特定条件满足的情况下跳到执行的特定点(如附图所示),你可以这样做:
-
打开你的debugging器视angular并select“BreakPoints”选项卡
-
在代码文件中添加一个新的BreakPoint – 在想要观察程序执行的适当位置
-
然后返回到“断点”选项卡,右键单击新添加的条目,然后select“断点属性”
-
设置应激活的条件
你可以近场修改观察点 。 它们被限制在被放置在对象(不是局部variables,参数或expression式)的字段上,并且只要字段被写入就被触发,但是它是最接近你想要的。
我要从你的问题的最终答案开始,所以如果你不想要,你不必阅读细节。 基本上,这是可能的,但有很多问题需要先回答。 如果你想跳过这一步,直接去售票, 在这里 ,但我build议你阅读。
Eclipse使用JDI (该页面的底部)向JVM注册观察点。 这是通过EventRequestManager
方法完成的(实现由JVM本身提供,而不是Eclipse)创build观察点,即EventRequstManager.createModificationWatchpointRequest
。 这些方法唯一接受的是一个Field
(注意,这不是reflection的Field
类)。 所以简而言之,Eclipse不能直接通过Java来完成。 不要担心,Java也不处理条件断点。 这些也是通过Eclipse直接实现的,而不是依赖于Java。 但是,有一些警告使得有条件的观察点比有条件的断点难以实现。
让我们考虑简单的条件断点。 为了让他们工作,你需要一个你可以执行代码片段的上下文。 没有代码的执行上下文,我们无法评估片段中的expression式/语句,因为我们没有办法parsingvariables,值,types等。这是通过ASTparsing器完成的,该parsing器将Java代码处理成实际的指令。 请记住,您可以将多个语句键入一个条件,而不仅仅是一个expression式。 然后评估器使用一个上下文(具体来说就是一个IJavaStackFrame
)来parsingexpression式本身。
现在想一下有条件的观察点,因为最后一点非常重要。 什么是观察点的执行上下文? variables访问不仅可以发生在同一个类中,而且也可以发生在其他类(认为protected
和包成员)以及内部类中(通过MyClass.this.myField
)。 这意味着:
- 局部variables永远不会一致,因为可以从多个方法访问该字段,
- 从中调用访问类的成员variables永远不会一致,因为该字段可以从多个类访问,
- 在执行上下文中可用的导入类是不一致的,原因与(2)和
- 字段本身的访问是不一致的,因为它可能需要用实例,类名,
super
类或像MyClass.this.myField
(用于内部类访问)的资格。
这种function的可行性是有限的。 由于在执行上下文中没有任何内容会一致,所以你很难真正评估一个观察点的不变条件语句。 这意味着如果没有特别的意义应用于代码片段,代码不能被轻易地parsing和解释,例如:
myField
始终与this.myField
或super.myField
或MyClass.myField
或MyClass.this.myField
,具体取决于字段被访问的位置。
这使事情变得相当复杂,尤其是在一个已经相对复杂的系统中。 条件断点代码的例子可以在这里find(使用Ctrl + FsearchgetEvaluationEngine
)。 现在,接下来,根据一系列有关我们在哪里和在哪里的规则,对expression式进行预处理,而且做事可能变得复杂。
AFAIK,你不能做这样的事情,“如果旧的/新的值是这个,暂停”,因为这个信息根本就不能从你可以在堆栈帧(从debugging器)获得的信息中获得。 被分配给该值的expression式在观察点被击中的时候已经被评估,但是其结果对于debugging器是不可用的,因此观察点本身不能被评估者使用。 必须首先执行一个步骤才能执行分配,然后必须在该步骤之后评估expression式。 这会非常麻烦,老实说,这很可笑。
无论如何,如果你想expression对这个特性的支持,你可以使用这个Eclipse票证 。 然而,自2005年以来(现在是8年),社区的支持有限。 TBH,我不认为它走得太远,特别是没有更多的这种function要求背后的期望的澄清,没有一些重要的devise考虑首先落后。
是的,这些被称为观察点 ,观察点可以有观察expression式 。
根据版本等,您可以通过在“大纲”视图中select一个variables并右键单击该variables或在“variables”视图中控制/单击该variables来执行此操作。
上下文菜单将具有添加监视expression式和编辑监视expression式的选项 。
对不起,但在Eclipse中没有办法做到你想要的。 你需要的是一个具有断点条件expression式的观察点。 它在Eclipse中不存在。
你的问题也是具体debugging一个库。 可能还有其他方法来实现你所需要的。 search论坛,看看开发人员如何做到这一点。