Byteman を使用する場合、ルール構文でクラスとメソッドを指定する必要があります。Byteman を使用してプログラムの実行を追跡したい場合はどうすればよいですか?
例: プログラムの機能を実行するときに、どのメソッドが実行されているかわかりません。機能の実行中に呼び出されたメソッドを特定したい。
これは、特定のパッケージ内の各クラスの各メソッドにルールを追加する必要があるということですか? または、これを達成する他の方法はありますか?
はい、基本的に、トレースするすべてのメソッドにルールが必要です (ただし、それを行う簡単な方法があります -- 以下を参照してください)。
Byteman は、注入先の CLASS および METHOD にワイルドカード パターンを使用することを意図的に避けています。これは、この種のルールを使用すると、JVM の速度が大幅に低下するためです。
なんで?クラスがロードされるたびに、Byteman は「コードを注入してこのクラスを変換しますか?」と尋ねられます。現在、Byteman は読み込まれたすべてのルールを CLASSNAME でインデックス付けします。したがって、その質問に答えるには、ハッシュ テーブルのルックアップが必要です (実際には 2 つ - 1 つはそのままの名前で、もう 1 つはパッケージ修飾名です)。これは、答えがすぐに出ないことを意味します (ほとんどの場合正しい答えです)。Byteman が CLASSNAME のパターンを許可する場合、単純なハッシュ ルックアップに依存することはできません。
たとえば、CLASS org. .Fooと org.my.app.FooBar と org.my.app.Bletch のような 2 つのクラスでは、最初のクラスが一致し、2 番目のクラスが一致しないことをどのように判断しますか? すべてのクラス名のパターン ルールごとにパターン マッチを試行する必要があります。単一のパターン マッチでさえ、ハッシュ テーブル ルックアップよりもはるかにコストがかかります。複数のパターンベースのルールを使用した場合、コストはルールの数に応じて増加します。
では、この Byteman の制限を回避するにはどうすればよいでしょうか? 多数のクラス + メソッドをインストルメント化する場合は、プログラムを使用して、関心のある各クラス + メソッドのルールを含むルール スクリプトを生成することをお勧めします。次のようなエントリを含むファイルを読み取るプログラムを作成します。
class_name1 method_pattern1 class_name2 method_pattern2 . . .
ファイルには、メソッドが method_pattern1 に一致する CLASS class_name1 のすべてのメソッドをインストルメント化する必要があると書かれています。
ターゲット jar がクラスパスにある限り、現在のクラスローダーを使用して各クラスを名前でロードできます (this.getClass().getClassLoader() を呼び出してクラスローダーを取得し、次に classloader.loadClass(class_name) を呼び出して目的のクラスを取得します)。クラス)。リフレクションを使用して、クラスのメソッドのリストを取得します。メソッドごとに、そのメソッドの名前が対応する method_pattern と一致する場合、AT ENTRY ルールおよび/または AT EXIT ルールをスクリプト ファイルに出力します。
これと同様のことを行うコードを見たい場合は、Byteman ソースの一部である contrib/dtest パッケージを参照してください。
https://github.com/bytemanproject/byteman/tree/master/contrib/dtest
Byteman についてさらに質問がある場合は、プロジェクトが提供する公式の Byteman ユーザー フォーラムで質問してください。
https://developer.jboss.org/en/byteman?view=discussions
よろしく、
Andrew Dinn (バイトマン プロジェクト リーダー)