Регистрация всех вызовов методов путем изменения OpenJDK

Я пытаюсь изменить OpenJDK 9, чтобы регистрировать каждый метод, вызываемый программой Java, в частности, я экспериментирую с очень простым классом с main, который вызывает один из своих собственных статических методов, который печатает строку на стандартный вывод один раз каждые две секунды (ожидание выполнено с помощью Thread.sleep) После прочтения этого сообщения в блоге я добавил код ведения журнала внутри javaCalls::call. Это работает, регистрируя множество вызовов от запуска JVM до вызова Myclass.main, затем он останавливается (моя программа продолжает печатать). После выхода из программы с помощью CTRL^C журналирование возобновляется и регистрирует такие методы, как Thread.exit. Затем я попробовал другой способ: использовать hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp в каждом байт-коде для вызова. Хуже, чем раньше, это ничего не печатает.

Сначала я полагался на новую функцию ведения журналов JDK 9, но затем решил добавить данные непосредственно в файл, чтобы исключить возможность отключения журнала в какой-то момент.

У меня есть два вопроса:

  1. Я неправильно истолковал цитируемый блог? Разве моей первой попытки не должно быть достаточно, чтобы все записать?
  2. Есть ли у вас какие-либо предложения относительно момента, когда у меня будет больше шансов достичь своей цели?

person scristalli    schedule 13.11.2017    source источник
comment
В этой статье говорится, что «он вызовет JavaCalls::call (в javaCalls.cpp) для перехода от кода виртуальной машины к коду Java». Это не говорит о том, что каждый вызов будет выполняться с помощью этого метода. В конце концов, вся цель встраивания состоит в том, чтобы избавиться от таких накладных расходов…   -  person Holger    schedule 13.11.2017
comment
@Holger, спасибо, кажется, я понял. Могу я спросить, ошибочна ли, по вашему мнению, вторая идея оснащения интерпретатора инструментами? Или я просто пропустил момент в коде?   -  person scristalli    schedule 13.11.2017
comment
Я никогда не пытался изменить код JVM. Но мне кажется, что этот подход может работать только в том случае, если вы отключите JIT, что редко осуществимо.   -  person Holger    schedule 13.11.2017
comment
Я понимаю. Итак, если я понял, скомпилированный JIT-код будет вызываться без прохождения через какой-то помощник или трамплин в байт-коде для вызовов методов?   -  person scristalli    schedule 13.11.2017
comment
Я только что попробовал -Djava.compiler=NONE из этот вопрос и ничего не меняется.   -  person scristalli    schedule 13.11.2017
comment
Вы можете использовать байт-код для всех вызовов методов. Он будет работать независимо от того, выполняется ли он в интерпретируемом, C1 или C2. См. web.cs.ucla.edu/~msb/cs239-tutorial   -  person Kire Haglin    schedule 15.11.2017