Java JVMTI не работает вместе с -Xdebug -Xrunjdwp - PullRequest
11 голосов
/ 14 октября 2009

Последние 4 часа я потратил на настройку памяти Eclipse TPTP. профилирование на экземпляре Tomcat, который должен запускаться удаленно (т.е. не в Затмение). Это должно быть возможно в соответствии с TPTP и агентом Контроллер документов.

Я установил компоненты TPTP (4.6.0) в свой Eclipse (Galileo) верстак, вместе с контроллером агента в соответствии с инструкция на сайте. Чтобы включить агент, я добавил следующие параметры командной строки, которая запускает экземпляр Tomcat:

-agentlib:JPIBootLoader=JPIAgent:server=enabled;HeapProf:allocsites=true

и добавил следующие каталоги в начало PATH:

D:\dev\tools\ac\plugins\org.eclipse.tptp.javaprofiler
D:\dev\tools\ac\bin

При попытке запустить Tomcat я постоянно получал следующую ошибку сообщение:

ERROR: JDWP unable to get necessary JVMTI capabilities. ["debugInit.c",L279]

Я много гуглил, но ничего не нашел; Я старался переустановка TPTP и различных версий контроллера агентов.

В итоге проблема оказалась в том, что я запускал Tomcat с опцией "jpda", которую catalina.bat переводит в

-Xdebug -Xrunjdwp:transport=.....

Удаление аргумента команды jpda заставило JVMTI начать работать.

ТАК, вопрос в том, что я ничего не нашел во время поисков указать, что агент JVMTI несовместим с отладкой. Можно кто-то объяснить, что происходит и почему JVMTI + JDWP не является действительным установка?

Ответы [ 3 ]

20 голосов
/ 18 мая 2011

Пока что ни один из ответов не является правильным, и это первый случай, который появляется в Google, если вы запросите указанную ошибку, поэтому я чувствую, что некоторые пояснения необходимы.

JVMTI и JDWP выполняют совместную работу, фактически они обычно должны использоваться вместе. Вы получите ERROR: JDWP unable to get necessary JVMTI capabilities, если -Xrunjdwp (и / или, возможно, -agentlib:jdwp) указано более одного раза в командной строке. Чтобы исправить это, убедитесь, что у вас есть только один из -Xrunjdwp или -agentlib:jdwp в командной строке.

Подробнее читайте в ...

JVMTI (интерфейс инструмента виртуальной машины Java) является преемником JVMDI (интерфейс отладки виртуальной машины Java) и JVMPI (интерфейс профилирования виртуальной машины Java). Он включает в себя функциональность как JVMDI, так и JVMPI, которые устарели в Java 5 и удалены в Java 6. Это API, который предоставляет внутреннюю часть JVM для целей отладки и профилирования.

JDWP (Java Debug Wire Protocol) - это протокол, описывающий простой механизм передачи команд и ответов. Насколько я знаю, это единственный способ для отладчика, сидящего вне JVM, общаться с ним и взаимодействовать с JVMTI.

JDI (Java Debugger Interface) - это API на стороне клиента (на стороне отладчика), который раскрывает некоторые функции JVMTI, в то же время используя JDWP более или менее прозрачно.

Ошибка , упомянутая в ответе Боба Доббса, касается вводящего в заблуждение сообщения об ошибке и того факта, что JVM будет пытаться загрузить JDWP один раз при каждом его указании в командной строке. Нигде не говорится, что JDWP и JVMTI не могут использоваться вместе.

Подробнее здесь: http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rzaha/jpdebuga.htm

3 голосов
/ 08 ноября 2010

Я столкнулся с той же проблемой, что и вы, но я подготовил отчет об ошибке JVM (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6354345), который пролил некоторый свет на эту проблему. Он в основном сводится к тому, что библиотека агентов Java никогда не предназначалась загружаться дважды в одну и ту же виртуальную машину. Отстой, но, похоже, это основное ограничение системы агентов, которое нельзя делать обоими одновременно.

1 голос
/ 22 января 2014

Для меня это была та же проблема, что и в сообщении Code Bling, они были дублированы -Xrunjdwp, но я не знал, что была вторая -Xrunjdwp, поскольку она была скрыта в переменной %JAVA_OPTIONS%, проверьте скрипт запуска сервера приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...