Добавление 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 (Проверка ошибок-это лишенный, код для изменения классов также не включен, но он достаточно хорошо работает для других классов)