Удаленная отладка Java, как это работает технически? - PullRequest
56 голосов
/ 28 августа 2010

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

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

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

Ответы [ 3 ]

43 голосов
/ 28 августа 2010

Функции отладки JVM предоставляются через Архитектура отладчика платформы Java (JPDA) .

Сама JPDA состоит из следующих элементов:

  • Java Virtual Machine Tool Interface (JVM TI) - нативный интерфейс программирования для инструментов, которые можно использовать. Этот интерфейс позволяет проверять состояние и помогает контролировать поток выполнения в отладчике.
  • Java Debug Wire Protocol (JDWP) - используется для определения связи между процессами отладчика и отладчика.
  • Java Debug Interface (JDI) - этот интерфейс позволяет разработчикам инструментов создавать приложения для удаленного отладчика.

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

11 голосов
/ 12 января 2016

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

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

А чтобы передать Agent 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, либо запускаться с внешней машины. Именно эта разделенная модульная архитектура позволяет нам запускать JVM на удаленной машине и использовать JDWP, а также иметь возможность удаленного отладчика общаться с ним.

Вот как работает отладчик Eclipse.

9 голосов
/ 28 августа 2010

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

...