2012-04-20 41 views
7

我想成立反编译的代码条件断点,但是Eclipse不断给我的错误:Eclipse的条件断点破碎?

Conditional breakpoint has compilation error(s)

Reason: Evaluations must contain either an expression or a block of well-formed statments

我的情况很简单,只是想以比较的字符串值。我已经尝试了所有的以下的和我得到的错误与每一个:

myObj.toString() == "abc123" 
myObj.toString().equals("abc123") 
if(myObj.toString() == "abc123"){ return true; } 
true == true 

我也试过有或在路线的结尾没有分号的每个组合,每个组合间距和换行符以及每个组合都有或没有围绕我的条件{}。基本上,我不知道为什么这不起作用...

我试图通过调试通过的代码是在一个用JD-Eclipse反编译的jar中。此代码中的正常断点工作正常。

有谁知道这里发生了什么?

+0

您是否从反编译的源代码重新编译了该jar,否则代码将与该jar无法匹配局部变量名称 – vickirk 2012-04-20 15:31:46

+0

嗯,但我得到一个不同的错误,说当我尝试使用源中不存在的变量名称时,变量名称是错误的... – kand 2012-04-20 15:41:40

+0

第一步是弄清楚反编译是否是问题。在Eclipse项目的“普通”代码中设置条件断点是否工作? – sharakan 2012-04-20 16:35:44

回答

2

Eclipse FAQ页面包含正确的CBP定义的语法和他们不工作的最常见原因。在你的情况,我觉得有以下应用:当你的反编译罐子,所以在条件表达式中使用“MyObj中”产生一个编译时错误

This can happen if you are setting a breakpoint in a class whose class file does not contain a local variable table. For example, let's say you want to set a conditional breakpoint on Class.forName(String). If you have a source attachment for rt.jar the content assist will allow you to refer to the argument by its variable name, className. However, at debug runtime, the variable name will only be known if the class file contains a local variable table. Depending on the options used at compilation time, this information may have been stripped from the class file.

JD可能已经制造变量名。

+2

听起来很有希望,但OP显然尝试真正==真,即使变量应该工作名字被破坏! – sharakan 2012-04-20 16:11:04

+0

@sharakan你是对的!真奇怪。不知道true == true是什么原因。 – mazaneicha 2012-04-20 16:29:59

+0

@mazaneicha在FAQ页面上似乎没有任何内容。有什么方法可以实际查看为我的课程文件生成的表格吗? – kand 2012-04-20 17:40:46

1

这可能是在Eclipse中的错误。 eclipse所做的是在你设置断点的文件的源代码中编织一个新的方法或其他方法,并编译它。如果在这个过程中出现问题,你的条件断点将会神秘失败。

你可以按照我在下面使用,调试运行Eclipse,试图追踪问题的办法: -

https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232#c21

0

在“真正的==真”条件,你应该只需要添加回报情况声明:

return true == true; 

对于其余缺少局部变量表的问题应该是解释。 +1给Mazaneicha。

0

在“真正的==真”条件,你应该只需要添加return语句的情况:

return true == true; 

对于缺少局部变量表应该是说明问题的其余部分。 +1给Mazaneicha。

如果你想用它的名字来指代一个方法参数,然后只是尝试将名称更改为“为arg0”,“ARG1”等

举例来说,你可以这样做:

arg0 == null 

很容易猜出变量名。只需放置非预定的断点,并在Variables视图中查看变量列表。

0

只要加上一些可以帮助别人的东西,因为我在一段时间后才解决了这个问题。当我遇到这个问题时,我也在使用JD-Eclipse进行调试。

确保所有必需的jar文件都在Classpath中。你的条件陈述可能非常简单,比如“return true”;但是一旦“条件断点”复选框被选中,它可能是(我不能确定)Eclipse调试器将检查Eclipse项目的类路径对比较大的范围,而不仅仅是“返回true”行。

因为我使用的是JD-Eclipse,所以我并不打算添加所有必需的jar文件。在项目的类路径中添加jar文件后问题解决了

如果您正在使用远程调试,您还可以尝试进行配置,以便您的Eclipse项目的JDK与目标JVM的JRE兼容。