Удаленная отладка Java, как она работает технически?

Мне очень нравятся удаленные средства отладки JVM. Но мне интересно, как это работает внутри.

Мое предположение: это выполняется с помощью функции JVM, в которой запущенный процесс загружает/использует исходный код от подключенного удаленного отладчика (например, IDE). Он знает строку текущей трассировки стека и затем может перейти к соответствующая точка останова IDE. Передача трассировки стека и интроспекция состояния приложения выполняется либо через сокеты, либо совместно используемую память (настройка удаленного отладчика).

Есть ли у кого-нибудь интересные ссылки/ресурсы?

Ответ 1

Отладочные функции JVM предоставляются через Java Debugger Architecture (JPDA).

Сам JPDA состоит из следующего:

  • Интерфейс виртуальной машины Java (JVM TI) - собственный программный интерфейс для использования инструментов. Этот интерфейс позволяет осуществлять государственную проверку и помогает контролировать поток выполнения в рамках debuggee.
  • Java Debug Wire Protocol (JDWP) - используется для определения связи между процессами отладчика и debuggee.
  • Интерфейс Java Debug (JDI) - этот интерфейс позволяет разработчикам инструментов писать удаленные приложения отладчика.

Диаграмма, приведенная в структуре архитектуры JPDA, является хорошей отправной точкой. Дополнительные места для поиска будут руководства, перечисленные на странице JPDA.

Ответ 2

Архитектура отладки Java называется JPDA. Вероятно, вы захотите прочитать документацию JPDA . В частности, Проходной раздел дает пример интерфейса IDE с JDI для получения значения в стеке.

Ответ 3

Отладка Eclipse начинается с того, что называется агентом.

JVM, который запускает подчиненные ".class" источники, имеет функцию, которая позволяет во время выполнения вставлять внешние библиотеки (написанные на Java или С++) в JVM. Эти внешние библиотеки называются агентами, и у них есть возможность изменять содержимое файлов .class. Эти агенты имеют доступ к функциональным возможностям JVM, которые недоступны из обычного Java-кода, запущенного внутри JVM, и их можно использовать для создания интересных вещей, таких как инъекция и изменение исходного кода, профилирование и т.д. Некоторые инструменты, такие как JRebel (используются для горячей замены кода) использует эту функциональность для достижения своей магии.

И чтобы передать Lib Lib в JVM, вы делаете это с помощью аргументов запуска, используя

agentlib:libname[=options]

Мы фактически передавали агент Lib по имени jdwp в JVM, работающий с Tomcat. Jdwp представляет собой специфическую JVM, необязательную реализацию JDWP (Java Debug Wire Protocol), который используется для определения связи между отладчиком и запущенной JVM. Его реализация, если она присутствует, предоставляется как родная библиотека JVM как jdwp.so или jdwp.dll

И что он делает? Проще говоря, агент jdwp, который мы передаем, в основном служит функцией связи между экземпляром JVM, запускающим приложение, и отладчиком (который может быть расположен как удаленно, так и локально). Так как это библиотека агентов, у нее есть возможность перехватить запущенный код, создать мост между JVM и отладчиком и использовать функциональность отладчика, применяемого к JVM. Поскольку в JVM-архитектуре функциональность отладки не найдена в самой JVM, но отвлечена на внешние инструменты (которые точно называются отладчиками), эти инструменты могут либо находиться на локальной машине, на которой JVM отлаживается, либо запускается из am внешний машина. Именно эта несвязанная модульная архитектура позволяет нам иметь JVM, запущенную на удаленной машине и использующую JDWP, иметь удаленный отладчик, способный к общению с ней.

Таким образом, отладчик Eclipse работает короче.