2

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

因此,我安装了 ddebs.ubuntu.com 存储库来安装内核调试符号——然后我可以调用一个使用内核 Tapset 但尚未使用 Java 的 stap 脚本。我确实注意到了一个名为 openjdk-7-jdk-dbgsym 的软件包,并尝试安装它以查看它是否具有 openjdk 的 systemtap Tapsets,但这与 openjdk-7-dbg 软件包冲突(然后 ubuntu 不让我错误报告,因为 openjdk-7-jdk-dbgsym 软件包不是来自“官方”服务器。如果我卸载那个并安装另一个,它无论如何也无济于事。

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

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

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

(或您奇怪的 jvm 位置)

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

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

编辑2:好吧,它可以编译甚至运行,但即使在给出的示例和设置了 BYTEMAN_HOME 的情况下,它也不会输出任何内容......

4

2 回答 2

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/adapt 复制hotspot*.stp Tapset 源并将其转录到您的 .stp 文件中,或者让 stap 通过

% stap -I PATH ...

第二种方法依赖于编译到 JVM 中的 dwarf debuginfo,dbgsym* 的东西应该很方便。如果安装正确,

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

应该显示一个巨大的功能。您可能没有 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) }'

可能对你有用。

于 2014-03-02T20:56:32.457 回答
0

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

于 2014-03-07T22:58:57.990 回答