BCI(バイトコードインデックス)をソースコード行番号に変換する

StackOverflow https://stackoverflow.com/questions/3479270

質問

JVMTIコードを作成してJavaプログラムをプロファイルしています。これには、関数AsyncgetCalltraceを使用して、固定時間間隔でランダムスレッドからスタックトレースを取得することができます。したがって、CallTrace構造を取得することができます。各構造には、スタックトレース内の個々のフレームに関するデータが含まれるコールフレーム構造の配列が含まれています。具体的には、これらのデータは次のとおりです。JMethodidMethod_ID(フレームが配置されているJavaメソッドのID)、および:Jint Lineno(ドキュメントを理解している限り、.ClassファイルのメソッドのBCI)。 JVMTIフレームワークを使用して、この「リネノ」を対応するソースコード行番号に変換する方法を見つけることができないようです(/usr/lib/jvm/java-6-sunにあるファイルjvmti.hを参照してください。 Linuxで)。実際、JVMTIフレームワークの外でさえ、これまでにWebで見つけることができる唯一のものはここにありました。 http://jakarta.apache.org/bcel/apidocs/org/apache/bcel/classfile/linenumbertable.html, 、しかし、これでさえ私が望むことをしていないかもしれないし、追加のインストールが必要であり、別のJavaプログラムを使用してC ++ JMVTIコードによって生成されたデータを処理する必要があります。

JVMTI内(または何らかの形で)からBCIをソースコードライン番号に変換する方法を知っている場合は、助けてください!

誰かがこのフィールドをよく知っている場合は、プロセスについて質問する質問がもう少しあるので、私に知らせてください。

役に立ちましたか?

解決

私はこれをやや理解したと思います。使用する主な方法はJVMTi-> getLineNumbertable(...)です。 BCIライン番号n(ソースライン番号にマッピングされる)を考えると、int Iがどのようなものであるかをテストできます:jvmtilineNumberEnterryArray [i] <= n <jvmtilineNumberentryArray [i + 1]。これは、目的の対応するソースコード行番号です。

1つのキャッチは、何らかの理由でAsyncgetCalltraceが一貫して奇妙なBCIを返すことです。 正確 ソースコードライン番号、まだそうではありません 正確, 、元のBCIが正確ではないためです。なぜこれが、私は知りません。 AsyncgetCalltraceも使用しているSun Studioプロファイラーを使用して、返されたライン番号が私のプロファイラーと同じかどうかをテストしたいと思っていました。その場合、AsyncgetCalltrace関数は不正確です。しかし、これまでのところ、Sun Studioを使用すると、独自の挑戦になりました。 誰かがこのツールの使用方法を知っているなら、助けてください!

より大きなキャッチは、Javaメソッドがしばしばインライン化されているため、ライン番号が必ずしも正しくマッピングされるとは限らないことです。実際、これは上記の段落で説明されている問題の原因かもしれませんが、これは私が見てきた数字に基づいている可能性は低いようです。インラインの問題の解決に関する情報を次に示します。 http://developer.amd.com/documentation/articles/pages/jvmtieventpiggybacking.aspx

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top