2016-06-11 11 views
1

私はデバッガ、計測器、およびJVMTIの分野では新しいです。 だから私はそれらについてほとんど質問がありません。JDI、Javaバイトコード計測とJavaエージェント(JWDP、JVMTI)

  1. JDI(Javaデバッガインタフェース)、JWDP、javaagent、およびネイティブエージェント(JVMTI)の違いは何ですか? 、java instrumentation APIはどこにあるのですか?

  2. 対象のJavaアプリケーションで例外を傍受するためにJDIを使用しています。 しかし、ターゲットアプリのパフォーマンスにどのような影響を与えるかについて話をすれば、JDIは十分ではないことが分かりました。 私は、JVMTIとバイトコード計測を組み合わせることで、最も優れたアプリケーションがこれを行うことを読んでいます。しかし、JVMTIでバイトコード計測をどのように使うことができるのか理解できません。 JVMTIと一緒にバイトコード計測を行うにはどうしたらいいですか? 任意の例が役立ちます。

  3. バイトコードとマシンコードの両方をjavaで計測できますか?

  4. JVMTIとともに静的バイトコード分析を使用できますか。はいの場合はどうですか?

ご質問やご不明な点がありましたら、お知らせください。

答えて

2

http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/architecture.html - これらは基本的に3つの抽象レイヤーを重ね合わせたもので、JVMTIは実行中のJVMと直接インターフェースし、JDWPは通信プロトコルとして使用されますそのリモートJVMへのインタフェースとしてJDIを使用します。 javaagentを使用してバイトコード計測を実行することができます(これらの3つの実装とは直交しています)。

2 - これを実行する最も効果的な方法は、例外を処理するために各メソッドにtry/catchを追加するようにすべてのコードをインスツルメントすることだと思います - 例外がキャッチされると、 )、それを再スローします。インストルメンテーションを行う最も簡単な方法は、javaagentアプローチ(javaassistまたはasmなどを使用)です。 JVMTIのバイトコードも計測できますが、はるかに面倒です。特定の例外(つまり、明示的にスローされた例外、NullPointerException、ArrayIndexOutOfBoundsExceptionなどのインタープリタによって内部的にスローされた例外)を気にする必要がある場合、これらを処理する最も簡単な方法は、ATHROW命令を傍受することです例外をスローするのに使用されます)。具体的な経験はありませんが、Exception eventのために登録されているJVMTIエージェントを作成することは合理的かもしれませんが、パフォーマンスはよく分かりません(JDIのアプローチほど遅くて良いかもしれません)。

3 - いいえ:Javaで実行されているバイトコードしか計測できません。マシンコードを計測したいと思ったら、ピンのようなものでそれをしようとすることができますが、これはおそらくあなたが探しているものの手を伸ばしていると思います。

4 - 確か:あなたはどんな静的分析に興味がありますか?確かに煤のようなものを使うことができ、JVMTIも使うことができます。

+0

お返事ありがとうございました。静的分析については、実際にターゲットアプリケーションを実行せずに例外をスローするコードを見つけ出すことができれば、私のユースケースはそれだけです。とにかく、近い将来バイトコード解析を使用するつもりはありません。 JVMTIを使用してバイトコード解析を行うことができれば、私はちょっと面白かったです。これについてのチュートリアルを指摘できれば助かります。私はすでにこれについてGoogleを検索しましたが、何も見つかりませんでした。ありがとう。 –

+0

興味のあるものが例外を投げることができる正確なサイト(例えば 'throw new MyException()';)であれば、ASMを使用してATHROW命令を検出し、その周辺で計測器を放出することができます。 しかし、例外をスローする可能性のあるコードを呼び出す可能性のあるすべての呼び出しサイトをより広く見つけることが目的の場合は、静的呼び出しグラフを作成する必要があります。そしてそのために、私は[soot](https://sable.github.io/soot/)に目を向けるでしょう。 –

関連する問題