【问题标题】:Eclipse Conditional Breakpoints Broken?Eclipse 条件断点损坏?
【发布时间】:2012-05-02 04:34:22
【问题描述】:

我试图在反编译的代码中设置条件断点,但 Eclipse 一直给我错误:

条件断点有编译错误

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

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

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

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

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

有人知道这里发生了什么吗???

【问题讨论】:

  • 你是不是从反编译的源重新编译了jar,否则代码将与jar不匹配,例如局部变量名
  • 嗯,但是当我尝试使用源中不存在的变量名时,我得到一个不同的错误,说变量名错误...
  • 第一步是弄清楚反编译是否是问题所在。在 Eclipse 项目的“正常”代码中设置条件断点是否有效?
  • 所以是的,条件断点似乎在我的正常代码中工作......一定是反编译代码的东西......
  • 我有日志消息说明输出特定文本。然而,当我使用该值的条件断点进行调试时 - 断点永远不会发生 - 使用 F11 调试。没什么。随时给我 Visual Studio 来处理这种事情!

标签: java eclipse debugging breakpoints decompiler


【解决方案1】:

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

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

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

【讨论】:

  • 听起来很有希望,但 OP 显然尝试了 true == true,即使变量名被损坏也应该可以工作!
  • @sharakan 你是对的!那很奇怪。不确定 true==true 有什么问题。
  • @mazaneicha 该常见问题页面上似乎没有任何内容。有什么方法可以让我真正看到为我的类文件生成的表格吗?
  • @kand 我修复了链接('?' 需要将 url 编码为 %3F),请立即尝试。至于本地 var 表 - 您在调试器的“变量”视图中看到的内容。
  • 嗯,如果是这样的话,Eclipse 似乎所有变量/变量名称都是正确的......
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    如果是 "true == true" 条件,您只需添加 return 语句:

    return true == true;
    

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

    【讨论】:

      【解决方案5】:

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

      return true == true;
      

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

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

      例如,您可以这样做:

      arg0 == null
      

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

      【讨论】:

        【解决方案6】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2012-05-08
          • 2011-11-09
          • 2023-04-07
          • 2015-08-23
          • 1970-01-01
          • 2013-03-09
          • 1970-01-01
          • 1970-01-01
          • 2021-03-30
          相关资源
          最近更新 更多