Eclipsedebugging器总是阻塞ThreadPoolExecutor,没有任何明显的exception,为什么?
我正在开发通常的Eclipse项目,这是一个J2EE应用程序,由Spring,Hibernate等构成。 我正在使用Tomcat 7(没有特别的原因,我没有利用任何新function,我只是想尝试)。 每当我debugging我的应用程序时,Eclipsedebugging器就会popup来,就像它已经到达断点一样,但事实并非如此,事实上,它停止在一个名为ThreadPoolExecutor
的Java源文件上。 控制台上没有堆栈跟踪,只是停止。 然后,如果我点击简历,它继续下去,应用程序完美地工作。 这是在debugging器窗口中显示的内容:
Daemon Thread ["http-bio-8080"-exec-2] (Suspended (exception RuntimeException)) ThreadPoolExecutor$Worker.run() line: 912 TaskThread(Thread).run() line: 619
我真的不能解释这一点,因为我根本没有使用ThreadPoolExecutor
。 必须是来自Tomcat,Hibernate或Spring的东西。 这是非常烦人的,因为我总是不得不在debugging过程中恢复。
任何线索?
发布的堆栈跟踪表明在守护程序线程中遇到RuntimeException。 这通常在运行时不被捕获,除非原始开发人员捕获并处理exception。
通常情况下,Eclipse中的debugging器被configuration为在抛出exception的位置挂起所有未捕获exception的执行。 请注意,该exception可能稍后处理,在堆栈帧中降低并可能不会导致线程被终止。 这将是观察到的行为的原因。
configurationEclipse的行为很简单:
转到“ 窗口” > “首选项” >“ Java” >“ debugging”,然后取消选中“ 在未捕获的exception上挂起执行” 。
有一个更具体的解决scheme,它可以防止Eclipse抛出RuntimeException
只抛出给定的类。
- 从“debugging”透视图中添加一个新的exception断点
- 去它的属性
- 转到过滤
- 在“限定到所选位置”中,点击“ 添加class级 ”
- 添加
java.util.concurrent.ThreadPoolExecutor
- 取消选中checkbox ,意味着这些将被忽略
当webapp被重新加载时,这个行为是由tomcat触发的。 这是tomcat “内存泄漏保护”function的一部分,(除其他外)强制更新其线程。
现在已经从tomcat的7.0.54和8.0.6版本中修复了: https ://issues.apache.org/bugzilla/show_bug.cgi?id=56492
我注意到这经常发生在修改服务器文件(jsp或java)之后,STS无法重新加载应用程序。
这通常会导致重新启动服务器,以使其获得更改同步。
在介绍JRebel之后,它似乎已经消失了。 所以,我想在debugging模式下使用代码时,这在STS中是一个可重现的问题。
通过删除本机热插拔,它消除了ThreadPoolExecutor类中的问题。