Как поймать чтение и запись в Java-программе? - PullRequest
1 голос
/ 26 июля 2011

Я пытаюсь создать инструмент, который может захватывать все чтения и записи, сделанные с помощью Java-программы. Кроме того, я хотел бы знать, какие поля какого объекта доступны / изменены.

Я сейчас смотрю на: -

1) java.lang.instrument Я не мог сделать много с этим. Я не мог понять, как написать агент, который может получить доступ к запущенной программе и создать наблюдение за различными объектами / полями и всем, что связано. Буду признателен, если у вас есть идея или информация по этому поводу.

2) jvmti Я посмотрел на jvmti и попытался создать инструмент jvmti, но я понял, что для получения объектов мне понадобится JVMTI_EVENT_OBJECT_ALLOC - потенциальная возможность. Но я понял, что это не так. Более того, я прочитал, что это событие не вызывается для команды new . Следовательно, на данный момент даже это не представляется возможным.

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

ПРИМЕЧАНИЕ. У меня нет доступа к исходному коду приложения. Все, у меня есть файлы классов.

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Это очень легко сделать с ASM lib .Создайте новый загрузчик классов, который инструментирует все классы перед их загрузкой, и используйте его для загрузки целевых классов.Создайте новый MethodAdapter и переопределите метод visitFieldInsn.Затем найдите коды операций PUTFIELD, PUTSTATIC, GETFIELD и GETSTATIC.Хотя это может показаться пугающим (так как мое объяснение, скорее всего, бессмысленно), на самом деле все довольно просто.Просто скачайте руководство по ASM, и вы узнаете, как это сделать в кратчайшие сроки.

Редактировать: я забыл сказать, что для того, чтобы можно было перехватывать чтение и запись, выполненные кодом JDK, который выпридется применять эти классы, сохранять их в файлы и запускать JVM с измененным путем начальной загрузки класса, используя аргумент командной строки -Xbootclasspath (java. * и некоторые другие пакеты; я считаю, что по крайней мере sun. * и javax. * также необходимыэто).

Это также может быть выполнимо с AspectJ ... но я не уверен.

...