2016-10-26 5 views
1

実行しているJVMの現在の(バイトコード)命令ストリームを見たいと思います。いくつかのgoogleingの後、jvmデバッグビルドが-XX:+TraceBytecodesオプション(here参照)を提供していることがわかりました。しかし、ホットスポットのJVMデバッグビルドへのリンクは死んでおり、オンラインでデバッグビルドを見つけることができませんでした:/Javaのバイトコードストリームをトレースする

jvmバイトコードストリームをトレースする別の方法がありますか?私は64ビットのubuntu 16.04を実行しています。

P.S:私は知っている、完全に命令ストリームを印刷するのは非常に遅くなるでしょう。しかし、私は骨董品です

+0

  • 実行して私は本当に私は理解していないよ:あなたは(ファイルまたはコンソールに)リアルタイムで実行されるバイトコードを印刷したいですか? – Asoub

  • +0

    リアルタイムにする必要はありませんが、そうです。それは私が目指しているものです。 – user1228633

    +0

    fastdebugビルドはもう公開されていませんが、ソースコードは公開されていますので、自分で作成することができます。 JDK9のルートリポジトリはhttp://hg.openjdk.java.net/jdk9/jdk9/です。 [このreadme](http://hg.openjdk.java.net/jdk9/jdk9/raw-file/f2bdff2bd261/README-builds.html)は、始めるには最適な場所です。 –

    答えて

    6

    -XX:+TraceBytecodesオプションは、まさにあなたが探しているものです。 HotSpot JVMのデバッグビルドで使用できます。あなたはJVMだけでなく、HotSpotだけで簡単にJVMを構築できます。

    1. OpenJDKの8プロジェクトからクローンホットスポットリポジトリ

      hg clone http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot 
      
    2. ビルド 'fastdebug' JVM(JDKがすでに/usr/java/jdk1.8.0_102にインストールされていると仮定)

      cd hotspot/make 
      make ALT_BOOTDIR=/usr/java/jdk1.8.0_102 ARCH_DATA_MODEL=64 fastdebug 
      

      あなたは、コンパイルを実行するためにHOTSPOT_BUILD_JOBS=Nを追加することができます並列処理ではNです。それ

      export ALT_JAVA_HOME=/usr/java/jdk1.8.0_102 
      ../build/linux/linux_amd64_compiler2/fastdebug/hotspot -XX:+TraceBytecodes MainClass 
      
    +0

    非常に面白い答え、ありがとう!ステップ1と2はOKです。実行するには、私はヒット: 'エラー:Javaランチャーを見つけることができません" /java/re/j2se/1.8.0/promoted/latest/binaries/linux-amd64/bin/java "'。何かヒント? –

    +0

    @MartinMonperrusこれは、 'ALT_JAVA_HOME'環境変数が設定されていないことを意味します。 'ALT_JAVA_HOME'を設定するか、JDKのパスを' build/linux/linux_amd64_compiler2/fastdebug/hotspot'スクリプトで直接変更する必要があります。 – apangin

    +0

    あなたは正しいです。できます。どうもありがとう。 –

    0
    can someone point me in the right direction 
    

    さて私は試してみます。私が見つけたのはjdbです。独自の "プリンタ"を作成する必要があります。

    あなたはこれを好きではなく好奇心から尋ねているので、私はあなたが望むことをするアプリケーションを作成するまでは行かないと思いますが、それを行う他のリソース私は何も見つけられなかった)、または最後に仕事を楽にする。

    jdb(Javaデバッガー)は、JDBA(Java Platform Debugger Architecture)とJVM TI(Java Virtual Machine Tooling Interface)を使用するCLIプログラムです。

    これはどのようjdb作品です:あなたは-gオプション(必須ではありません)を使用してコードをコンパイル

    • jdb(というよりもjava)を使用して、メインクラスを開始します。
    • コンソールでstepコマンドを使用してコードのステップ実行でステップを行うことができますが、これは、複数のバイトコード命令(ソースコード内の命令に対応するすべてのもの)
    • を実行するかもしれないあなたはstepiいるだけ実行を使用することができます1つのバイトコード行。
    • ステップバイステップで実行するにはブレークポイントを設定する必要があります。contオプションは(IDEの場合と同様に)次のブレークポイントに移動します。
    • listオプションを使用すると、ブレークポイント/ライン(バイトコードではない)の周りのコードを表示することができます。
    • また、現在の行番号をソースファイルとバイトコードで取得することもできます(whereiと思います)。

    もう1つのツールは、読み取り可能なバイトコードを取得するためのjavap -cです(しかし、私はあなたがこれを知っていたと思います)。

    これらのすべてで、私はあなたがどこに行くのか分かります。 jdbを使用してステップバイステップのバイトコード実行を行うアプリケーション(Javaアプリケーションまたはシェル/ DOS)を作成し、バイトコードの一致する行をjavac -pから選択して出力します。マルチスレッド環境でどのようにすべきかわかりません。 ASMやdirtyJOEのようなバイトコード可視化ツールもありますが、バイトコードデバッグオプションを提供しているとは思いません。

    私はJVM TIがIDEのデバッガで使用されていると信じていますが、より強力で、より複雑でjdbより複雑かもしれません。

    あなたが興味かもしれないいくつかのリンク:自分のためとして

    、私はまた、Javaデバッグの方法について興味があった(と他のもの)働いたので、これはちょっと興味があったng。

    関連する問題