gpt4 book ai didi

ubuntu - 用于 ubuntu 上的 java 的 Systemtap

转载 作者:行者123 更新时间:2023-11-30 07:10:33 24 4
gpt4 key购买 nike

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

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

有人在 ubuntu 上成功做到了吗?

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

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

(或者你奇怪的 jvm 位置)

否则构建将无法完成所需的 jar 。然后你必须按照源目录 java/README 文件中的步骤进行 make install(不要忘记修改路径)。

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

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

最佳答案

有几种不同的策略可以从 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 探针,或者从任何地方获取/改编 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("*")'

应该显示一个 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) }'

可能对你有用。

关于ubuntu - 用于 ubuntu 上的 java 的 Systemtap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22132813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com