Java JVMTI не работает вместе с -Xdebug -Xrunjdwp

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

Я установил компоненты TPTP (4.6.0) в свой Eclipse (Galileo) Workbench вместе с Agent Controller в соответствии с инструкции на веб-сайте. Чтобы включить агента, я добавил следующие параметры командной строки, которые запускают экземпляр 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]

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

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

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

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

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

Ответ 1

Ни один из ответов до сих пор не верен, и это первый хит, который появляется в 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) - это клиентский интерфейс (отладчик), который предоставляет некоторые функции JVMTI при использовании более прозрачного JDWP.

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

Дополнительная информация здесь: http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rzaha/jpdebuga.htm

Ответ 2

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

Ответ 3

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