Eclipse调试器始终在ThreadPoolExecutor上进行阻止,而没有任何明显的例外,为什么?


209

我正在Eclipse上做我通常的项目,这是一个由Spring,Hibernate等制成的J2EE应用程序。为此,我正在使用Tomcat 7(没有特殊原因,我没有利用任何新功能,我只是想尝试一下)。每次我调试应用程序时,都会发生Eclipse调试器弹出它就像到达断点一样的情况,但事实并非如此,实际上它会在Java源文件上停止ThreadPoolExecutor。控制台上没有堆栈跟踪,只是停止了。然后,如果我单击“简历”,它将继续运行,并且该应用程序可以完美运行。这是在调试器窗口中显示的内容:

Daemon Thread ["http-bio-8080"-exec-2] (Suspended (exception RuntimeException)) 
    ThreadPoolExecutor$Worker.run() line: 912   
    TaskThread(Thread).run() line: 619

我真的无法解释,因为我根本没有使用ThreadPoolExecutor。必须来自Tomcat,Hibernate或Spring。这很烦人,因为我总是必须在调试过程中恢复。

有什么线索吗?


1
@ AmosM.Carpenter是不是Java EE,不是JEE?甚至您自己的链接似乎也暗示了这一点
eis 2015年

Answers:


290

发布的堆栈跟踪指示在Daemon线程中遇到RuntimeException。除非原始开发人员捕获并处理了异常,否则通常不会在运行时捕获该异常。

通常,将Eclipse中的调试器配置为在所有未捕获的异常上在引发异常的位置挂起执行。请注意,异常可能在以后处理,在堆栈框架中降低,并且可能不会导致线程终止。这可能是观察到的行为的原因。

配置Eclipse的行为很简单:
转到“ 窗口” > “首选项” >“ Java” >“ 调试”,然后取消选中“ 在未捕获的异常上暂停执行”


在我的情况下stackoverflow.com/questions/8911146/…并没有帮助:-(
Gangnus 2012年

5
我已经提交了有关此问题的Eclipse错误384073,因为它实际上使调试Web应用程序时此选项不可用。
Daniel Serodio

9
在Eclipse上禁用“在未捕获的异常上暂停执行”是一个不好的解决方法:如果您确实希望Eclipse在真正的未捕获的异常上暂停,例如源自您自己的代码,该怎么办?在我看来,这是Tomcat中的错误...

3
@路易斯:我想知道同样的!按照bugs.eclipse.org/bugs/show_bug.cgi?id=384073#c4的规定,可以执行以下操作:禁用全局断点,在java.lang.Exception上创建一个新的断点,并对这个新创建的断点应用独占过滤器。
rektide

3
@Daniel ...最好向Tomcat团队提出问题。我认为这种行为是Tomcat 7中的新功能... Eclipse可以实现预期的功能...(从没想过有一天我会最终捍卫Eclipse ... :)
Stijn de Witt

47

有一个更具体的解决方案,它可以防止Eclipse破坏RuntimeException仅从给定类抛出的。

  1. 从“调试”角度添加新的异常断点
  2. 转到其属性
  3. 前往筛选
  4. 在“仅限所选位置”中,点击“ 添加类别
  5. java.util.concurrent.ThreadPoolExecutor
  6. 取消选中该复选框,这意味着这些将被忽略

1
我似乎无法使其与Tomcat 7和Eclipse / STS 3.4.0一起使用。还有其他必要的设置吗?是否应该在此断点上注册RuntimeException?是否必须启用或禁用?“捕获位置”和“未捕获位置”应该打开还是关闭?
Henrik Heimbuerger 2013年

2
看来异常断点必须是java.lang.RuntimeException,必须被启用,必须仅用于未捕获的位置,并且不能检查java.util.concurrent.ThreadPoolExecutor类。
2014年

不幸的是,在Ubuntu 14.04上,对于Eclipse Luna 4.4.0,“限制到选定的位置”不可用。
eeezyy 2014年

24

重新加载Web应用程序时,此行为由tomcat触发。这是tomcat的“内存泄漏保护”功能的一部分,该功能(除其他外)强制更新其线程。

现在已从tomcat的7.0.54和8.0.6版修复:https ://issues.apache.org/bugzilla/show_bug.cgi?id=56492


2

我注意到,这通常是在修改服务器文件(jsp或java)后发生的,并且STS无法重新加载应用程序。

通常,这将导致重新启动服务器以使其同步更改。

引入JRebel之后-它似乎已经消失了。因此,我想在调试模式下热交换代码时,这是STS中的可复制问题。

通过删除本机热交换,它消除了在ThreadPoolExecutor类内部中断的问题。

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.