Domanda

Sto scrivendo il codice JVMTI al profilo programmi Java, che comporta principalmente all'ottenimento stack da fili casuali ad intervalli di tempo fissi utilizzando la funzione AsyncGetCallTrace. Così, sono in grado di ottenere strutture CallTrace, ognuno dei quali contiene un array di strutture CallFrame, che contengono dati relativi a singoli fotogrammi in una traccia dello stack. Specificamente, questi dati sono costituiti da: jmethodID method_id (l'ID del metodo java dove si trova il telaio), e: jint lineno (la BCI del metodo nel file .class, per quanto comprendo la documentazione). Io non riesco a trovare un modo per convertire questo "lineno" nel corrispondente numero di riga del codice sorgente utilizzando il framework JVMTI (vedi file jvmti.h, si trova in / usr / lib / jvm / java-6-sun / include, almeno su Linux). In realtà, anche al di fuori del quadro JVMTI, l'unica cosa che sono riuscito a trovare sul web finora è stato qui: http://jakarta.apache.org/bcel/apidocs/org/apache/bcel/classfile/LineNumberTable.html , ma anche questo non può fare quello che vorrebbe, e richiede installazione supplementare, e mi richiede di elaborare i dati, che è stato generato da codice C ++ JMVTI, utilizzando un programma Java a parte.

Se qualcuno sa come convertire BCI per i numeri di riga di codice sorgente all'interno di JVMTI (o anche in qualsiasi modo), si prega di aiuto!

[Se qualcuno conosce bene questo settore, per favore fatemelo sapere, dal momento che ho un paio di domande da porre circa il processo.]

È stato utile?

Soluzione

Credo di un po 'capito questo. Il metodo principale per uso sia jvmti-> GetLineNumberTable (...), che riempie una matrice jvmtiLineNumberEntry. Dato il numero di riga BCI n (che deve essere associato a un numero di linea di source), si può verificare che int i è: jvmtiLineNumberEntryArray [i] <= n

Un problema è che AsyncGetCallTrace, per qualche ragione, ritorna costantemente BCI strani, quindi anche se la mappatura dà precise i numeri di riga di codice sorgente, non sono ancora accurate , a causa le BCI originali non sono precisi. Perché questo è, non lo so. Speravo di usare il profiler Sun Studio, che utilizza anche AsyncGetCallTrace, per verificare se i numeri di riga restituiti sarebbe lo stesso come lo sono per il mio profiler. In tal caso, la funzione AsyncGetCallTrace è imprecisa. Ma finora, utilizzando il Sun Studio si trasformò in una sfida a sé stante. Se qualcuno sa come utilizzare questo strumento, per favore aiutatemi!

Un catch più grande è che i metodi Java sono spesso inline, quindi i numeri di riga non sempre mappa correttamente. In realtà, questo potrebbe essere la causa del problema descritto nel paragrafo precedente, anche se questo sembra improbabile sulla base dei numeri Ho visto. Ecco alcune informazioni sulla risoluzione del problema inlining: http://developer.amd.com /documentation/articles/pages/JVMTIEventPiggybacking.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top