通常どおり実行する前に、単純な静的呼び出しを行うネイティブ メソッドをインストルメント化する必要があります。メソッドはネイティブであるため、「setNativePrefix」機能を使用して、元のメソッド シグネチャを使用した中間呼び出しでネイティブ メソッドをラップする必要があります。
これを達成するための単純なバイトコードの変更だと思った後、スタックが基本的に空であっても、ラッパーメソッドが実行される直前に StackOverflowError を取得しています。ここに私のテストクラスがあります:
public class SimpleTest {
public static void main(String[] args) throws IOException {
Perf.getPerf().highResCounter();
}
}
通常、そのプログラムはコンソールに何も表示しません。ただし、インストルメント化されたバイトコードは、ネイティブ メソッド $wrapper$highResCounter() を実行する前に println() を実行します。これは、計測後の関連する Perf クラスのバイトコードで確認できます。
public long highResCounter() {
getstatic PrintStream System.out
ldc String Constant "this is an instrumented println"
invokevirtual void PrintStream.println(String)
aload 0
invokevirtual long Perf.$wrapped$highResCounter()
lreturn
}
public native long $wrapped$highResCounter();
私は Java バイトコードに慣れていないので、ここで間違いを犯した可能性があります。これはプログラムの出力で、println() が実行されることを示していますが、最初の invokevirtual呼び出しの後のどこかで StackOverflowError がスローされます。
this is an instrumented println call
Exception in thread "main" java.lang.StackOverflowError
at com.foo.SimpleTest.main(SimpleTest.java:17)
この StackOverflowError の原因は何ですか? どうすれば修正できますか?