我希望,不仅跟踪java进程,而且在系统the中使用对openjdk跟踪的新支持,包括热点跟踪和方法跟踪。
因此,我使用已安装 ddebs.ubuntu.com存储库来安装内核调试符号--然后我可以调用一个stap脚本,它使用内核tapset,但还没有使用java脚本。我确实注意到了一个名为openjdk-7-jdk-dbgsym的包,并试图安装它,看看它是否有openjdk的系统点击设置,但是这与openjdk-7-dbg包有冲突(然后ubuntu不允许我编写bug报告,因为openjdk-7-jdk-dbgsym包不是来自‘官方’服务器。如果我卸载一个,安装另一个,无论如何都没有帮助。
有没有人在ubuntu上成功地做到了这一点?
编辑:为了在ubuntu上成功地通过java byteman支持从源代码构建系统,您必须传递
--with-java=/usr/lib/jvm/default-java(或者您奇怪的jvm位置)
否则,建筑就不会做罐子等所需的工作。然后,您必须使安装遵循源dir /自述文件中的步骤(并且不要忘记修改路径)。
还有另一个选项,我还没有尝试过,但可能会为其他调用模式“修复”它。
edit2:嗯,它编译甚至运行,但它从来没有输出任何东西,即使在给出的例子和BYTEMAN_HOME集.
发布于 2014-03-02 20:56:32
系统挖掘中有几种不同的跟踪openjdk的策略。
第一个依赖于编译到JVM中的sys/sdt.hDTrace样式标记,而不是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中的矮小调试器,对于JVM,dbgsym*都应该很方便。如果安装得当,
% stap -L 'process("/usr/lib/jvm/java*/jre/lib/*/server/libjvm.so").function("*")'应该显示出一个庞大的功能。您可能没有tapsets的好处,但是有了巧妙的函数选择,您应该能够进行一些体面的跟踪。
第三种方法依赖于byteman来进行系统抽头控制下的内部JVM自我检测。这不需要java dbgsym,但需要使用byteman和一些辅助工具。如果这是可用的,并被编译到ubuntu系统中,那么如下所示:
% stap -e 'probe java("org.my.MyApp").class("^java.lang.Object").method("foo(int)")
{ println($$parms) }'可能对你有用。
发布于 2014-03-07 22:58:57
最后,我直接为java使用了byteman,对内核使用了systemtap。笨重但很管用。
https://stackoverflow.com/questions/22132813
复制相似问题