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

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

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

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

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

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

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

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

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

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

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

    И, чтобы передать агент 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.

    Interesting Posts

    Как узнать, подключен ли Wi-Fi на Android?

    close () не закрывает гнездо правильно

    Дополнительные параметры C # для переопределенных методов

    частые проблемы, возникающие в представлении android, Анализ ошибок XML: несвязанный префикс

    Преобразование формата даты Java – получение неправильного месяца

    Где можно загрузить JSTL jar

    Два связанных вопроса об фильтрах заголовков столбцов jqGrid и расширенном диалоговом окне фильтрации

    Как маршрутизатор знает, куда пересылать пакет

    Ограничения квоты для Android Geocoder

    Как использовать отладчик сети chrome с переадресацией

    обнаружена ошибка segfault в R

    Отображение динамического изображения из базы данных с помощью p: graphicImage и StreamedContent

    Как установить Json.Net в качестве сериализатора по умолчанию для службы WCF REST

    Сделать неизменным объект Java

    Получение изображения по умолчанию Все URL-адрес профиля из Facebook Graph API

    Давайте будем гением компьютера.