为什么我的Eclipse项目有幻像调试器断点?


74

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

在同一个Eclipse工作区中,我还有另一个更大的项目,它不会遭受此问题的困扰。

我只是将较小的项目从我的旧Linux机器上移了下来,在那里我在Europa Eclipse中进行了开发并遇到了这个问题,将其移到了新的Windows机器上,在那里我继续在Ganymede Eclipse中看到了问题。该问题在操作系统和Eclipse版本之间仍然存在,但显然不在项目之间。我不明白!我浏览了该项目目录中的每个文件,但找不到任何可能导致Eclipse在FileInputStream中停止的文件。

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


我自己一个人在想,我经常发现自己停在我可能宣誓就职的断点处。
Uri

刚刚根据要求添加了对此“任何未捕获的异常暂停”功能的一些解释
-VonC

Answers:


113

您是否尝试取消选择

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

?(例如,如本线程中所述

替代文字

为什么Eclipse以这种方式工作?

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

为了设置一个断点,与旧的API,客户端所需的Java模型对象-比如ITypeIField
有了由调试模型所需的新的API,所有的类型名,字段名等。

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

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

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


它有助于检测代码未捕获的未经检查的运行时异常。
VonC

我遇到了相同的行为,并且我没有取消选中“在未捕获的异常上暂停执行”。我更喜欢保留该选项,但是我想知道发生了哪个异常,我怎么知道呢?
HAL9000

@ HAL9000如果您选中该选项,那么您是否不应该看到发生了哪个异常?通过“我遇到相同的行为”,您是说您具有“幻像”断点?
VonC

是的,我的意思是幻像断点。有时,在某一行中会触发幻像断点。但是,LogCat和Console均未说明任何有关异常的信息。代码似乎也没有异常,然后我想知道在哪里寻找异常消息。
HAL9000

@ HAL9000可能由于不正确的清理而破坏了其中包含调试信息的旧版本代码?如果您从Eclipse工作区中删除项目,将源复制到其他位置,然后将项目从复制的源重新导入到Eclipse工作区中,您是否可以重现该问题?
VonC

38

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

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

调试>断点

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

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

一些图片指导其他人:

将断点窗口添加到Eclipse

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


谢谢马克。这有帮助。但是我并没有全部删除它们,只是找到了引起麻烦的那个。
morphium 2012年

谢谢马克!为我工作,但像上面的那个人一样,我只是删除了需要的那个人。令人沮丧的是,注册的断点甚至没有显示在侧栏的编辑器视图中。在这种情况下,它们确实是“幻像”点。
The111 2013年

我可能找到了与您的解决方法有关的问题的解决方案。下次发生这种情况时,请尝试以下解决方案。
HAL9000

令人遗憾的是,到2020年,我们仍然会遭受这个可怕的错误困扰。请注意,这个问题已有11年以上的历史了。每次编辑任何源文件时,都必须删除所有断点。这使整个IDE无法使用。
佩雷

5

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

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


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

0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.