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

got*_*ch4 209 java eclipse debugging tomcat

我正在研究我在Eclipse上的常规项目,它是一个J2EE应用程序,由Spring,Hibernate等构成.我正在使用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
Run Code Online (Sandbox Code Playgroud)

我真的无法解释这个,因为我根本就没用ThreadPoolExecutor.必须是来自Tomcat,Hibernate或Spring的东西.这非常烦人,因为我总是要在调试过程中恢复.

有线索吗?

Vin*_*lds 290

发布的堆栈跟踪表明在守护程序线程中遇到了RuntimeException.除非原始开发人员捕获并处理了异常,否则这通常在运行时未被捕获.

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

配置Eclipse的行为非常简单:
转到Window > Preferences > Java > Debug并取消选中暂停执行未捕获的异常.

  • 在Eclipse上禁用"暂停执行未捕获的异常"是一个糟糕的解决方法:如果您希望Eclipse暂停实际未捕获的异常,例如源自您自己的代码,该怎么办?在我看来,这是Tomcat中的一个错误...... (9认同)
  • 我已经提交了关于此问题的Eclipse错误[384073](https://bugs.eclipse.org/bugs/show_bug.cgi?id=384073),因为它在调试Web应用程序时实际上使此选项无法使用. (5认同)
  • @Luis:我也想知道!根据https://bugs.eclipse.org/bugs/show_bug.cgi?id=384073#c4,可以:禁用全局断点,在java.lang.Exception上创建一个新断点,并对此应用独占过滤器新创建的断点. (3认同)
  • @Daniel ......也许最好向Tomcat团队提出问题.我认为这种行为在Tomcat 7中是新的... Eclipse做了它应该做的事情......(从未想过有一天我最终会捍卫Eclipse ...... :) (3认同)

Eng*_*_DJ 47

有一个更具体的解决方案,它可以防止Eclipse RuntimeException仅在给定的类中抛出.

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

  • 似乎异常断点必须是java.lang.RuntimeException,必须启用,必须仅用于未捕获的位置,并且不得检查java.util.concurrent.ThreadPoolExecutor类. (2认同)

sla*_*ent 24

重新加载webapp时,tomcat会触发此行为.它是tomcat "内存泄漏保护"功能的一部分,其中包括强制更新其线程.

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