2014-03-02 19 views
1

java的,我想,不仅要追查的java程序,但在SystemTap中使用的OpenJDK跟踪新的支持,无论是热点追踪和方法跟踪。的SystemTap对Ubuntu的

因此i installed安装内核调试符号的ddebs.ubuntu.com存储库 - 然后我可以调用一个使用内核tapsets但不是java的stap脚本。我注意到了一个名为openjdk-7-jdk-dbgsym的包,并试图安装它以查看是否有openjdk的systemtap tapsets,但这与openjdk-7-dbg包相冲突(然后ubuntu不让我bug报告,因为openjdk-7-jdk-dbgsym软件包不是来自'官方'服务器。如果我卸载那一个,并安装其他,它不会帮助。

有没有人成功做到这一点在Ubuntu?

编辑:为了在Ubuntu成功地从源代码编译的SystemTap用java byteman支持你必须通过

--with-java=/usr/lib/jvm/default-java 

(或y我们奇怪的JVM的位置)

否则建筑不会做的罐子等需要。然后你必须按照源代码java/README文件中的步骤进行安装(并且不要忘记修改路径)。

还有,我还没有尝试过其他--with-dyninst选项,但可能“修复”,就可以为其他调用模式

EDIT2:嗯,它编译和运行,甚至,但它从来没有输出即使是在给出的实例,并与BYTEMAN_HOME集...

回答

3

有几种不同的战术,从SystemTap的跟踪OpenJDK的。

首先依赖于编译成JVM SYS/sdt.h DTrace的风格标志,但不是dbgsym数据:

% stap -L 'process("/usr/lib/jvm/java*/jre/lib/*/server/libjvm.so").mark("*")' 

如果显示一个空的结果,(如果我有Ubuntu的libjvm。所以路径是正确的),那么这表明你的openjdk编译时没有sys/sdt.h的东西,所以这个选项对你是封闭的。如果它显示了一个可爱的列表,你可以直接使用这些.mark探头,或SNARF /调整热点的副本*的.stp tapset从任何来源和它转录到您的.stp文件,或者让STAP通过

发现
% stap -I PATH ... 

第二种方法依赖于编译成JVM,为此dbgsym *的东西应该是得心应手矮debuginfo软。如果安装得当,

% stap -L 'process("/usr/lib/jvm/java*/jre/lib/*/server/libjvm.so").function("*")' 

应该显示gajillion函数。你可能没有tapsets的好处,但有了聪明的功能选择,你应该能够得到一些体面的追踪。

第三种方法依赖于byteman做的systemtap控制下帧内JVM自仪表。这不需要java dbgsym,但需要byteman和一些辅助工具。如果这是可用的,并编译到Ubuntu的systemtap,然后像这样:

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

可能会为你工作。

+0

不幸的是,没有一个在Ubuntu上工作,甚至硬编码到/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server/libjvm.so的路径,并删除openjdk-7- dbg并安装openjdk-7-jdk-dbgsym。与此同时,我打开了一个错误报告https://bugs.launchpad.net/ubuntu/+source/openjdk-7/+bug/1286895 – i30817

+0

嗯,其实我还没有尝试使用byteman方法,但我已经看过它了并找不到所需的packages/.so。 – i30817

+0

我的意思是在systemtap git的java子目录中提到的libHelperSDT _ *。so和HelperSDT.jar文件。建造后无处可见。 – i30817

0

我最终将byteman直接用于java,systemtap用于内核。笨重,但它的作品。