Удаленная отладка Java-приложений с помощью Eclipse

Использование Eclipse для расширения возможностей отладки Java-приложений

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

Чарльз Лу, программист, IBM

Чарльз Лу(Charles Lu)- разработчик программного обеспечения в IBM China Software Development Lab. Сейчас он работает над разработкой IBM Lotus Expeditor. Интересуется программированием различных устройств, обменом мгновенными сообщениями и голосовыми технологиями.



15.01.2010

Удалённая отладка может быть полезна для разработки приложений, например, при разработке программ для слабых компьютеров, которые не могут поддерживать среду разработки, или отладки программ на специализированных компьютерах, таких как Web-серверы, которые не допускают остановки сервисов. Другие примеры - Java-приложения, запускаемые на системах с малым количеством памяти или слабым процессором, например, на мобильных устройствах, ситуации, когда разработчик хочет отделить систему для разработки приложения от системы, где приложение будет работать, и т.д.

Предварительные требования

Конфигурация запуска программы

Если у вас ещё не установлена интегрированная среда разработки Eclipse V3.4 (Ganymede), загрузите её. В версии Ganymede в конфигурацию запуска удаленных Java-приложений добавлен объект-коннектор, прослушивающий сокет (socket-listening connector). Новый объект-коннектор Eclipse, прослушивающий сокет, позволяет запускать Java-отладчик, который прослушивает соединения на указанном сокете. Отлаживаемая программа может быть запущена с опциями командной строки, задающими подключение к отладчику. До выхода Ganymede поддерживался только объект-коннектор для подключения к сокету (socket-attaching connector), и отлаживаемая программа должна была запускаться как хост, к которому подключался отладчик. Для мобильных устройств работа в качестве хоста невозможна из-за недостатка памяти и мощности процессора.

Для удалённой отладки необходимо наличие Java Virtual Machine (JVM) V5.0 или более поздней версии, например, IBM® J9 или Sun Microsystems Java SE Development Kit (JDK). В этой статье внимание будет сосредоточено на удалённой отладке, а не на общих возможностях инструментов отладки в Eclipse. В разделе Ресурсы приведена дополнительная информация по отладке в Eclipse указано, и где найти вышеупомянутое программное обеспечение.

Введение в JPDA

  • JDI - Java Debug Interface (отладочный интерфейс Java)
  • JDT - Java Development Tools (инструменты разработки Java)
  • JDWP - Java Debug Wire Protocol (протокол передачи отладочной информации Java)
  • JPDA - Java Platform Debugger Architecture (Архитектура отладчика на платформе Java)
  • JVM - Java Virtual Machine (Виртуальная Java машина)
  • JVMDI - JVM Debug Interface (отладочный интерфейс виртуальной машины Java)
  • JVMTI - JVM Tool Interface (интерфейс инструментария виртуальной машины Java)
  • VM - Virtual Machine (виртуальная машина)

Технология Java Platform Debugger Architecture (JPDA) фирмы Sun Microsystems - это многоуровневая архитектура, которая позволяет легко отлаживать Java приложения в любых ситуациях. Технология JPDA состоит из двух интерфейсов (JVMTI и JDI соответственно), протокола JDWP и двух программных компонентов, которые связывают их между собой (серверная и клиентская части). Она разработана для отладки в любой среде. JPDA работает не только на настольных системах, но и на встроенных платформах.

Интерфейс JVMTI определяет, что виртуальная машина должна предоставлять для отладки. (Примечание редактора: Начиная с Java V5 интерфейс JVMTI заменил прошлую версию - интерфейс JVMDI, который использовался в Java V1.4.) Протокол JDWP описывает формат информации для отладки и запросов, передаваемых между отлаживаемым процессом и клиентской частью отладчика, который поддерживает JDI, (это программы, такие как Eclipse, Borland JBuilder и многие другие). Отлаживаемая программа в описании JPDA фирмы Sun часто называется debuggee (отлаживаемый компонент). JDI - это высокоуровневый интерфейс, в котором определена информация и запросы, используемые для удалённой отладки. Ниже описано, как устроена архитектура JPDA

