La conversión de BCI (índices de código de bytes) para los números de línea de código fuente

StackOverflow https://stackoverflow.com/questions/3479270

Pregunta

Estoy escribiendo código JVMTI al perfil programas Java, que en su mayoría implica la obtención de trazas de la pila de hilos al azar a intervalos de tiempo fijos utilizando el AsyncGetCallTrace función. Por lo tanto, soy capaz de obtener estructuras CallTrace, cada uno de los cuales contiene una matriz de estructuras marco del indicativo, que contienen datos sobre los marcos individuales de un seguimiento de la pila. Específicamente, estos datos consisten en: jmethodID id_método (el ID del método java donde se encuentra el marco), y: lineno jint (la BCI del método en el archivo .class, por lo que yo entiendo la documentación). Parece que no puedo encontrar una manera de convertir este "lineno" en el número de línea del código fuente correspondiente utilizando el marco JVMTI (ver jvmti.h archivo, ubicado en / usr / lib / jvm / java-6-sun / incluir, al menos, en Linux). De hecho, incluso fuera del marco JVMTI, lo único que pude encontrar en la web hasta ahora estaba aquí: http://jakarta.apache.org/bcel/apidocs/org/apache/bcel/classfile/LineNumberTable.html , pero incluso esto puede no estar haciendo lo que yo le gustaría, y requiere una instalación adicional, y hace que me procesar los datos, que se generó por el código C ++ JMVTI, utilizando un programa Java por separado.

Si alguien sabe cómo convertir BCI a números de líneas de código fuente desde dentro JVMTI (o incluso de alguna manera), 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.]

¿Fue útil?

Solución

supongo que algo cuenta de esto. El método principal para uso es jvmti-> GetLineNumberTable (...), que se llena una matriz jvmtiLineNumberEntry. Dado el número de línea BCI n (que es para ser asignado a un número de línea de origen), se puede probar para la cual int i es: jvmtiLineNumberEntryArray [i] <= n

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 precisas de código fuente, no son todavía exacta , porque BCI los originales no son exactos. ¿Por qué esto es, no sé. Tenía la esperanza de utilizar el generador de perfiles de Sun Studio, que también utiliza AsyncGetCallTrace, para comprobar si los números de línea devueltos serían los mismos, ya que son para mi generador de perfiles. En ese caso, la función AsyncGetCallTrace está incorrecto. Pero hasta ahora, mediante el Sun Studio se convirtió en un reto en sí mismo. Si alguien sabe cómo utilizar esta herramienta, por favor ayuda!

Una captura más grande es que los métodos de Java son a menudo entre líneas, por lo que los números de línea no siempre asignar correctamente. De hecho, esto podría ser la causa del problema descrito en el párrafo anterior, aunque esto parece poco probable en base a los números que he estado viendo. Aquí hay alguna información acerca de la solución del problema inlining: http://developer.amd.com /documentation/articles/pages/JVMTIEventPiggybacking.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top