Как определить, когда поток достигает точки останова в Java - PullRequest
2 голосов
/ 11 апреля 2019

Допустим, у меня запущен поток (критический). Допустим, у меня есть другой поток (WatchDog) в том же процессе, который периодически проверяет, достаточно ли быстро обрабатывает Critical задания или потратил> X секунд на 1 задание. Если Critical тратит> X секунд на 1 задание, то WatchDog захватывает стек вызовов Critical, некоторую другую диагностическую информацию и сообщает об ошибке. (Одним из мест, где я использую это, является обнаружение зависания потока пользовательского интерфейса Swing. Я использую это в других местах, чувствительных к производительности, в коде.)

Если я присоединяю отладчик (например, Eclipse), устанавливаю точку останова и Critical достигает точки останова, то WatchDog сообщит об ошибке, потому что Critical занимает слишком много времени. Как я могу заставить WatchDog обнаружить, что Critical достиг точки останова, и не сообщать об ошибке?

В настоящее время я просто отключаю WatchDog при работе на компьютере разработчика; в противном случае я получу много отчетов об ошибках (ошибки, записанные в консоль на компьютере разработчика). Если я просто обнаружу, что отладчик подключен, то WatchDog почти всегда будет отключен, поскольку именно так я запускаю программу. Таким образом, обнаружения подключенного отладчика недостаточно.

Я мог бы установить точку останова в WatchDog прямо перед тем, как он сообщит об ошибке. Затем я мог бы разрешить WatchDog возобновить работу, если обнаружит реальную ошибку. Это нормально, но я ищу что-то более автоматизированное.

JVM знает, что поток достиг точки останова. Как мне проверить это состояние?

Примечание: Этот вопрос такой же, но для .Net.

1 Ответ

0 голосов
/ 29 апреля 2019

Из того, что я знаю, вы не можете получать отладочную информацию, если вы не зарегистрированы для получения событий отладки от JVM, поэтому вам, возможно, придется написать свой собственный агент.

Если это не так, то это немного хакерски, но, как уже упоминалось в вопросе .NET, если вы используете Eclipse, вы можете использовать условие на точке останова в Critical, чтобы установить свойство System, "com.acme.critical- остановлен "или что-то, когда достигнута точка останова. [enter image description here]

Затем поток WatchDog может проверить системное свойство, чтобы увидеть, установлено ли оно, перед тем, как сообщать об ошибке. На линии после точки останова вам необходимо установить условную точку останова second . Это условие будет всегда возвращать false , поэтому критический поток не будет останавливаться снова, он просто изменит системное свойство обратно на 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();
        }
    }
}

}

...