我试图在反编译代码中设置一个条件断点,但Eclipse一直给我错误:
条件断点有编译错误
原因:评估必须包含一个表达式或一组格式正确的结构
我的情况非常简单,只是尝试与字符串值进行比较。我已经尝试了以下所有内容,每一个都出错:
myObj.toString() == "abc123"
myObj.toString().equals("abc123")
if(myObj.toString() == "abc123"){ return true; }
true == true
我还尝试过在行尾添加或不使用分号的每种组合,以及间距和换行符的每种组合以及包含或不包含{}的每种组合。基本上,我不知道为什么这不起作用......
我试图调试的代码在一个用JD-Eclipse反编译的jar中。正常断点在此代码中正常工作。
有谁知道这里发生了什么?
答案 0 :(得分:3)
此Eclipse FAQ页面包含正确的CBP定义的语法以及它们无法工作的最常见原因。在您的情况下,我认为以下情况适用:
如果在类文件不包含局部变量表的类中设置断点,则会发生这种情况。例如,假设您要在Class.forName(String)上设置条件断点。如果您有rt.jar的源附件,则内容辅助将允许您通过其变量名className引用该参数。但是,在调试运行时,只有在类文件包含局部变量表时才会知道变量名称。根据编译时使用的选项,可能已从类文件中删除此信息。
JD可能在反编译jar时编造了变量名,因此在条件表达式中使用“myObj”会产生编译时错误。
答案 1 :(得分:2)
也许条件断点比一般工作要少。例如,考虑一下:
答案 2 :(得分:1)
这可能是日食中的一个错误。 eclipse所做的是将一个新方法或类似方法编织到您设置断点的文件的源代码中并进行编译。如果在这个过程中出现问题,你的条件断点将会神秘地失败。
您可以按照我在下面使用的方法,在调试中运行eclipse以尝试追踪问题: -
答案 3 :(得分:0)
只是添加了可能对其他人有帮助的东西,因为我刚刚解决了这个问题。当我遇到这个问题时,我也在使用JD-Eclipse进行调试。
确保所有必需的jar文件都在Classpath中。您的条件语句可能非常简单,例如“return true”;但是一旦检查了“条件断点”复选框,它可能是(我也不能确定)Eclipse调试器将检查Eclipse项目的类路径是否针对较大的范围而不仅仅是“返回true”行。
由于我使用的是JD-Eclipse,因此我没有费心添加所有必需的jar文件。我在项目的类路径
中添加了jar文件后问题得以解决如果您正在使用远程调试,您还可以尝试进行配置,以便Eclipse项目的JDK与目标JVM的JRE兼容。