1

パッケージ内のクラスから他のクラスへのメソッド呼び出しを追跡するプロジェクトに取り組んでいます。具体的な型を識別できることが重要であり、トレースのオーバーヘッドを最小限に抑えたいと考えています。プローブがトリガーされるタイミングに制限はありません。メソッドが呼び出される前でも後でもかまいません。

現在 ASM が使用されていますが、必須ではありません。システムは動的アタッチメントを可能にするために AspectJ から移行しているので、それはありません。

以下、現状です。「トレーサー」列挙型/シングルトンは、probe(int) を受け取り、呼び出しを処理します。具象型から参照型への呼び出しを見つけるだけで十分です。

@Override
void visitMethodInsn(final int opcode, final String owner, final String name, final String desc) {
    Integer probeID = Tracer.INSTANCE.probes.createProbeIDAt(new Call(owner, name, desc))

    super.visitFieldInsn(GETSTATIC, "org/flightofstairs/honours/capture/agent/Tracer", "INSTANCE", "Lorg/flightofstairs/honours/capture/agent/Tracer;");
    super.visitLdcInsn(probeID)
    super.visitMethodInsn(INVOKEVIRTUAL, "org/flightofstairs/honours/capture/agent/Tracer", "probe", "(Ljava/lang/Integer;)V")

    super.visitMethodInsn(opcode, owner, name, desc);
}

さらに先に進むための私の考えは、呼び出されたクラスへの参照を何らかの方法で取得し、 getClass() を呼び出して具象型を取得することです。スタックが INVOKEINTERFACE のオブジェクト ref を一番上に含んでいる場合、これは些細なことですが、呼び出されたメソッドへのパラメーターはその上に配置されます。

パラメーターの数がわかっている場合、オブジェクト参照のスタック位置を計算することは問題になりませんが、Java はスタック内の下位から参照を複製する方法を提供しません。

何かアドバイス?

乾杯。

4

1 に答える 1

0

解決策は、走査中に INVOKEINTERFACE を記録することです。最後に、ASMs Analyzer を使用して objectref をスタックにプッシュした命令を見つけ、そこから getClass() とトレース コードを簡単に追加できます。

ここに解決策が示されています。https://gist.github.com/2795738

于 2012-05-27T00:38:56.570 に答える