Добавление invokestatic в java/lang / Object. в JVM через агента ти вызывает JVM, чтобы рухнуть с обработка выхода онлайн / оффлайн


Я пытаюсь отслеживать распределение всех объектов в JVM.

В нескольких документах о профилировщиках распределения упоминалось, что самый простой способ сделать это-это: добавьте invokestatic Tracker.trackAllocation()V инструкцию к java/lang/Object.<init> (обычно она состоит из одной return инструкции, мы добавляем invokestatic перед ней, так что теперь это 2 инструкции).

(я знаю, что этот подход медленный и не будет отслеживать распределение массивов, но я хотел начать с самого простого решения. Также я не передаю ссылку на выделенные объект для трекера, но это будет добавлено позже.)

Файл класса инструментируется с помощью агента JVM TI в onclassloaded hook.

Однако после добавления invokestatic Инструкции JVM завершает работу с segfault. Объект Tracker добавляется в загрузчик bootstrap classloader, поэтому он должен быть виден на любом этапе. Я попытался добавить nop вместо invokestatic, и JVM отлично работает с модифицированным классом объектов. Таким образом, проблема заключается именно в вызове некоторого статического метода.

Я также пытался играть на инструменте. приложение (не входящее в состав базовых) классов и работало нормально-трекер вызывался и никаких сбоев не происходило. Также я попробовал переопределить объект в 2 точках: когда он изначально загружен (первый загруженный класс), или после события vmInit (когда загружены все базовые классы и сняты ограничения на jni).

Есть ли что-то, что я упускаю в инструментовке java.яз..Объект?

Код для агента находится здесь: https://gist.github.com/Korobochka/3bf2f906f6ab85b22dec (Проверка ошибок-это лишенный, код для изменения классов также не включен, но он достаточно хорошо работает для других классов)

1 7

1 ответ:

Похоже, что проблема заключается в вызове System.out.println из LeakAgentInterface. Во-первых, System.out может быть еще не инициализирован. Во-вторых, println может выделять объекты сам.