Spec-Zone .ru
спецификации, руководства, описания, API
|
Много VMs кроме Java HotSpot VM реализуют TI JVM. Ссылочная реализация бэкэнда была портирована на другие платформы. И есть клиенты TI JVM кроме бэкэнда, наиболее особенно агенты для приложений, которые позволяют отлаживать и собственного и код языка программирования Java, и таким образом нуждаются в собственном управлении уровнем и информации. Мы не знаем ни о каких реализациях чистой комнаты бэкэнда, хотя это возможно - и большая работа.
TI JVM проблематичен, чтобы реализовать в некотором VMs. JDWP реализуется непосредственно в таком VMs. На клиентской стороне приложение, записанное на языке кроме языка программирования Java, возможно, не оптимальный кандидат на использование JDI. Некоторые хотели быть клиентами JDWP.
JDI мог быть реализован системой со статичным представлением приложения. Это могло быть реализовано системой с механизмом, совершенно отличающимся чем JDWP/front-end для того, чтобы собрать информацию или управлять VM.
Через каждый интерфейс есть два класса действия: запросы и события. Запросы происходят на стороне отладчика и включают запросы для информации, установки изменений состояния в удаленном VM/application, и установки отладки состояния. События происходят на стороне отлаживаемой программы и обозначают изменения состояния в удаленном VM/application.
Давайте идти через пример. Пользователь щелкает по локальной переменной в представлении стека в IDE, запрашивая его значение. IDE использует JDI, чтобы получить значение, в особенности это вызывает getValue
метод, например:
theStackFrame.getValue(theLocalVariable)Где
theStackFrame
a com.sun.jdi.StackFrame
и theLocalVariable
a com.sun.jdi.LocalVariable
. Фронтэнд тогда отправляет этот запрос по коммуникационному каналу (скажем, сокет) к бэкэнду, работающему в процессе отлаживаемой программы. Это отправляет это, форматируя это в поток байтов в соответствии с JDWP. В частности это отправляет команду GetValues (значение байта: 1) в наборе команд StackFrame (значение байта: 16), сопровождаемый ID потока, ID фрейма, и т.д.
Бэкэнд дешифрует поток байтов и отсылает запрос к VM через TI JVM. В частности скажем, требуемое значение является целым числом, следующий вызов функции TI JVM делается:
error = jvmti->GetLocalInt(frame, slot, &intValue);Бэкэнд отсылает назад через сокет, пакет ответа, который будет включать значение
intValue
, и который будет отформатирован согласно JDWP. Фронтэнд дешифрует пакет ответа и возвращает значение как значение getValue
вызов метода. IDE тогда выводит на экран значение. Запросы, чтобы изменить состояние отладки обрабатываются подобным образом. Например, запрос, чтобы установить точку останова проходит через те же самые шаги - хотя, конечно, вызванные методы JDI, команды JDWP, отправленные, и вызванные функции TI JVM, отличаются. Дополнительно, фронтэнд и бэкэнд действительно более чем пихают данные назад и вперед, они отслеживают и планируют действие и преобразовывают, фильтруют, и информация о кэше, таким образом, запрос точки останова будет обработан вполне по-другому, чем получить запрос значения - но коммуникационная последовательность будет тем же самым.
Что происходит, когда приложение, отлаживаемое наконец, поражает эту точку останова? Это - то, где события играют роль. Виртуальная машина отправляет событие через интерфейс TI JVM. В частности это вызывает функцию обработки событий передача точки останова:
Бэкэнд установил функцию обработки событий, чтобы быть:
static void Breakpoint(jvmtiEnv *jvmti_env, JNIEnv* jni_env, jthread thread, jmethodID method, jlocation location) { ...Эта функция бэкэнда запускает цепочку действия, которое фильтрует событие, чтобы видеть, интересно ли это, ставит это в очередь, и отправляет это через сокет в формате JDWP, определенном для событий точки останова. Фронтэнд декодирует и обрабатывает событие, в конечном счете генерируя событие JDI. В частности событие JDI представляет это как a
com.sun.tools.jdi.event.BreakpointEvent
. IDE тогда получает событие, удаляя это из очереди событий: theEventQueue.remove()где
theEventQueue
a com.sun.jdi.event.EventQueue
. IDE, вероятно, обновит свои дисплеи, выполняя много вызовов запроса через JDI. Ссылочная реализация бэкэнда может обычно перемещаться в новую платформу с немного (несколько строк) или никакое изменение к источнику и затем перекомпилирована. Чтобы использовать новый VM на той же самой платформе, двоичный файл бэкэнда должен обычно работать - хотя, это не код языка программирования Java, таким образом, Вы никогда не знаете. Отметьте, что лицензирующие проблемы не охватываются этим документом.
Реализация фронтэнда пишется в языке программирования Java и будет работать на любой платформе или VM. Однако, у кода соединителя есть функциональность, которая, возможно, должна быть расширена для некоторых систем. Например, ссылочная реализация фронтэнда включает средство запуска, которое предполагает, что виртуальные машины запускаются, используя Java соглашения SE. Пользователь JDI может сконфигурировать любой синтаксис средства запуска, который он или она хочет, но обычно приложение отладчика предпочло бы оставлять это реализации JDI. Если бы различный тип канала связи требуется (последовательный, например), это также должно было бы быть добавлено, используя Интерфейс Поставщика услуг, представленный в JDK 5.0.