Java 如何使用OpenJ9 Xtrace选项转储方法参数的内容 背景:

Java 如何使用OpenJ9 Xtrace选项转储方法参数的内容 背景:,java,eclipse,trace,openj9,Java,Eclipse,Trace,Openj9,我想记录Eclipse上的用户活动,例如,用户克隆了哪些git存储库,何时发生了合并冲突,等等 我想到了使用OpenJ9-Xtrace选项。首先,为了测试OpenJ9-Xtrace选项的功能,我使用创建了以下选项,并将这些选项添加到eclipse.ini以记录克隆的git存储库 -Xtrace:none,maximal={mt{entry},mt{exit},mt{exception}},methods={org/eclipse/jgit/api/CloneCommand.setURI(),or

我想记录Eclipse上的用户活动,例如,用户克隆了哪些git存储库,何时发生了合并冲突,等等

我想到了使用OpenJ9-Xtrace选项。首先,为了测试OpenJ9-Xtrace选项的功能,我使用创建了以下选项,并将这些选项添加到
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()
    是克隆 指定的存储库
然后我使用
-clean
选项启动了Eclipse,克隆了一个存储库,然后退出Eclipse。 我用
traceformat
命令转换了
mytrace.trc
,并在
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 *****
跟踪格式化数据
时间(UTC)线程ID跟踪点ID类型跟踪点数据
07:56:41.541990300*0x0000000001fafe00 mt.0 Entry>org/eclipse/jgit/api/CloneCommand.setURI(Ljava/lang/String;)Lorg/eclipse/jgit/api/CloneCommand;字节码方法,这=0x7f9788a98
07:56:41.541991900 0x0000000001fafe00 mt.6退出org/eclipse/jgit/api/CloneCommand.call()Lorg/eclipse/jgit/api/Git;字节码方法,这=0x7f9788a98
07:56:46.512616000 0x0000000001fafe00 mt.6出口
如何使用OpenJ9 Xtrace转储方法参数的内容
选择权

您的选项仅启用入口、出口和异常方法跟踪点。方法参数打印在不同的跟踪点下。如果改用,则应看到包含参数的附加跟踪条目

但是,当原始参数的值显示在跟踪中时,当参数是对象时,您将只看到Java堆上对象的地址。例如,当跟踪对
*.println()
的调用时,您将看到如下内容:

15:31:13.710 0x33acc00              mt.18       - this: java/io/PrintStream@00000000FFF04AE0 method arguments: (java/lang/String@00000000E0002768)
我的理解是,限制是由于Xtrace引擎的体系结构,以及解析对象(如字符串)并将其存储在跟踪缓冲区中对性能的影响

虽然地址对于在Java堆中定位感兴趣的对象非常有用,例如当使用Eclipse内存分析器查看关联的系统转储时,Xtrace无法提供您想要的功能

另一种方法是使用Java代理在运行时修改(插入)org/eclipse/jgit/api/CloneCommand类,以将日志代码添加到
.setURI()
方法中