76

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

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

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

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

4

5 回答 5

115

您是否尝试取消选择

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

? (例如在这个线程中提到的

替代文字

为什么 Eclipse 会这样工作?

可以追溯到 2002 年,当时断点对象层次结构已被剥离。

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

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

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

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

于 2009-04-06T21:28:55.537 回答
39

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

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

调试 > 断点

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

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

一些指导他人的图片:

将断点窗口添加到 Eclipse

全部删除(断点,右键单击)

于 2012-10-03T22:39:48.843 回答
5

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

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

于 2013-12-28T21:35:08.423 回答
2

我遇到了一个问题,即源文件具有不存在的断点的持久标记。我尝试清理项目,进行完整构建,重新启动 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
于 2017-12-06T23:39:10.443 回答
0

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

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

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

于 2014-12-13T01:09:17.373 回答