Question

Je suis en train d'écrire le code JVMTI au profil des programmes Java, ce qui implique la plupart du temps obtenir des traces de pile de fils aléatoires à des intervalles de temps fixes en utilisant la fonction AsyncGetCallTrace. Ainsi, Il est possible d'obtenir des structures CallTrace, dont chacune contient une matrice de structures CallFrame, qui contiennent des données sur les images individuelles dans une trace de pile. , Consistent ces données en particulier de: jmethodID method_id (l'ID de la méthode java où le cadre se trouve), et: JINT lineno (la BCI de la méthode du fichier .class, pour autant que je comprends la documentation). Je ne peux pas sembler trouver un moyen de convertir cette « lineno » dans le numéro de ligne de code source correspondant en utilisant le cadre JVMTI (voir fichier jvmti.h, situé dans / usr / lib / jvm / java-6-sun / inclure, au moins sous Linux). En fait, même en dehors du cadre JVMTI, la seule chose que je pouvais trouver à ce jour était sur le web ici:

Était-ce utile?

La solution

Je crois que je peu compris cela. La principale méthode d'utilisation est jvmti-> GetLineNumberTable (...), qui remplit une matrice jvmtiLineNumberEntry. Compte tenu du nombre de lignes de BCI n (qui doit être mis en correspondance avec un numéro de ligne de la source), on peut tester pour lesquels int i est: jvmtiLineNumberEntryArray [i] <= n

Un hic est que AsyncGetCallTrace, pour une raison quelconque, revient constamment BCIs étranges, de sorte que même si la mise en correspondance donne précis numéros de lignes de code source, ils ne sont toujours pas précis , parce que les BCIs d'origine ne sont pas exacts. Pourquoi est-ce, je ne sais pas. J'espérais utiliser le Sun Studio profileur, qui utilise également AsyncGetCallTrace, pour vérifier si les numéros de ligne retournés seraient les mêmes que pour les ma profileur. Dans ce cas, la fonction AsyncGetCallTrace est inexacte. Mais jusqu'à présent, en utilisant le Sun Studio transformé en un défi propre. SI QUELQU'UN SAIT COMMENT UTILISER CET OUTIL, S'IL VOUS PLAÎT AIDE!

Une plus grande prise est que les méthodes Java sont souvent inline, si les numéros de ligne ne correspondent pas toujours correctement. En fait, cela pourrait être la cause du problème décrit dans le paragraphe ci-dessus, bien que cela semble peu probable d'après les chiffres que j'ai été voir. Voici quelques informations sur la résolution du problème inline: http://developer.amd.com /documentation/articles/pages/JVMTIEventPiggybacking.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top