【问题标题】:Eclipse debugging "source not found"Eclipse 调试“找不到源”
【发布时间】:2010-12-29 22:20:14
【问题描述】:

我刚开始使用 Eclipse,所以请放轻松 ;)。但是,当尝试调试 JUnit 测试用例时,我得到一个对话框,指出当我在测试方法的代码中到达这一行时找不到源:

Assert.assertEquals(1, contents.size());

我知道我可能应该去尝试从某个地方下载源代码,但我真的不想这样做,因为我对进入 JUnit 代码没有兴趣。我有 JUnit 运行时 jar,那么为什么 Eclipse 期望我拥有所有引用的工具源代码来调试我自己的代码(似乎有点傻)?

我的主要问题是,当源不可用时,我如何告诉 Eclipse 跳过此对话框并允许我继续调试自己的代码?

[编辑]

我已经隔离了造成这种情况的原因。当内部 JUnit 代码抛出异常时,Eclipse 似乎认为它需要源代码。一般来说,有没有办法告诉它它没有,而是让它抛出某种错误对话框?

【问题讨论】:

  • 我认为在 junit 方法上导航时应该使用“跳过”,否则 Eclipse 将无法警告您没有来源。在这种情况下,您可以继续“步入”contents.size(),但在实际进入 Assert.assertEquals 之前,请改为按“步入”。
  • 这正是我正在做的——使用 step-over (f6),当 JUnit 代码抛出异常时,它仍然会弹出这个源代码对话框。
  • 嗯,我无法在我的 Eclipse 环境中观察到您的情况。您使用哪个版本?另外,您是使用 Eclipse 内部的 junit 库,还是提供外部的、您自己的 junit.jar 文件?
  • 我使用内置 JUnit 4.7 的 Eclipse 3.4.2。
  • 只有一件事我不太明白,Eclipse 已经捆绑了 Junit 源代码......不知道为什么它一开始就找不到源代码。另外,当您说“内部 JUnit 代码引发异常”时,是指未满足 assertEquals 条件还是发生了实际错误?

标签: java eclipse debugging


【解决方案1】:

我有这个非常烦人的问题很长一段时间,但终于能够解决它。在我的例子中,在 Java 的 Transformer.IsRuntimeCode(ProtectionDomain) 函数中某处抛出了一个空指针异常。

我真的不需要知道这一点,因为异常正在被捕获和处理,但是每次发生这种情况时 eclipse 都会暂停调试并告诉我源不可用。结果,我不得不不断按下按钮来继续执行代码。

为了防止这种情况发生,我:

  1. 单击“断点”窗口 在调试的底部 屏幕
  2. 右键单击“NullPointerException”
  3. 未选中“捕获”

这可以防止调试器在捕获 NullPointerException 期间暂停程序流。


(来源:SharpDetail.com

【讨论】:

    【解决方案2】:

    调试调用堆栈会在抛出异常时显示 JUnit 源代码行。
    但是,如果您没有 JUnit 的源代码,则无需担心。

    如果您返回调用堆栈中的一行,您应该会看到导致 JUnit 异常的行(您的源代码)。
    这应该足以调试您的代码。


    要将源代码与 JUnit 关联,您可以在项目的库中添加 junit.jar,并将 junit-x.y.z-src.jar 关联到 junit-x.y.z.jarlike so

    这将在您的项目的.classpath 中生成如下行:

    <classpathentry kind="lib" path="junit-x.y.z.jar" sourcepath="junit-x.y.z-src.jar">
    

    注意:实际上,junit[...].jar 文件的完整路径在此 classpathentry 行中。但您也可以使用Linked resources 来避免.classpath 文件中的固定值(完整路径)。

    【讨论】:

    • 谢谢,这很有帮助,但它并没有解决 Eclipse 的问题,以及为什么它觉得需要询问源代码。我能够用 Hibernate 重现同样的行为,它引发了一个内部异常,并且 Eclipse 再次请求源。我觉得我在 IDE 配置中遗漏了一些非常简单的东西。
    • 为您的努力+1。但是我使用的下一个库呢?假设我并不总是有来源然后呢?似乎 IDE 应该有一个规定,如果它不存在,就不要尝试请求它。
    • @James:我明白你的意思,并且不认为有一个 Eclipse 选项可以使其询问来源。但同样,您通常只需要关注您的代码,而不是您没有源代码的库。或者你有这些资源并且可以很容易地将它们与所述库关联起来。
    【解决方案3】:

    使用 Step Filter 避免单步执行 ...junit... 包。右键单击堆栈跟踪并选择过滤包。您可能必须先使用使用步进过滤器打开过滤。 ~~~

    【讨论】:

      【解决方案4】:

      我在另一个 jar 中遇到了类似的问题,即使我指向源它会再次要求它。我可以通过在 ANT 上使用 debug="on" 编译 jar 来解决它。

      【讨论】:

        【解决方案5】:

        我遇到了类似的问题。我通过右键单击包资源管理器中的项目文件夹并选择刷新来修复它。代码源与调试器不同步,这更正了它。不再出现 Transformer.IsRuntimeCode(ProtectionDomain) Source not found 消息。

        【讨论】:

          【解决方案6】:

          在单独的行上计算 contents.size() 或在方法上设置断点。

          还要注意 Eclipse 中的 junit 视图允许您导航堆栈跟踪。

          【讨论】:

            猜你喜欢
            • 2012-07-04
            • 1970-01-01
            • 2011-09-04
            • 2014-02-03
            • 1970-01-01
            • 1970-01-01
            • 2011-12-04
            相关资源
            最近更新 更多