适用于ubuntu上java的Systemtap

时间:2014-03-02 20:14:32

标签: ubuntu tracing openjdk systemtap

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

相应地我installed ddebs.ubuntu.com存储库来安装内核debuging符号 - 然后我可以调用一个使用内核tapset而不是java内容的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位置)

否则建筑将不会做罐子,所以需要。然后你必须按照源目录java / README文件中的步骤进行make install(并且不要忘记修改路径)。

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

edit2:好吧,它编译甚至运行,但即使在给出的示例和BYTEMAN_HOME设置中它也绝不输出任何内容......

2 个答案:

答案 0 :(得分:4)

从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 /改编热点* .stp tapset源的副本并将其转录到你的.stp文件中,或者让它通过

% 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) }'

可能适合你。

答案 1 :(得分:0)

我最终使用byteman直接用于java,而systemtap用于内核。笨拙但有效。