10

我正在尝试在反编译代码中设置条件断点,但 Eclipse 不断给我错误:

条件断点有编译错误

原因:评估必须包含一个表达式或一组格式良好的语句

我的情况很简单,只是试图与字符串值进行比较。我已经尝试了以下所有方法,但每一个都出现错误:

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

我还尝试了在行尾有或没有分号的每种组合,以及间距和换行符的每种组合,以及在我的条件周围有或没有 {} 的每种组合。基本上,我不知道为什么这不起作用......

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

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

4

6 回答 6

4

这个Eclipse FAQ页面包含正确 CBP 定义的语法以及它们不起作用的最常见原因。在您的情况下,我认为以下适用:

如果您在类文件不包含局部变量表的类中设置断点,则可能会发生这种情况。例如,假设您要在 Class.forName(String) 上设置条件断点。如果您有 rt.jar 的源附件,则内容辅助将允许您通过变量名 className 来引用参数。但是,在调试运行时,只有在类文件包含局部变量表时才能知道变量名。根据编译时使用的选项,此信息可能已从类文件中删除。

JD 可能在反编译您的 jar 时伪造了变量名,因此在条件表达式中使用“myObj”会产生编译时错误。

于 2012-04-20T15:27:26.530 回答
2

也许条件断点不如一般工作。例如,考虑:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=278146

于 2012-04-27T16:04:10.143 回答
1

这可能是eclipse中的错误。eclipse 所做的是将新方法或类似方法编织到您设置断点的文件的源代码中并编译它。如果在此过程中出现问题,您的条件断点将神秘地失败。

您可以按照我在下面使用的方法,在调试中运行 eclipse 来尝试追踪问题:-

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

于 2013-01-02T08:55:02.107 回答
1

如果出现“true == true”条件,您只需添加 return 语句:

return true == true;

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

于 2015-11-23T23:34:52.143 回答
1

如果出现“true == true”条件,您只需添加 return 语句:

return true == true;

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

如果您尝试通过名称引用方法参数,则只需尝试将名称更改为“arg0”、“arg1”等。

例如,您可以这样做:

arg0 == null

很容易猜到变量名。只需放置无条件断点并在“变量”视图中查看变量列表。

于 2015-11-23T23:43:17.407 回答
0

只是添加一些可能对其他人有帮助的东西,因为我在一段时间后刚刚解决了这个问题。当我遇到这个问题时,我也在使用 JD-Eclipse 进行调试。

确保所有必要的 jar 文件都在 Classpath 中。你的条件语句可能很简单,比如“return true”;但是一旦选中了“条件断点”复选框,则可能是(我也不能确定)Eclipse 调试器将针对更大范围检查 Eclipse 项目的类路径,而不仅仅是“返回真”行。

由于我使用的是 JD-Eclipse,所以我没有费心添加所有必要的 jar 文件。我在项目的类路径中添加了jar文件后问题解决了

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

于 2018-02-02T06:48:09.950 回答