2009-10-13 16 views
11

pasé las últimas 4 horas tratando de establecer la memoria Eclipse TPTP perfilado en una instancia de Tomcat que se deben ejecutar de forma remota (es decir, no en Eclipse). Esto debería ser posible según los documentos del controlador TPTP y agente .Java JVMTI no funciona junto -Xdebug -Xrunjdwp

Instalé los componentes TPTP (4.6.0) en mi banco de trabajo Eclipse (Galileo) , junto con el controlador del agente de acuerdo con las instrucciones en el sitio web. Para habilitar el agente, añadí los siguientes opciones para la línea de comando que inicia la instancia de Tomcat:

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

y añadido los siguientes directorios en la parte delantera de la RUTA:

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

Al intentar iniciar Tomcat llegué constantemente el siguiente error mensaje:

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

hice un montón de buscar en Google pero no encontré nada releva Nuevo Testamento; Intenté reinstalar TPTP y varias versiones del Agent Controller.

Al final, el problema resultó ser que estaba empezando Tomcat con la opción "jpda", lo que se traduce en catalina.bat

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

Extracción de la "jpda" argumento de comando para iniciar causó JVMTI trabajando.

Entonces, la pregunta es: no he encontrado nada durante cualquiera de mis búsquedas a indican que un agente JVMTI es incompatible con la depuración. ¿Puede alguien explicar qué está pasando y por qué JVMTI + JDWP no es una configuración válida de ?

Respuesta

20

Ninguna de las respuestas hasta ahora es correcta y este es el primer golpe que aparece en Google si consulta el error mencionado, por lo que creo que se necesita alguna aclaración.

JVMTI y JDWP do trabajan juntos, de hecho, generalmente deben usarse juntos. Obtendrá ERROR: JDWP unable to get necessary JVMTI capabilities si -Xrunjdwp (y/o posiblemente -agentlib:jdwp) se especifica más de una vez en la línea de comando. Para solucionarlo, asegúrese de tener solo uno de -Xrunjdwp o -agentlib:jdwp en su línea de comando.

Para más detalles, sigue leyendo ...

JVMTI (interfaz de la herramienta de Java Virtual Machine) es el sucesor de JVMDI (Java Virtual Machine interfaz de depuración) y JVMPI (Java Virtual Machine Interface de perfiles). Incorpora la funcionalidad tanto de JVMDI como de JVMPI, ambas desaprobadas en Java 5 y eliminadas en Java 6. Es la API la que expone los aspectos internos de la JVM con fines de depuración y creación de perfiles.

JDWP (Java Debug Wire Protocol) es un protocolo que describe un mecanismo simple para transmitir comandos y respuestas. Por lo que yo sé, es la única forma de que un depurador sentado fuera de la JVM se comunique con él y se conecte con la JVMTI.

JDI (Java Debugger Interface) es una API del lado del cliente (lado del depurador) que expone algunas de las características de JVMTI mientras hace uso de JDWP de forma más o menos transparente.

El bug mencionado en la respuesta de Bob Dobbs se refiere el mensaje de error equivocado, y el hecho de que la JVM intentará cargar JDWP una vez por cada vez que se especifica en la línea de comandos. No dice en ningún lugar que JDWP y JVMTI no se pueden usar juntos.

Más información aquí: http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rzaha/jpdebuga.htm

+0

entonces, ¿es posible usar la depuración remota con el perfilado simultáneamente? –

+1

@michael Creo que sí, pero a menos que esté tratando de imitar algunas condiciones extrañas en un intento de reproducir una fuga de memoria o un pico de CPU gigante, ¿no es una mala idea perfilar mientras se depura el sonido? –

+0

Gran respuesta. Estaba recibiendo este error Tuve que deshabilitar el modo de depuración en mi antiguo Sun App Server antes de poder hacer que la configuración del perfilador YourKit funcionara con él. ¡Gracias! – jlpp

3

Me encontré con el mismo problema que usted, pero se me ocurrió un informe de error de JVM (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6354345) que arrojó algo de luz sobre el tema. Básicamente, se trata de la biblioteca del agente de Java que no está destinada a cargarse dos veces en la misma máquina virtual. Apesta, pero parece que es una limitación básica del sistema agente que no puedes hacer ambas cosas al mismo tiempo.

+0

Gracias por la información. –

1

para mí fue el mismo problema que Bling Código postal, que eran duplicados -Xrunjdwp no se dieron cuenta que había una segunda -Xrunjdwp ya que estaba oculto en la variable %JAVA_OPTIONS%, averigüe si en su Script de inicio del servidor.