Как узнать, включен ли «режим отладки» - PullRequest
39 голосов
/ 23 сентября 2010

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

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

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

Обновление

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

Ответы [ 3 ]

70 голосов
/ 23 сентября 2010

Я узнал сам сейчас:

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

Это проверит, используется ли агент Протокол отладки Java .

10 голосов
/ 23 сентября 2010

Сделать время ожидания настраиваемым. Самый простой способ - просто использовать системное свойство и прочитать его с 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

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

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

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

5 голосов
/ 23 сентября 2010

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

Решение

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

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

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

-Dsocket.timeout=20000

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

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

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...