5

次のようにコンパイルすると、このデバッグ情報が .class ファイルに含まれることがわかります。

javac -g Main.java

LineNumberTable:次のセクションから手動で確認できます。

javap -c -constants -private -verbose '$<' > '$@'

私が欲しいのはjavap、バイトコードの途中でソースを表示することです。

サンプル入力:

public class New {
    public static void main(String[] args) {
        System.out.println(new Integer(1));
    }
}

実際のjavap出力:

   0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
   3: new           #3                  // class java/lang/Integer
   6: dup
   7: iconst_1
   8: invokespecial #4                  // Method java/lang/Integer."<init>":(I)V
  11: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
  14: return
LineNumberTable:
  line 3: 0
  line 4: 14

望ましい javap 出力:

       System.out.println(new Integer(1));
   0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
   3: new           #3                  // class java/lang/Integer
   6: dup
   7: iconst_1
   8: invokespecial #4                  // Method java/lang/Integer."<init>":(I)V
  11: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
    }
  14: return
LineNumberTable:
  line 3: 0
  line 4: 14

これにより、出力の解釈がはるかに簡単になりjavapます。

似ていますが、より一般的な質問: javap を使用して、Java コードの行に対応するバイトコードの行を確認する方法は?

私はしようとしました:

しかし、返信はなく、私のメッセージはそれらの Web サイトにも表示されません。あまりオープンなプロジェクトではありません。

4

1 に答える 1

2

がこのユース ケースをサポートしているとは思えませんjavapが、ここ数日、いくつかのクラス ファイル解析コードをいじっていました。今日の時点では、ソース コードとアセンブリ コードを混在させることができます。詳細とソース コードについては、https://github.com/gagern/classfileを参照してください。

于 2016-05-06T15:39:09.440 に答える