Eclipse调试器总是阻塞在ThreadPoolExecutor上,没有任何明显的异常,为什么?

我在Eclipse上做我的常规项目,它是一个J2EE应用程序,用Spring、Hibernate等做的。为此,我使用Tomcat 7(没有特别的原因,我没有利用任何新特性,我只是想尝试一下)。每次我调试我的应用程序时,Eclipse调试器都会弹出,就像它已经到达一个断点一样,但事实并非如此,事实上它停在一个Java源文件ThreadPoolExecutor上。控制台上没有堆栈跟踪,它只是停止了。然后,如果我点击resume,它就会继续运行,应用程序可以完美地运行。这是调试器窗口中显示的内容:

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

我真的无法解释这一点,因为我根本没有使用ThreadPoolExecutor。必须是来自Tomcat, Hibernate或Spring的东西。这很烦人,因为在调试过程中我总是要重新开始。

有线索吗?

65021 次浏览

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

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

配置Eclipse的行为是直接的:
进入窗口 > 首选项 > Java > 调试,取消选中暂停未捕获异常的执行

有一个更具体的解决方案,它可以防止Eclipse在仅从给定类抛出的__abc0上中断。

  1. 从Debugging透视图中添加一个新的异常断点
  2. 去它的属性
  3. 过滤
  4. 在“限制到选定的位置”中,单击“添加类
  5. 添加java.util.concurrent.ThreadPoolExecutor
  6. 取消复选框,意味着这些将是忽略了

我注意到这种情况经常发生在修改服务器文件(jsp或java)之后,STS在重新加载应用程序时遇到麻烦。

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

在引入JRebel之后,它似乎已经消失了。所以,我认为这是一个可重复的问题,在STS热插拔代码在调试模式。

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

当一个webapp被重新加载时,tomcat会触发这个行为。它是tomcat “内存泄漏保护”功能的一部分,强制更新它的线程。

tomcat 7.0.54和8.0.6版本修复: https://issues.apache.org/bugzilla/show_bug.cgi?id=56492 < / p >