【问题标题】:Why does my Eclipse project have phantom debugger breakpoints?为什么我的 Eclipse 项目有幻像调试器断点?
【发布时间】:2010-10-17 21:58:43
【问题描述】:

我有一个小项目,当在 Eclipse 调试器中运行时,它似乎总是停在 FileInputStream.class 的第 106 行,打开文件。没有设置断点,但 Eclipse 的行为就像我在这里设置了断点一样。如果我清除所有断点,它仍然会发生。

我在同一个 Eclipse 工作区中有第二个更大的项目,它没有遇到这个问题。

我刚刚将较小的项目从我的旧 Linux 机器上移出,我在 Europa Eclipse 中开发它并遇到了这个问题,到我的新 Windows 机器上,我继续在 Ganymede Eclipse 中看到问题。该问题在操作系统和 Eclipse 版本中仍然存在,但显然不是跨项目。我不明白!我浏览了该项目目录中的每个文件,但找不到任何可能以某种方式指示 Eclipse 在 FileInputStream 中停止的文件。

更多信息:明显的断点实际上不是 FileInputStream 的第 106 行;它似乎是 FileNotFoundException 的异常断点,是从 FileInputStream 中的该行调用的本机代码抛出的。但同样,我似乎根本没有设置任何断点。异常断点是否定义在其他地方?

【问题讨论】:

  • 我自己也想知道那个,我经常发现自己在断点处停下来,我可以发誓我已经删除了。
  • 刚刚根据要求添加了一些关于“暂停任何未捕获的异常”功能的解释

标签: eclipse debugging breakpoints


【解决方案1】:

您是否尝试取消选择

Window > Preferences > Java > Debug : Suspend execution on uncaught exceptions

? (例如mentioned in this thread

为什么 Eclipse 会这样工作?

goes back to 2002,当断点对象层次结构被剥离时。

为了设置断点,使用旧 API,客户端需要 Java 模型对象 - 例如 ITypeIField 等。
使用新的 API,调试模型只需要类型名称、字段名称等。

这允许客户端在 Java 模型对象不可用时设置断点。
客户端现在指定与断点关联的资源(在我们将其限制为关联的 Java 模型资源之前)。

断点现在也可以“隐藏”。也就是说,它们不需要向断点管理器注册。
断点也可以选择性地保留(标记只允许保留所有/不保留标记类型)。
这使调试模型更加灵活,并为客户端提供了更多构建块。

这也简化了我们的 Java 调试实现的某些部分 - 例如,特性“suspend on any uncaught exception”只是为名为“java.lang.Throwable”的类型设置断点,而不是特定的IType在特定项目中
断点未向断点管理器注册(即隐藏) - 只有一个客户端知道和使用它
另一个例子是“run to line breakpoint”。 IJavaRunToLineBreakpoint 已被删除,因为不再需要其特殊功能。现在,Java 调试 ui 只是创建了一个隐藏的、非持久化的、命中计数为 1 的“行断点”。这是向客户端提供构建块的示例。

【讨论】:

  • 它有助于检测那些未被您的代码捕获的未经检查的运行时异常。
  • 我遇到了同样的行为,我没有取消选中“暂停执行 uhncaught 异常”。我更喜欢选中该选项,但我想知道发生了哪个异常,我怎么知道?
  • @HAL9000 如果您选中该选项,您不应该看到发生了哪个异常吗? “我遇到了同样的行为”,你的意思是你有“幻影”断点吗?
  • 是的,我的意思是幻象断点。有时,在某一行中,会触发一个幻像断点。但是,LogCat 和 Console 都没有提及异常。而且代码似乎没有异常,然后我想知道在哪里寻找异常消息。
  • @HAL9000 可能因为清理不当而破坏了带有调试信息的旧构建代码?如果您从 Eclipse 工作区中删除您的项目,将源代码复制到别处并将该项目从复制的源代码重新导入到您的 Eclipse 工作区,您能否重现该问题?
【解决方案2】:

我遇到了类似的问题,但接受的解决方案对我不起作用。我正在做 Eclipse Android 开发并设置了一些断点,后来又取消了它们。即使我禁用了它们,Eclipse 仍然在这些幻像断点处停止执行。我的解决方案是打开断点窗口:

窗口 > 显示视图 > 其他...

调试 > 断点

然后右键单击任意断点并选择“全部删除”

不幸的是,您必须重置所有有效断点,但这对我有用,并且避免了很多焦虑和挫败感。

一些指导他人的图片:

【讨论】:

  • 谢谢,马克。这有帮助。但是我并没有全部删除,只是找到了造成麻烦的那个。
  • 谢谢马克!为我工作,但就像上面的那个人一样,我只是删除了我需要的那个。令人沮丧的是,注册的断点甚至没有显示在侧边栏的编辑器视图中。在这种情况下,它们确实是“幻象”点。
  • 我可能找到了与您的解决方法相关的问题的解决方案。下次发生这种情况时,请尝试以下我的解决方案。
  • 2020 年我们仍然遭受这个可怕的错误,真是太遗憾了。请注意,该问题已超过 11 年。每次我编辑任何源文件时,我都必须删除所有断点。这会导致整个 IDE 无法使用。
【解决方案3】:

对于那些不认为其他解决方案有用的人,我找到了解决问题的个人解决方案。我使用一个 .jar 库,该库是通过在工作区中构建另一个项目而生成的。如果我在 .java 中将断点设置到库项目中,那么在调试最终项目时将触发断点。然而,当调试器暂停执行时.class 文件显示它有它自己的断点,因此设置到 .java 文件中的断点在这里没有显示!

解决方案: 为了删除断点,您必须将断点删除到库项目中的 .java 文件中。

【讨论】:

    【解决方案4】:

    我遇到了一个问题,即源文件具有不存在的断点的持久标记。我尝试清理项目,进行完整构建,重新启动 Eclipse - 没有任何效果。

    我浏览了 Eclipse 元数据,并找到了项目的 .markers 文件。删除该文件最终解决了这个问题。

    对于遇到此问题的其他人,请打开您的工作区目录,然后导航到 .metadata/.plugins/org.eclipse.core.resources/.projects/您的项目,然后重命名/删除文件 .markers。

    例如,如果您的工作区文件夹是 ~/workspace,并且您的项目名为 Foo,您可以这样做:

    $ mv ~/workspace/.metadata/.plugins/org.eclipse.core.resources/.projects/Foo/.markers ~/safe.Foo.markers
    

    【讨论】:

      【解决方案5】:

      对于那些没有从之前的答案中找到解决方案的人,他们可以尝试解决我的问题的方法。我认为类似于 HAL9000 问题/解决方案

      如果您有两个具有相同名称的类(在两个不同的项目中),则在一个上设置断点,也应用在另一个上。它们都显示在“断点”窗口中。

      解决方案:如果您从类中删除断点 - 同名 - 您没有使用它,则会从您正在调试的类中删除断点。

      【讨论】:

        猜你喜欢
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-05
        • 1970-01-01
        • 1970-01-01
        • 2017-04-05
        • 2015-03-27
        相关资源
        最近更新 更多