如何使用OpenJ9 Xtrace Option

时间:2019-03-22 08:26:03

标签: java eclipse trace openj9

背景:

我想在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()是克隆 指定的存储库。

然后,我使用-clean选项启动Eclipse,克隆存储库,然后退出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;),但是没有JGit克隆的URI。

问题:

如何使用OpenJ9 Xtrace选项转储方法参数的内容?

1 个答案:

答案 0 :(得分:1)

  

如何使用OpenJ9 Xtrace转储方法参数的内容   选项?

您的选项仅启用 entry exit exception 方法跟踪跟踪点。方法参数在不同的跟踪点下打印。如果使用this option,则应该看到包含参数的其他跟踪条目。

但是,虽然原始参数的值显示在跟踪中,但是当参数是一个对象时,您只会在Java堆上看到该对象的地址。例如,在跟踪对' It's my main form: If Screen.ActiveForm.Name = "YourFormName" Then ' And it's my subform: If Forms!YourFormName.ActiveControl.Name = "subform" Then ' And it's my control in subform: If Screen.ActiveControl.Name = "myCtrlInSubform" Then Me.subform.Form!otherCtrlInSubform.SetFocus Me.subform.Form!myCtrlInSubform.Visible = False End If End If End If 的呼叫时,您会看到类似以下内容的信息:

*.println()

我的理解是,限制是由于Xtrace引擎的体系结构以及解析对象(如Strings)并将它们存储在跟踪缓冲区中对性能的影响。

尽管地址对于在Java堆中定位感兴趣的对象非常有用,例如,当使用Eclipse Memory Analyzer查看关联的系统转储时,Xtrace无法提供您想要的功能。

另一种方法是使用Java代理在运行时修改{instrument} 15:31:13.710 0x33acc00 mt.18 - this: java/io/PrintStream@00000000FFF04AE0 method arguments: (java/lang/String@00000000E0002768) 类,以将日志代码添加到org/eclipse/jgit/api/CloneCommand方法中。