JVMTI - как получить значение параметра метода из обратного вызова - PullRequest
3 голосов
/ 12 августа 2011

Я записываю все записи метода из моего приложения Java благодаря агенту JVMTI. Пока я могу получить имя каждого метода, но я бы хотел получить значение параметров, полученных этим методом.

Эта проблема уже обсуждалась в более старой теме (см. Как получить значения параметров в обратном вызове MethodEntry ); он идеально соответствует тому, что я ищу, поэтому я знаю, что должен использовать функцию GetLocalObject, но не могу понять, как это сделать (пример, приведенный в теме, не работает).

Может кто-нибудь помочь мне узнать, как это сделать? Спасибо.

1 Ответ

1 голос
/ 16 апреля 2012

Я думаю, что вы хотите получить доступ к параметрам произвольного метода, не зная заранее их содержания, если нет, не могли бы вы уточнить свой вопрос?

См. Документы JVMTI о локальных переменных .

Во-первых, вам нужно убедиться, что вы включили доступ к локальным переменным в своем списке возможностей. Затем выясните, какие параметры доступны, используя GetLocalVariableTable. Возвращенная таблица будет содержать описание каждой локальной переменной в методе, включая параметры. Не забудьте Deallocate когда закончите.

Вам необходимо выяснить, какие переменные являются параметрами. Вы можете сделать это, найдя текущий jlocation и исключив локальные переменные, которые еще не доступны. Это не скажет вам порядок параметров, но скажет, какие локальные параметры являются параметрами. Вы, вероятно, можете предположить, что номер слота - правильный порядок.

Найдите текущий jlocation, используя GetFrameLocation, выполните итерацию по таблице локальных переменных, и для каждой локальной переменной, чья start_location меньше или равна вашему текущему местоположению, добавьте номер слота и введите в свой список параметры.

Для каждого параметра вызовите соответствующий метод GetLocal{X} в зависимости от его типа. Вам понадобится глубина вашего текущего кадра, которая у вас уже есть от GetFrameLocation.

Это должно дать вам ваши параметры, но это будет медленно и сложно реализовать. Вам будет гораздо лучше следовать рекомендациям руководства о том, чтобы избегать обратных вызовов MethodEntry и использовать вместо этого инструментарий байт-кода (BCI).

...