null

Debug war файлов

Зачастую существует необходимость провести отладку кода. Многие люди привыкли делать это из любимой IDE, однако не всегда есть возможность запустить приложений из IDE в debug режиме. Рассмотрим вариант запуска java приложения, представленного war файлом, который содержит встроенный jetty.

 

Для того, чтобы понять что из себя представляет процесс запуска приложения в режиме отладки, рассмотрим такое понятие как JPDA. JPDA - Java Platform Debugger Architecture. JPDA - многоуровневая архитектура, разработанная для упрощения отладки приложения. 

JPDA состоит из следующих слоёв:

  • интерфейс JVM TI
  • протокол JDWP
  • интерфейс JDI 

По сути в Sun для отладки применяли клиент-серверную архитектуру. У JVM есть интерфейс JVM TI (JVM Tool Interface), в котором определено то, что JVM может предоставить для отладкию Важное замечание: JVM TI появился начиная с пятой версии Java. До этого был интерфейс JVM DI.

JDI (Java Debug Interface) - это высокоуровневый Java интерфейс для создания инструментов отладки. Полагаю, что если вы не пишите свою IDE или иные инструменты для JVM, то вам достаточно знания того что он существуют, и используется, например, вашей IDE.

Последним является пртокол JDWP (Java Debug Wire Protocol). Он описывает протокол передачи отладочной информации между отлаживаемым приложением (debugee) и инструментом отладки (debugger front-end).  

 

 

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

 Если вы пользуетесь свежей версией Java (>= 5), то запуск вашего приложения в режиме отладки будет осуществляться следующим образом:

java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n -jar myApplication.war

 В этой строке запуска присутствует ключ "agentlib", который имеет следующий формат 

-agentlib:libname[=options]

Этот ключ говорит о том, что необходимо при старте JVM загрузить соответствующий native Java agent (в нашем случае это файл jdwp.so взятый из директорий описанных в LD_LIBRARY_PATH).

Теперь коротко пройдёмся по опциям:

  •  transport - описываект каким способом происходит подключение в общем случае этой подключение через сокет (значение dt_socket). Есть ещё варианты с использованием общения через общую память, но это достаточно специфичная штука, которая вам скорее всего не появится.
  • server - описывает в каком режиме запуститься. Т.к. мы хотим, чтобы к нашему приложению можно было подключиться до отладки, то оно должно быть сервером. Поэтому значение 'y'.
  • address - куда подключаться для отладки. Если же запускается в режиме сервера, то этот параметр означает какой-то порт будет слушать виртуальная машина для получения команд от отладчика
  • suspend - если значение 'y', то VM после запуска не начнёт исполнение пока не подключится программа отладчик.

До 5ой версии Java ключа agentlib не было, поэтому для отладки использовались следующие ключи

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000 myApp.war

 

Ключ debug включал режим отладки, а runjdwp настраивал протокол общения.

После выполнения соответствующей команды у вас должна появиться возможность подключиться к своёму приложению через удобный для вас инструмент для отладки. Например в intellij idea можно будет подключиться к локальному процессу, который висит на указанном порту (в нашем случае 8000). При условии конечно, что запущено оно было на одной машине. Для подключения к другому хосту необходимо воспользоваться соответсвующими возможностями отладчика для подключения к удаленной машине.

 

На этом, пожалуй, откланяюсь.