Umwandeln BCI (Bytecode Indizes) Quellcodezeilennummern
-
28-09-2019 - |
Frage
Ich schreibe JVMTI Code von Java-Programme profilieren, die meist zur Folge Spuren von zufälligen Fäden in festen Zeitintervallen Stapel Erhalt der Funktion AsyncGetCallTrace verwenden. So, kann ich CallTrace Strukturen zu erhalten, von denen jede eine Anordnung von CallFrame Strukturen enthält, die Daten zu den einzelnen Frames in einem Stapelüberwachung enthalten. Genauer gesagt, bestehen diese Daten aus: jmethodID method_id (die ID der Java-Methode, bei der der Rahmen angeordnet ist), und: JINT lineno (die BCI des Verfahrens in der Class-Datei, so weit wie ich die Dokumentation zu verstehen). Ich kann nicht scheinen, einen Weg zu finden, um dieses „lineno“ in die entsprechende Quellencode-Zeilennummer mit dem JVMTI Rahmen zu umwandeln (Datei jvmti.h, befindet sich in / usr / lib / jvm / java-6-sun / umfassen zumindest sehen unter Linux). In der Tat, auch außerhalb des JVMTI Rahmen, das einzige, was ich im Internet finden konnte bisher war hier:
Lösung Ich glaube, ich diese heraus etwas dachte. Das Hauptverfahren zu verwenden ist jvmti-> GetLineNumberTable (...), die ein Array jvmtiLineNumberEntry auffüllt. Angesichts der BCI Zeilennummer n (die mit einer Quelle Zeilennummer abgebildet werden soll), kann ein Test für die int i ist: jvmtiLineNumberEntryArray [i] <= n Ein Haken ist, dass AsyncGetCallTrace, aus irgendeinem Grund, konsequent seltsam BCIs zurückkehrt, so dass, obwohl die Abbildung gibt präzise Quellcodezeilennummern, sind sie noch nicht genau , weil die ursprünglichen BCIs sind nicht korrekt. Warum dies ist, weiß ich nicht. Ich hatte gehofft, das Sun Studio Profiler zu verwenden, die auch AsyncGetCallTrace verwendet, zu prüfen, ob die zurückgegebenen Zeilennummern würden die gleichen sein, wie sie für meine Profiler sind. In diesem Fall ist die AsyncGetCallTrace Funktion ungenau. Aber so weit, mit der Sun Studio verwandelte sich in eine Herausforderung für sich. Wenn jemand weiß, wie man verwenden Sie dieses Werkzeug, BITTE HILFE! Eine größere Haken ist, dass Java-Methoden oft inlined sind, so Zeilennummern nicht immer korrekt abzubilden. In der Tat könnte dies die Ursache für das im Absatz beschriebenen Problem oben, obwohl dies auf der Grundlage der Zahlen unwahrscheinlich scheint, dass ich sehen habe. Hier sind einige Informationen über die inlining Problemlösung: http://developer.amd.com /documentation/articles/pages/JVMTIEventPiggybacking.aspx