Подтвердить что ты не робот

Как узнать, включен ли режим отладки

Как программа Java может узнать, работает ли она в режиме отладки?

Приложение должно вести себя немного иначе в обычном режиме "полной скорости", чем в "режиме отладки" (при подключении отладчика при запуске в режиме отладки). Приложение взаимодействует через TCP с другим компьютером, другим процессом или внутри себя. Мой сотрудник хочет, чтобы мы использовали Socket.setSoTimeout(1000) по умолчанию, так что чтение из сокета может блокироваться не более 1 секунды. При отладке этого, конечно, недостаточно, и приложение перестает работать так, как должно. Таким образом, решение было бы установить SO_TIMEOUT выше, но только в режиме отладки (например: без ограничений). Теперь я не всегда устанавливаю точки останова или не хочу использовать отладочную сборку, где я мог бы самостоятельно установить свойство "debug". Иногда я прикрепляю отладчик (удаленная отладка). Я в основном использую Eclipse, поэтому решение, которое просто работает, в порядке.

Возможные ответы:

  • Чтобы узнать, запущен ли в режиме отладки, используйте следующий метод в java.lang.management.* или javax.management.*...

  • Ваш коллега ошибочен по причине X, вы не должны устанавливать SO_TIMEOUT на 1 секунду по умолчанию.

Update

Я знаю об использовании системного свойства, но я оставляю вопрос открытым, чтобы решить свой первоначальный вопрос.

4b9b3361

Ответ 1

Я нашел это сейчас:

boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean().
    getInputArguments().toString().indexOf("jdwp") >= 0;

Это проверит, используется ли агент Java Debug Wire Protocol.

Ответ 2

Сделать тайм-аут настраиваемым. Самый простой способ - просто использовать системное свойство и прочитать его с помощью Integer.getInteger:

private final static int SOCKET_TIMEOUT =
  Integer.getInteger("com.yourapp.module.socketTimeout", 1000); // default 1 sec

Затем, при запуске приложения для отладки, просто установите свойство из командной строки (или соответствующего файла конфигурации, в зависимости от среды, в которой работает ваше приложение):

java -Dcom.yourapp.module.socketTimeout=1000000 MainClass

Это хорошо, потому что это не волшебным образом изменяет поведение при запуске приложения в отладчике, и вы можете изменить таймаут, когда не отлаживаете (например, если вам нужно запустить его где-нибудь с медленным подключением, некоторые день).

(Конечно, если ваша система уже использует файл конфигурации, может быть целесообразно добавить это значение в качестве записи там.)

В зависимости от того, соответствует ли одна секунда тайм-ауту... полностью зависящему от приложения. Иногда лучше дать правильный ответ в конце концов, другие неудачные времена лучше, чем ждать успеха.

Ответ 3

Вы решаете неправильную проблему. Ваша программа не должна знать об этом, если она не связана с внутренними системами eclipse или jvm.

Решение

Используйте системное свойство со значением по умолчанию:

int timeout = Integer.parseInt( 
    System.getProperty("socket.timeout", "1000"));
socket.setSoTimeout(timeout);

И в конфигурации запуска отладки просто добавьте

-Dsocket.timeout=20000

к параметрам вызова

(Если вы не укажете системное свойство, будет использоваться значение по умолчанию)

Ссылки