Отладка Java не работает на виртуальных машинах Azure?

#java #tomcat

Вопрос:

Обычно я развертываю свои проекты Tomcat/Java на AWS. Я очень хорошо знаком с процессом открытия порта для удаленной отладки. Обычно я использую порт 8000.

Я знаю, что вам нужно установить параметры-Xdebug-Xrunjdwp при запуске Java и что целевой порт не должен быть заблокирован брандмауэром.

Недавно клиент попросил, чтобы мы использовали виртуальные машины Azure вместо AWS, поэтому я настроил одну из них. Я убедился, что открыл правильный порт и настроил правильные параметры Java, и из журналов Tomcat я вижу, что они были распознаны.

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

Почему это не работает? Что я мог упустить из виду?

Комментарии:

1. Краткое примечание: если «никто не слушает», то этот факт обычно распространяется через ICMP (или TCP_RST), и вы должны немедленно увидеть «отказано в подключении». Если у вас «тайм-аут подключения», мне кажется, что брандмауэр удаляет входящие TCP_SYN. Убедитесь, что брандмауэр не выполняет это на уровне операционной системы (как вы упомянули, вы настроили политику безопасности AWS, чтобы разрешить это).

2. Да, я тоже собирался предложить проверить настройки пожарной стены, либо на физической машине, либо на виртуальной машине. Это может быть любое устройство между вашей рабочей станцией и виртуальной машиной, которое также может блокировать эти порты, поэтому любой маршрутизатор или прокси-сервер на стороне клиента может быть настроен на отклонение пакетов. Трассировка маршрута может помочь в этом.

Ответ №1:

Это не было проблемой с брандмауэром или чем-то еще на уровне операционной системы. Это связано с незначительными изменениями в самой JVM.

Ранее выражение «адрес=8000» означало «прослушивание всех интерфейсов порта 8000». Они изменили его на «прослушивание на локальном хосте порта 8000». Это фактически означает, что «удаленная» отладка возможна только в том случае, если клиент находится на том же компьютере.

Чтобы исправить это, вам нужно либо указать «адрес=[ip-адрес]:8000», либо использовать специальный синтаксис «адрес=*:8000», который воспроизводит старое поведение прослушивания на всех интерфейсах.

Откровенный