假设我正在运行一个线程(严重)。假设我在同一进程中有另一个线程(WatchDog),该线程定期检查Critical是否正在足够快地处理作业,或者在一项作业上花费的时间是否大于X秒。如果Critical在一项工作上花费> X秒,则WatchDog会获取Critical的调用堆栈,一些其他诊断信息并报告错误。 (我使用它的一个地方是检测Swing UI线程是否挂起。我在代码中其他对性能敏感的地方使用它。)
如果我连接调试器(例如Eclipse),设置一个断点,而Critical击中该断点,则WatchDog将报告错误,因为Critical花费的时间太长。如何让WatchDog检测到Critical达到了断点而没有报告错误?
目前,我只是在开发计算机上运行时禁用WatchDog;否则,我将收到很多错误报告(错误记录到开发计算机上的控制台)。如果我只是检测到连接了调试器,那么WatchDog几乎总是会被禁用,因为这就是我运行程序的方式。因此,仅检测附加的调试器是不够的。
在报告错误之前,我可以在WatchDog中设置一个断点。然后,如果它检测到实际错误,则可以允许WatchDog恢复。没关系,但我正在寻找自动化程度更高的东西。
JVM知道线程遇到断点。如何检查此状态?
注意:This question是相同的,但适用于.Net。
答案 0 :(得分:0)
据我所知,除非您已注册接收JVM的Debug事件,否则您将无法接收调试信息,因此您可能必须编写自己的代理。
否则,这有点麻烦,但是如.NET问题中所述,如果您使用的是Eclipse,则可以在Critical的断点上使用条件来设置System属性“ com.acme.critical-停止”或遇到断点时发生的事情。[]
然后,WatchDog线程可以在提交错误之前检查系统属性以查看是否已设置。
在断点之后的那一行,您需要设置一个 second 条件断点。此条件将为always return false,因此Critical线程不会再次停止,它只会将system属性更改为false。
尝试在下面的代码中设置断点,下面的代码对我有用。
public class T1 {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while (i < 1000){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Stopping");
System.out.println("Finished");
}
}
}, "WatchDog").start();
while (true){
System.out.println("Stopped ? " + System.getProperty("IsStopped"));
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}