ubuntu上的Systemtap for java

ubuntu上的Systemtap for java,ubuntu,trace,openjdk,systemtap,Ubuntu,Trace,Openjdk,Systemtap,我不仅希望跟踪java进程,还希望在systemtap中使用对openjdk跟踪的新支持,包括热点跟踪和方法跟踪 因此,我需要访问ddebs.ubuntu.com存储库来安装内核调试符号——然后我可以调用一个使用内核tapset但尚未使用java tapset的stap脚本。我确实注意到一个名为openjdk-7-jdk-dbgsym的包,并尝试安装它,以查看它是否具有用于openjdk的systemtap tapset,但这与openjdk-7-dbg包冲突(然后ubuntu不让我报告错误,因

我不仅希望跟踪java进程,还希望在systemtap中使用对openjdk跟踪的新支持,包括热点跟踪和方法跟踪

因此,我需要访问ddebs.ubuntu.com存储库来安装内核调试符号——然后我可以调用一个使用内核tapset但尚未使用java tapset的stap脚本。我确实注意到一个名为openjdk-7-jdk-dbgsym的包,并尝试安装它,以查看它是否具有用于openjdk的systemtap tapset,但这与openjdk-7-dbg包冲突(然后ubuntu不让我报告错误,因为openjdk-7-jdk-dbgsym包不是来自“官方”服务器。如果我卸载其中一个并安装另一个,它也不会有任何帮助

有人在ubuntu上成功地做到了这一点吗

编辑:为了在ubuntu上成功地从源代码构建systemtap,并支持java byteman,您必须通过

--with-java=/usr/lib/jvm/default-java
(或您奇怪的jvm位置)

否则构建将无法完成JAR,因此需要进行安装。然后,您必须按照source dir java/README文件中的步骤进行安装(并且不要忘记修改路径)

还有另一个--with dyninst选项,我没有尝试过,但可能会为其他调用模式“修复”它


edit2:它可以编译甚至运行,但即使在给出的示例中以及使用BYTEMAN_HOME set,它也不会输出任何内容。

从systemtap跟踪openjdk有几种不同的策略

第一个依赖于编译到JVM中的sys/sdt.h dtrace样式标记,而不是dbgsym数据:

% stap -L 'process("/usr/lib/jvm/java*/jre/lib/*/server/libjvm.so").mark("*")'
如果这显示一个空结果,(如果我有ubuntu libjvm.so路径正确),那么这表明您的openjdk是在没有sys/sdt.h内容的情况下编译的,所以这个选项对您来说是关闭的。如果它显示了一个可爱的列表,您可以直接使用这些.mark探针,或者从任何地方snarf/adapt热点*.stp tapset sources的副本,并将其转录到您的.stp文件中,或者让stap通过

% stap -I PATH ...
第二种方法依赖于编译到JVM中的dwarf debuginfo,dbgsym*应该很方便

% stap -L 'process("/usr/lib/jvm/java*/jre/lib/*/server/libjvm.so").function("*")'
应该显示一个gajillion函数。您可能没有Tapset的好处,但是通过巧妙地选择函数,您应该能够进行一些不错的跟踪

第三种方法依赖于byteman在systemtap控制下进行JVM内部自我检测。这不需要java dbgsym,但需要byteman和一系列辅助工具。如果这是可用的并编译到ubuntu systemtap中,则类似于:

% stap -e 'probe java("org.my.MyApp").class("^java.lang.Object").method("foo(int)")
           { println($$parms) }'

可能适合您。

从systemtap跟踪openjdk有几种不同的策略

第一个依赖于编译到JVM中的sys/sdt.h dtrace样式标记,而不是dbgsym数据:

% stap -L 'process("/usr/lib/jvm/java*/jre/lib/*/server/libjvm.so").mark("*")'
如果这显示一个空结果,(如果我有ubuntu libjvm.so路径正确),那么这表明您的openjdk是在没有sys/sdt.h内容的情况下编译的,所以这个选项对您来说是关闭的。如果它显示了一个可爱的列表,您可以直接使用这些.mark探针,或者从任何地方snarf/adapt热点*.stp tapset sources的副本,并将其转录到您的.stp文件中,或者让stap通过

% stap -I PATH ...
第二种方法依赖于编译到JVM中的dwarf debuginfo,dbgsym*应该很方便

% stap -L 'process("/usr/lib/jvm/java*/jre/lib/*/server/libjvm.so").function("*")'
应该显示一个gajillion函数。您可能没有Tapset的好处,但是通过巧妙地选择函数,您应该能够进行一些不错的跟踪

第三种方法依赖于byteman在systemtap控制下进行JVM内部自我检测。这不需要java dbgsym,但需要byteman和一系列辅助工具。如果这是可用的并编译到ubuntu systemtap中,则类似于:

% stap -e 'probe java("org.my.MyApp").class("^java.lang.Object").method("foo(int)")
           { println($$parms) }'

可能对你有用。

我最终直接将byteman用于java,将systemtap用于内核。虽然笨拙,但它仍然有效。

我最终直接将byteman用于java,将systemtap用于内核。虽然笨拙,但它仍然有效。

不幸的是,ubuntu上没有这样的工作,甚至没有硬编码到/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd的路径64/server/libjvm.so,删除openjdk-7-dbg并安装openjdk-7-jdk-dbgsym。同时,我打开了一个错误报告,实际上我还没有尝试byteman方法,但我已经看过了,找不到包/。所以需要。我是指systemtap gi的java子目录中提到的libHelperSDT_*.so和HelperSDT.jar文件t、 Fedora的默认java目录的命名与普通的不同:/usr/lib/jvm/java;ubuntu/usr/lib/jvm/default java,如果您安装了默认java,我出于某种原因没有安装默认java。因此,您需要使用以下代码进行构建:./configure--prefix=/home/i30817/systemtap--with java=/usr/lib/jv不幸的是,m/default java在ubuntu上不起作用,甚至对/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server/libjvm.so的路径进行了硬编码,并且删除了openjdk-7-dbg并安装了openjdk-7-jdk-dbgsym。与此同时,我打开了一个错误报告,实际上我还没有尝试过byteman方法,但我已经看过了,也看不懂ind packages/.so required。我是指systemtap git的java子目录中提到的libHelperSDT_*.so和HelperSDT.jar文件。它们在building.Damn之后就不见了。Fedora的默认java目录的名称与普通的不同:/usr/lib/jvm/java;ubuntu/usr/lib/jvm/default java,如果您安装了默认java,那么出于某种原因,我没有这样做。因此您需要使用以下实例进行构建:./configure--prefix=/home/i30817/systemtap--with java=/usr/lib/jvm/default java