Преобразование BCI (индексы байт-кода) в номера строк исходного кода - PullRequest
6 голосов
/ 13 августа 2010

Я пишу код JVMTI для профильных программ Java, что в основном влечет за собой получение трассировки стека от случайных потоков через фиксированные промежутки времени, используя функцию AsyncGetCallTrace.Таким образом, я могу получить структуры CallTrace, каждая из которых содержит массив структур CallFrame, которые содержат данные об отдельных кадрах в трассировке стека.В частности, эти данные состоят из: jmethodID method_id (идентификатор метода java, в котором расположен фрейм) и: jint lineno (BCI метода в файле .class, насколько я понимаю в документации).Кажется, я не могу найти способ преобразовать это "lineno" в соответствующий номер строки исходного кода, используя инфраструктуру JVMTI (см. Файл jvmti.h, расположенный в / usr / lib / jvm / java-6-sun / include, по крайней мере,в Linux).На самом деле, даже за рамками JVMTI, единственное, что я смог найти в Интернете до сих пор, было здесь: http://jakarta.apache.org/bcel/apidocs/org/apache/bcel/classfile/LineNumberTable.html,, но даже это может не делать то, что я хотел, и требует дополнительной установки, И требует от меняобработать данные, которые были сгенерированы кодом CM JMVTI, с использованием отдельной программы Java.

Если кто-нибудь знает, как преобразовать BCI в номера строк исходного кода изнутри JVMTI (или даже любым другим способом), помогите!

[Если кто-то хорошо знает это поле, пожалуйста, дайте мне знать, так как у меня есть еще несколько вопросов о процессе.]

1 Ответ

5 голосов
/ 20 августа 2010

Думаю, я кое-что понял. Основным методом для использования является jvmti-> GetLineNumberTable (...), который заполняет массив jvmtiLineNumberEntry. Учитывая номер строки BCI n (который должен быть сопоставлен с номером строки источника), можно проверить, для чего int i: jvmtiLineNumberEntryArray [i] <= n <jvmtiLineNumberEntryArray [i + 1]. Это int i - это требуемый соответствующий номер строки исходного кода. </p>

Одна загвоздка в том, что AsyncGetCallTrace по какой-то причине последовательно возвращает странные BCI, поэтому, хотя отображение дает точные номера строк исходного кода, они все еще не точные , потому что оригинал BCI не точны. Почему это я не знаю. Я надеялся использовать профилировщик Sun Studio, который также использует AsyncGetCallTrace, чтобы проверить, будут ли возвращенные номера строк такими же, как и для моего профилировщика. В этом случае функция AsyncGetCallTrace является неточной. Но до сих пор использование Sun Studio превратилось в собственную проблему. Если кто-либо знает, как использовать этот инструмент, пожалуйста, помогите!

Еще большая проблема в том, что методы Java часто встроены, поэтому номера строк не всегда отображаются правильно. Фактически, это МОЖЕТ быть причиной проблемы, описанной в параграфе выше, хотя это кажется маловероятным из-за цифр, которые я видел. Вот некоторая информация о решении проблемы встраивания: http://developer.amd.com/documentation/articles/pages/JVMTIEventPiggybacking.aspx

...