Конвертирование BCI (индексы Bytecode) для номеров строки кода исходных кодов

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

Вопрос

Я пишу код JVMTI в профиль программы Java, который в основном влечет за собой получение следов стека из случайных потоков с фиксированными интервалами времени с использованием функции ASYNCGETCALLTRACE. Таким образом, я могу получить структуры Calltrace, каждый из которых содержит массив структур CallFrame, которые содержат данные об отдельных рамах в трассировке стека. В частности, эти данные состоят из: jmethodid method_id (идентификатор метода Java, где находится кадр), а: Jint Lineno (BCI метода в файле .Class, насколько я понимаю документацию). Кажется, я не могу найти способ преобразовать это «белье» в соответствующий номер линии исходного кода с использованием Framework JVMTI (см. Файл JVMTI.h, расположенный в / usr / lib / JVM / Java-6-Sun / включает, по крайней мере, на Linux). Фактически, даже за пределами структуры JVMTI, единственное, что я мог найти в Интернете, пока было здесь: http://jakarta.apache.org/bcel/apidocs/org/apache/bcel/classfile/lineNumbumbertable.html.html., Но даже это может не делать то, что я хотел бы, и требует дополнительной установки, и требует от меня обработать данные, которые были созданы C ++ JMVTI Code, используя отдельную программу Java.

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

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

Это было полезно?

Решение

Я думаю, я несколько понял это. Основной метод использования является JVMTI-> GetLineNumberTable (...), который заполняет массив JVMTILINENENUMENTROUNTRY. Учитывая номер линии BCI N (который должен быть сопоставлен с номером источника строки), можно проверить, для которого I int i есть: JVMTILINENUMENUMENTRYARRAY [I] <= N <JVMTILINENUMENUMENTRYARRAY [I + 1]. Это INT I есть тогда желаемый соответствующий номер линейки исходного кода.

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

Более крупный улов - это то, что методы Java часто включаются, поэтому номера строк не всегда отображаются правильно. На самом деле, это может быть причиной проблемы, описанной в пункте выше, хотя это кажется маловероятным на основе чисел, которые я видел. Вот некоторая информация о решении проблемы с наличием: http://developer.amd.com/documentation/articles/pages/jvmtieventpiggybacking.aspx.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top