2

Java プロセスをトレースするだけでなく、systemtap での openjdk トレースの新しいサポート、ホットスポット トレースとメソッド トレースの両方を使用したいと考えています。

したがって、ddebs.ubuntu.com リポジトリをインストールして、カーネル デバッグ シンボルをインストールしました。その後、カーネル タップセットを使用するが、Java タップセットを使用しない stap スクリプトを呼び出すことができます。openjdk-7-jdk-dbgsym という名前のパッケージに気付き、それをインストールして、これに openjdk 用の systemtap タップセットがあるかどうかを確認しようとしましたが、これは openjdk-7-dbg パッケージと競合します (その後、ubuntu では許可されません)。 openjdk-7-jdk-dbgsym パッケージは「公式」サーバーからのものではないため、バグ レポート. 1 つをアンインストールしてもう 1 つをインストールしても、とにかく役に立ちません。

ubuntuでこれを成功させた人はいますか?

編集: java byteman をサポートする ubuntu でソースから systemtap を正常にビルドするには、

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

(またはあなたの奇妙なjvmの場所)

そうしないと、ビルドがjarを実行しないため、必要になります。次に、ソース dir java/README ファイルの手順に従って make install を実行する必要があります (パスを変更することを忘れないでください)。

別の --with-dyninst オプションもありますが、試したことはありませんが、他の呼び出しモードでは「修正」される可能性があります

edit2: まあ、それはコンパイルして実行さえしますが、与えられた例で BYTEMAN_HOME が設定されていても何も出力しません...

4

2 に答える 2

4

systemtap から openjdk をトレースするには、いくつかの方法があります。

1 つ目は、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 タップセット ソースのコピーをスナーフ/適応させて .stp ファイルに転記するか、stap に

% stap -I PATH ...

2 番目の方法は、JVM にコンパイルされた dwarf debuginfo に依存しており、これには dbgsym* が便利です。それが正しくインストールされていれば、

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

膨大な数の関数を表示する必要があります。タップセットの利点は得られないかもしれませんが、機能を賢く選択すれば、まともなトレースを行うことができるはずです。

3 番目の方法は、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 に答える