web-dev-qa-db-ja.com

Javaでメソッド呼び出しをトレースするにはどうすればよいですか?

以下の2つの単純なJavaクラスを検討してください。

最初の例

class Computer {
    Computer() {
        System.out.println("Constructor of Computer class.");
    }
    void On() {
        System.out.println("PC turning on...");
    }
    void working() {
        System.out.println("PC working...");
    }
    void Off() {
        System.out.println("PC shuting down...");
    }
    public static void main(String[] args) {
        Computer my = new Computer();
        Laptop your = new Laptop();
        my.On();
        my.working();
        your.On();
        your.working();
        my.Off();
        your.Off();
   }
}

2番目の例

class Laptop {
    Laptop() {
        System.out.println("Constructor of Laptop class.");
    }
    void On() {
        System.out.println("Laptop turning on...");
    }
    void working() {
        System.out.println("Laptop working...");
    }
    void Off() {
        System.out.println("Laptop shuting down...");
    }
}

プログラムの実行後、どのようにして(1)どのオブジェクトがどのメソッド(2)を呼び出し、何回トレースしますか?

少し正確ですが、100個のクラスと1000個のオブジェクトがあり、それぞれが数百個のメソッドを呼び出しています。 (プログラムを実行した後)トレースできるようにしたいのですが、どのオブジェクトがどのメソッドを、何回呼び出したかを確認できます。

提案をありがとう。

11
george24

これは、すべてのスレッドのすべてのオブジェクトの各メソッド呼び出しの行を出力します。

Runtime.traceMethodCalls()(非推奨/ Java 9)のno-op)

そして

Runtime.traceInstructions(非推奨/ Java 9)のno-op)

housemdまたはbtrace のようなコールトレーサーを使用できます。 =またはinTrace

より複雑な分析を行うには、次のようなコールグラフユーティリティを使用できます。

(ここに件名の 記事 があります

上記の非推奨のメソッドは削除される予定です。これは、JVM固有の代替手段があるためです。

これらのツールはどちらも、セットアップと情報収集が非常に簡単で、Nice GUIインターフェイスを備えています。それらは実行中のJVMプロセスに接続し、スレッドのスナップショットやその他のさまざまな種類の診断を可能にします(ビジュアルVMには利用可能なプラグインがたくさんありますが、 JFRはデフォルトでより多く装備されているのに対し、デフォルトの動作を超えたい場合。

また、簡単にアクセスできる診断を実行するための、JVM分散コマンドラインユーティリティ($Java_HOME/bin)の有用性を過小評価しないでください。

  • jstackスタックトレース
  • jmapメモリマップ
  • jstatJVM統計モニタリング
  • jhatヒープ分析ツール
  • jdbデバッガ
  • jinfoJavaプロセスまたはコアファイルの構成情報
20
clearlight
$ jdb -classpath ... -sourcepath ... my.App
jdb> stop on my.App.main
jdb> run
jdb> step          <... repeat until get to interesting line...>
jdb> threads
jdb> trace go methods 0x1    <... 0x1 is our main thread ID ...>    
jdb> step
                   <...HERE you get full methods calls trace...>
jdb> quit
0
gavenkoa