2010-08-13 11 views
5

Estoy escribiendo código JVMTI para perfilar programas Java, que en su mayoría implica obtener trazados de pila de hilos aleatorios a intervalos de tiempo fijos utilizando la función AsyncGetCallTrace. Por lo tanto, puedo obtener estructuras de CallTrace, cada una de las cuales contiene una matriz de estructuras CallFrame, que contienen datos sobre marcos individuales en un seguimiento de pila. Específicamente, estos datos consisten en: jmethodID method_id (el ID del método java donde se encuentra el fotograma), y: jint lineno (el BCI del método en el archivo .class, por lo que entiendo la documentación). Parece que no puedo encontrar la forma de convertir este "lineno" en el número de línea del código fuente correspondiente utilizando el marco JVMTI (ver el archivo jvmti.h, ubicado en/usr/lib/jvm/java-6-sun/include, al menos en Linux). De hecho, incluso fuera del marco JVMTI, lo único que pude encontrar en la web hasta ahora fue aquí: http://jakarta.apache.org/bcel/apidocs/org/apache/bcel/classfile/LineNumberTable.html, pero incluso esto puede no estar haciendo lo que me gustaría, y requiere una instalación adicional, Y requiere que procese los datos, que fue generado por el código C++ JMVTI, usando un programa separado de Java.Convirtiendo BCI (índices de códigos de bytes) a números de línea de código fuente

Si alguien sabe cómo convertir BCI a números de línea de código fuente desde dentro de JVMTI (¡o incluso de cualquier forma), por favor ayuda!

[Si alguien conoce bien este campo, por favor hágamelo saber, ya que tengo un par de preguntas para preguntar sobre el proceso.]

Respuesta

5

supongo que algo cuenta de esto. El método principal para usar es jvmti-> GetLineNumberTable (...), que llena una matriz jvmtiLineNumberEntry. Dado el número de línea BCI n (que se asignará a un número de línea de origen), se puede probar para qué int i es: jvmtiLineNumberEntryArray [i] < = n < jvmtiLineNumberEntryArray [i + 1]. Este int i es entonces el número de línea del código fuente correspondiente deseado.

Un problema es que AsyncGetCallTrace, por alguna razón, vuelve constantemente BCI extraños, por lo que aunque el mapeo da números de líneas de código fuente precisa, todavía no son exactos , debido a que los BCI originales no son exactos. Por qué es esto, no sé. Esperaba usar el generador de perfiles de Sun Studio, que también usa AsyncGetCallTrace, para probar si los números de línea devueltos serían los mismos que para mi generador de perfiles. En ese caso, la función AsyncGetCallTrace es inexacta. Pero hasta ahora, usar Sun Studio se convirtió en un desafío propio. SI ALGUIEN SABE CÓMO UTILIZAR ESTA HERRAMIENTA, ¡AYUDA!

Un problema mayor es que los métodos Java a menudo están en línea, por lo que los números de línea no siempre se asignan correctamente. De hecho, esto PODRÍA ser la causa del problema descrito en el párrafo anterior, aunque esto parece poco probable en función de los números que he estado viendo. Aquí hay información sobre cómo resolver el problema de alineación: http://developer.amd.com/documentation/articles/pages/JVMTIEventPiggybacking.aspx

Cuestiones relacionadas