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.