如何检测线程何时到达Java中的断点

时间:2019-04-11 16:01:43

标签: java multithreading breakpoints detection

假设我正在运行一个线程(严重)。假设我在同一进程中有另一个线程(WatchDog),该线程定期检查Critical是否正在足够快地处理作业,或者在一项作业上花费的时间是否大于X秒。如果Critical在一项工作上花费> X秒,则WatchDog会获取Critical的调用堆栈,一些其他诊断信息并报告错误。 (我使用它的一个地方是检测Swing UI线程是否挂起。我在代码中其他对性能敏感的地方使用它。)

如果我连接调试器(例如Eclipse),设置一个断点,而Critical击中该断点,则WatchDog将报告错误,因为Critical花费的时间太长。如何让WatchDog检测到Critical达到了断点而没有报告错误?

目前,我只是在开发计算机上运行时禁用WatchDog;否则,我将收到很多错误报告(错误记录到开发计算机上的控制台)。如果我只是检测到连接了调试器,那么WatchDog几乎总是会被禁用,因为这就是我运行程序的方式。因此,仅检测附加的调试器是不够的。

在报告错误之前,我可以在WatchDog中设置一个断点。然后,如果它检测到实际错误,则可以允许WatchDog恢复。没关系,但我正在寻找自动化程度更高的东西。

JVM知道线程遇到断点。如何检查此状态?

注意:This question是相同的,但适用于.Net。

1 个答案:

答案 0 :(得分:0)

据我所知,除非您已注册接收JVM的Debug事件,否则您将无法接收调试信息,因此您可能必须编写自己的代理。

否则,这有点麻烦,但是如.NET问题中所述,如果您使用的是Eclipse,则可以在Critical的断点上使用条件来设置System属性“ com.acme.critical-停止”或遇到断点时发生的事情。[enter image description here]

然后,WatchDog线程可以在提交错误之前检查系统属性以查看是否已设置。 在断点之后的那一行,您需要设置一个 second 条件断点。此条件将为always return false,因此Critical线程不会再次停止,它只会将system属性更改为false。
enter image description here

尝试在下面的代码中设置断点,下面的代码对我有用。

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();
        }
    }
}

}