Как вывести содержимое аргумента метода с помощью OpenJ9 Xtrace Option
Фон:
Я хочу регистрировать действия пользователей в Eclipse, например, какие git-репозитории клонировали пользователи, когда возникали конфликты слияний и так далее.
Я придумал использовать опцию OpenJ9 -Xtrace. Во-первых, чтобы проверить возможности опций OpenJ9 -Xtrace, я сделал следующие опции в OpenJ9: Xtrace Option Builder и добавил эти опции в eclipse.ini
войти в клонированные репозитории git.
-Xtrace:none,maximal={mt{entry},mt{exit},mt{exception}},methods={org/eclipse/jgit/api/CloneCommand.setURI(),org/eclipse/jgit/api/CloneCommand.call()},output="C:\tmp\mytrace.trc"
-Xjit:exclude={org/eclipse/jgit/api/CloneCommand.setURI*|org/eclipse/jgit/api/CloneCommand.call*}
org/eclipse/jgit/api/CloneCommand.setURI()
это метод для установки URI для клонированного репозитория в EGit/JGit.org/eclipse/jgit/api/CloneCommand.call()
метод для клонирования указанного хранилища
Затем я запустил Eclipse с -clean
опцию, клонировать репозиторий и выйти из Eclipse. Я преобразовал mytrace.trc
с traceformat
команда, и получил этот вывод в mytrace.trc.fmt
:
Trace Formatted Data
Time (UTC) Thread ID Tracepoint ID Type Tracepoint Data
07:56:41.541990300 *0x0000000001fafe00 mt.0 Entry >org/eclipse/jgit/api/CloneCommand.setURI(Ljava/lang/String;)Lorg/eclipse/jgit/api/CloneCommand; bytecode method, this = 0x7f9788a98
07:56:41.541991900 0x0000000001fafe00 mt.6 Exit <org/eclipse/jgit/api/CloneCommand.setURI(Ljava/lang/String;)Lorg/eclipse/jgit/api/CloneCommand; bytecode method
07:56:41.542010000 0x0000000001fafe00 mt.0 Entry >org/eclipse/jgit/api/CloneCommand.call()Lorg/eclipse/jgit/api/Git; bytecode method, this = 0x7f9788a98
07:56:46.512616000 0x0000000001fafe00 mt.6 Exit <org/eclipse/jgit/api/CloneCommand.call()Lorg/eclipse/jgit/api/Git; bytecode method
07:56:47.631399600 0x0000000001fafe00 dg.262 Debug ***** Thread termination - trace purged *****
Этот вывод показывает setURI()
у метода есть аргумент (Ljava/lang/String;
), но нет URI, который JGit клонировал.
Вопрос:
Как я могу вывести содержимое аргумента метода с опцией OpenJ9 Xtrace?
0 ответов
Как я могу вывести содержимое аргумента метода с опцией OpenJ9 Xtrace?
Ваш параметр включает только точки трассировки входа, выхода и исключения. Аргументы метода печатаются под другой точкой трассировки. Если вы используете эту опцию вместо этого, вы должны увидеть дополнительные записи трассировки, содержащие аргументы.
Однако, хотя значения примитивных аргументов отображаются в трассировке, когда аргумент является объектом, вы увидите только адрес объекта в куче Java. Например, при отслеживании звонков *.println()
вы увидите что-то вроде этого:
15:31:13.710 0x33acc00 mt.18 - this: java/io/PrintStream@00000000FFF04AE0 method arguments: (java/lang/String@00000000E0002768)
Насколько я понимаю, это ограничение связано с архитектурой механизма Xtrace и влиянием на производительность разрешения таких объектов, как Strings, и их хранения в буферах трассировки.
Хотя адреса могут быть чрезвычайно полезны для поиска объектов, представляющих интерес, в куче Java, например, при использовании Eclipse Memory Analyzer для просмотра соответствующего системного дампа, Xtrace не может обеспечить функциональность, на которую вы нацелены.
Альтернативный подход заключается в использовании агента Java для изменения (инструмента) org/eclipse/jgit/api/CloneCommand
класс во время выполнения, чтобы добавить код регистрации в .setURI()
метод.