web-dev-qa-db-fra.com

Comment tracer des appels de méthodes en Java?

Considérez les deux classes Java simples ci-dessous:

Premier exemple

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();
   }
}

Deuxième exemple

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...");
    }
}

Après l'exécution du programme, comment puis-je tracer (1) quel objet appelle quelle méthode (2) et combien de fois?

Juste un peu de précision, je pourrais avoir 100 classes et 1000 objets, chacun appelant des centaines de méthodes. Je veux pouvoir tracer (après avoir exécuté le programme), quel objet a appelé quelle méthode et combien de fois.

Merci pour toute suggestion.

8
george24

Ceci affiche une ligne pour chaque appel de méthode de tous les objets dans tous les threads:

Runtime.traceMethodCalls () (obsolète/non opérationnel en Java 9)

Et

Runtime.traceInstructions (obsolète/non opérationnel en Java 9)

Vous pouvez utiliser un traceur d’appel commehousemdoubtraceouinTrace

Pour une analyse plus complexe, vous pouvez utiliser un utilitaire de graphe d’appel comme l’un de ceux-ci:

(voici un article sur le sujet)

Les méthodes obsolètes ci-dessus doivent être supprimées, car il existe désormais des alternatives spécifiques à JVM:

  • Enregistreur de vol JavaFait partie de JDK 7 à partir de la version 56. Nécessite une licence commerciale pour être utilisé dans production _
  • VisualVM3ème partie gratuite/populaire

Ces deux outils sont assez faciles à configurer et à commencer à collecter des informations et disposent d’interfaces graphiques Nice. Ils s’associent à un processus JVM en cours d’exécution et autorisent les instantanés de threads et divers autres types de diagnostics (Visual VM dispose de nombreux plug-ins disponibles, mais cela peut prendre un certain temps à trier pour configurer et comprendre, si vous le souhaitez. aller au-delà du comportement par défaut, alors que JFR est instrumenté avec plus par défaut).

En outre, ne sous-estimez pas l'utilité des utilitaires de ligne de commande distribuée JVM ($Java_HOME/bin) pour effectuer des diagnostics facilement accessibles.

  • jstacktrace de pile
  • jmapcarte mémoire
  • jstatsurveillance des statistiques JVM
  • jhatoutil d'analyse de tas
  • jdbdébogueur
  • jinfoProcessus Java ou informations de configuration de fichier core
13
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
1
gavenkoa