Листинг 1. Архитектура отладчика на платформе Java
             компоненты                      отладочные интерфейсы

                 /    |--------------|
                /     |     виртуальная машина Java       |
 отлаживаемый -----(|---|  <-- JVMTI - интерфейс инструментария виртуальной машины Java
 компонент
                \     |   серверная часть   |
                 \    |--------------|
                 /           |
 транспортный --(|  <------------ JDWP - протокол передачи отладочной информации Java
 канал
                 \           |
                 /    |--------------|
                /     |  клиентская часть   |
 отладчик -----(      |--------------|  <---- JDI - отладочный интерфейс Java
                \     |      пользовательский интерфейс      |
                 \    |--------------|

Поэтому любые сторонние инструменты и виртуальные машины, основанные на JPDA, должны взаимодействовать без каких-то проблем. Такая клиент-серверная архитектура позволяет отлаживать программы Java с локального компьютера, где запущена Java-платформа, или даже вести отладку с удалённого компьютера в локальной сети.

Прежде чем начать разговор о сценариях отладки, необходимо ознакомиться с двумя терминами, используемыми в документации JPDA: коннектор (connector - соединитель) и транспорт (transport - проводник). Коннектор - это абстракция, вводимая в JDI и используемая для установки соединения между приложением-отладчиком и целевой виртуальной машиной. Транспорт определяет, как приложения получают доступ к данным и передают данные между клиентской и серверной частью. Коннекторы привязаны к определенным типам транспортов и режимам соединений. В реализации Sun в JPDA есть два транспортных механизма, поддерживаемых Microsoft® Windows®: сокет-транспорт (socket transport) и транспорт с использованием общей памяти (shared memory transport). Доступны следующие типы коннекторов:

  • объект-коннектор для работы с сокетами (socket-attaching connector)
  • объект-коннектор с работы с общей памятью (shared-memory attaching connector)
  • объект-коннектор, прослушивающий сокет (socket-listening connector)
  • объект-коннектор для прослушивания общей памяти (shared-memory listening connector)
  • объект-коннектор для запуска из командной строки (command-line launching connector)

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

Проблема удалённой отладки Java-программ заключается не в клиентском интерфейсе внешнего отладчика, а в удалённой серверной отлаживаемой части. К несчастью информация по этому вопросу в справочной системе Eclipse присутствует в недостаточном количестве. В действительности JDI и JVMTI поддерживаются Eclipse и средой исполнения Java. Только один компонент архитектуры может вызывать вопросы - это протокол JDWP, содержащий информацию для взаимодействия с JVMTI и JDI. JDWP содержит много параметров, которые были добавлены для удаленного вызова Java-приложений. Ниже перечислены некоторые из параметров, используемых в этой статье.

-Xdebug
Включает возможность отладки.
-Xrunjdwp:<sub-options>
Загружает конфигурацию JDWP в виртуальную машину. При этом для обмена информацией с внешним приложением-отладчиком используются транспортный и JDWP-протоколы. Конкретные подпараметры описаны ниже.

Начиная с Java V5 вместо -Xdebug и -Xrunjdwp можно использовать параметр -agentlib:jdwp. Но если необходимо соединиться с виртуальной машиной версией ниже, чем V5, можно использовать только опции -Xdebug и -Xrunjdwp. Ниже представлены краткие описания параметров -Xrunjdwp.

transport
Обычно используется сокет-транспорт. Но на платформе Windows можно использовать транспорт с использованием общей памяти, если он доступен.
server
Если значение этого параметра равно y, запускаемое приложение ожидает подключения приложения-отладчика. В противном случае оно подключается к приложению-отладчику по заданному адресу.
address
Это адрес для подключения, по которому определяется тип транспорта. Если значение параметра server равно n, осуществляется попытка подключения приложения отладчика по указанному адресу. В противном случае начинается ожидание подключения к указанному порту.
suspend
Если значение параметра равно y, целевая виртуальная машина приостанавливается до подключения приложения-отладчика.

За более детальной информацией по каждой настройке обращайтесь к документации JPDA (см. раздел Ресурсы).

В листинге 2 приведен пример запуска виртуальной машины в режиме отладки и с ожиданием подключения через сокет на порту 8765.

Листинг 2. Целевая виртуальная машина работает как отладочный сервер
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8765

В листинге 3 показано, как присоединиться к запущенному приложению-отладчику, используя сокет на хосте 127.0.0.1 и порту 8000.

Листинг 3. Целевая виртуальная машина работает как отладочный клиент
-Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000

Возможности удалённой отладки в Eclipse

Среда разработки Eclipse - это клиентская составляющая Java-отладчика с графическим интерфейсом пользователя. Реализация JDI взята из пакета org.eclipse.jdt.debug. В этой статье не обсуждаются детали реализации JDI. В разделе Ресурсы приведена информация о технологиях Eclipse JDT и Java JDI.

Первое, что необходимо узнать - какой тип коннектора из предлагаемых в Eclipse стоит использовать. Чтобы узнать, какие типы удалённых подключений поддерживаются в Eclipse, можно добавить конфигурацию запуска типа Remote Java Application (Удаленное Java-приложение) с помощью меню Eclipse Run (запуск) > Debug Configurations... (конфигурации отладки), а затем выбрать тип коннектора из выпадающего списка. В версии Ganymede поддерживаются два типа коннекторов:

  • Socket Attach (для подключения к сокетам)
  • Socket Listen (для создания сокетов, к которым можно подключаться)

Для коннектора, ожидающего подключения по сокету (socket-listening connector) виртуальная машина Eclipse будет сервером, к которому должно будет подключиться удалённое Java-приложение. Для коннектора, подключающегося к сокету (socket-attaching connector) сервером будет целевая виртуальная машина. Для отладки приложения нет никакой разницы между двумя типами коннекторов, и пользователь может выбрать любой из них. Как правило, из-за требуемых вычислительных ресурсов в качестве отладочного сервера используется более быстрый и мощный компьютер.

Перед отладкой Java-приложения необходимо убедиться, что для удалённого приложения включены отладочные опции. Если эта информация окажется недоступной, в ходе отладки возникнет сообщение "Debug information is not available" (отладочная информация недоступна) или "Unable to install breakpoint due to missing line number" (невозможно установить точку останова из-за отсутствия номера строки). Изменить настройки можно через меню Eclipse: Window (окно) > Preferences (настройки) > Java > Compiler (компилятор).

Рисунок 1. Настройки отладки в Eclipse
Рисунок 1. Настройки отладки в Eclipse

Теперь можно начать удалённую отладку приложения. Для этого надо выполнить следующие действия:

1. Создать Java-проект с простым классом
Создайте простой класс для примера отладки. В листинге 4 приведен пример кода для подобного класса.
Листинг 4. Пример кода для отладки
package com.ibm.developerWorks.debugtest;

public class test {

public static void main(String[] args) {
System.out.println("This is a test.");
}
}
2. Установить точку останова
Установите в коде точку останова. В этом примере точка останова установлена на строке System.out.println("This is a test.");.
Рисунок 2. Установка точек останова в Eclipse
Рисунок 2. Установка точек останова в Eclipse
3. Локальная отладка приложения
Перед отладкой приложения необходимо убедиться, что для этого проекта установлены параметры отладки, показанные на рисунке 1. Отлаживать приложение локально необязательно, но стоит убедиться, что вся отладочная информация доступна. Для этого нужно щёлкнуть правой клавишей мыши на проекте Java, выбрать Debug As (отлаживать как) и затем выбрать опцию Java Application (Java-приложение) (см. рисунок 3). Если исполнение приложения остановилось на точке останова, то отладочная информация присутствует и настроена правильно. Можно использовать и другие возможности отладки, такие как показ отладочного стека, переменных, управление точками останова и т.д.
Рисунок 3. Локальная отладка приложения
Рисунок 3. Локальная отладка приложения
4. Экспортировать Java-проекта
Мы будем использовать это приложение в качестве примера отладки. Для этого щелкните правой клавишей мыши на Java-проекте, выберите Export (экспортировать), затем Java, затем JAR file (JAR-файл) или Runnable JAR file (исполняемый JAR-файл), чтобы экспортировать проект. JAR-файл будет сгенерирован в указанном месте. Если исходный код Java не совпадает с отлаживаемым приложением, функции отладки будут работать неправильно.
5. Вручную запустить Java-приложение
Для этого нужно открыть консоль и запустить приложение вручную, чтобы убедиться, что среда исполнения Java сконфигурирована правильно.
Листинг 5. Пример вызова Java приложения
java -jar test.jar
6. Удаленная отладка приложения
Для этого необходимо скопировать файл JAR в нужное место на удалённом компьютере, или даже на локальном компьютере, вызвать отладочный сервер и подключить к нему клиент. Простое Java-приложение может работать как отладочный сервер или клиент. В зависимости от конфигурации в Eclipse можно выбрать тип соединения: Socket Attach или Socket Listen. В следующих двух разделах будет рассказано, как запустить приложение в качестве клиента или сервера.

Целевая виртуальная машина работает как отладочный сервер

В следующем примере удалённое Java-приложение работает как отладочный сервер и ожидает подключения к сокету на порту 8000. Целевая виртуальная машина будет приостановлена до тех пор, пока не подключится отладчик.

Листинг 6. Пример использования виртуальной машины в режиме ожидания подключения к сокету в Eclipse
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address="8000" -jar 
     test.jar

Запустите Eclipse, используя конфигурацию запуска и указав адрес виртуальной машины удалённого приложения. Чтобы это сделать, выберите в меню Run (запустить) > Debug Configurations (конфигурации отладки) и дважды щёлкните на элементе Remote Java Application (удаленное Java-приложение). В только что созданной конфигурации запуска задайте IP и порт целевого приложения. Чтобы запустить удалённое приложение на этой же машине, можно просто задать IP-адрес как localhost или 127.0.0.1.

Рисунок 4. Конфигурирование подключения к сокету отладочного сервера
Рисунок 4. Конфигурирование подключения к сокету отладочного сервера

Чтобы остановить виртуальную машину, к которой выполняется подключение, в настройках отладки приложения нужно выбрать опцию Allow termination of remote VM (разрешить выключение удаленной машины).

Рисунок 5. Кнопка остановки в Eclipse
Рисунок 5. Кнопка остановки в Eclipse

Целевая виртуальная машина работает как отладочный клиент

Второй пример - это использование простого Java приложения, которое работает как отладочный клиент, а внешний отладчик действует как отладочный сервер. Для ожидания подключений Eclipse использует режим с сокетами, к которым можно подключаться (socket listen-mode). Внешний отладчик должен быть запущен раньше, чтобы начать прослушивать заданный порт. На рисунке 6 показаны настройки конфигурации для ожидания подключений.

Рисунок 6. Конфигурация для создания сокета с возможностью подключения
Рисунок 6. Конфигурация для создания сокета с возможностью подключения

Если нажать на кнопку Debug (отладка) на панели инструментов Eclipse, в строке состояния будет показано сообщение "waiting for vm to connect at port 8000..." (ожидание подключения на порту 8000). После этого нужно запустить удалённое приложение. В листинге 7 показано, как запустить Java-приложение в режиме отладочного клиента и соединить его с запущенным приложением-отладчиком, сокет которого находится на хосте 127.0.0.1 на 8000 порту.

Листинг 7. Пример использования виртуальной машины в режиме ожидания подключений в Eclipse
    java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000,suspend=y 
         -jar test.jar

Если всё сделано правильно, будет показана набор окон Eclipse, используемый для отладки приложений, а исполнение удалённого Java приложения будет нормально остановлено. Это похоже на шаг 3 при локальной отладке (см. рисунок 3). На этой стадии можно использовать стандартные функции отладки, такие как установка точек останова и значений, пошаговое выполнение и т.д.


В статье было показано, как можно использовать встроенные типы конфигураций Eclipse для удалённого Java-приложения, чтобы сделать возможной удалённую отладку приложения. Было показано, как настроить Java-приложение для включения удалённой отладки, и рассказано, какие типы объектов-коннекторов поддерживает Eclipse. Наконец, было показано, как применить эту технологию к реальным проектам.

Ресурсы

Научиться

Получить продукты и технологии

  • Java 2 Standard Edition V5 или более свежие версии можно получить на Web-сайте Sun Microsystems.(EN)
  • Последние версии продуктов на основе технологии Eclipse на портале IBM alphaWorks.(EN)
  • Загрузите платформу Eclipse и другие проекты с Web-сайта Eclipse Foundation.(EN)
  • Загрузите ознакомительные версии продуктов IBM и получите доступ к инструментам для разработки и отладки приложений, а также ПО связующего уровня DB2®, Lotus®, Rational®, Tivoli® и WebSphere®.(EN)
  • Усовершенствуйте свой проект с открытым исходным кодом с помощью ознакомительных версий ПО от IBM, которые можно скачать с сайта или заказать на DVD.(EN)
  • IBM trial software: ознакомительные версии программного обеспечения для разработчика, которые можно загрузить со страницы developerWorks.(EN)

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Технология Java
ArticleID=461666
ArticleTitle=Удаленная отладка Java-приложений с помощью Eclipse
publish-date=01152010