Frage

Ich möchte durch die Anzeige des Programms Methodenaufrufe als Äste eines Baumes eine einfache Visualisierung eines Java-Programms schreiben. Dies könnte ganz einfach durchgeführt werden, indem das Programm selbst die Visualisierung sagen, was es tut, aber ich möchte, dies zu tun, um mit jeder Java-Methode / Klasse und nicht nur die, die ich so zu tun, ändern zu.

Was ich brauche, ist die Fähigkeit, die Methoden ein Programmaufruf und welche Methoden innerhalb dieser Methode und so weiter genannt werden zu beobachten. Offensichtlich stapeln Spuren bieten genau diese Funktionalität:

 java.lang.NullPointerException
     at MyClass.mash(MyClass.java:9)
     at MyClass.crunch(MyClass.java:6)
     at MyClass.main(MyClass.java:3)

So dachte ich über das Programm, die ich will laufen in einem Thread überwachen und dann schauen gerade in diesem Stapel des Threads. Allerdings ist die Thread-Klasse nicht wirklich diese unterstützen. Es unterstützt nur Drucken der aktuelle Stack.

Jetzt habe ich, natürlich, dachte an einfach die Print der System-Klasse zu ändern, so der Faden seine Stapel drucken würde in mein Print, aber das fühlt sich irgendwie falsch.

Gibt es einen besseren Weg, dies zu tun? Gibt es bereits bestehende Klassen / Methoden kann ich verwenden?

Auch bin ich das Herunterladen zur Zeit den Quellcode von Java, um zu überprüfen, wie genau die Thread-Klasse druckt seinen Stack so könnte ich vielleicht Unterklasse Thread und imitiert den dumpStack () -Methode mit meinem eigenen getStack () -Methode.

War es hilfreich?

Lösung 2

Oh schießen, auf der Suche durch den Quellcode bemerkte ich die Thread-Klasse eine Methode public StackTraceElement [] getStackTrace hat (), es war einfach nicht in der Dokumentation ich lese. Jetzt fühle ich mich dumm.

Also ja, das scheint die Lösung zu sein.

Andere Tipps

Sehen Sie auch bei VisualVM, ausgeliefert mit den neuesten Java veröffentlicht.

Ein Ansatz könnte sein, wie etwas zu benutzen BCEL Vorprozess das Ziel Bytecode einfügen Anrufe Ihr eigener Code auf jeder Methode Ein- und Ausstieg (wahrscheinlich am besten Ausgang zu tun, indem sie das ganze Verfahren in einem try / finally-Block Umwickeln Ausnahme Ausfahrten zu fangen). Von diesem können Sie den Anruf Baum genau ableiten, wie es geschieht.

könnten Sie AspectJ dafür. Werfen Sie einen Blick auf diese Beschreibung genau rel="nofollow Ihr Anwendungsfall.

Haben Sie einen Blick auf die ThreadMXBean Klasse - meine es das, was du brauchst. Im Wesentlichen Sie:

  • nennen ManagementFactory.getThreadMXBean () eine Instanz von ThreadMXBean zu erhalten;
  • Anruf getAllThreadIds () auf dem resultierenden ThreadMXBean aktuellen Threads aufzuzählen;
  • rufen getThreadInfo (), um die Top-n-Stack-Trace-Elemente aus einer vorgegebenen Liste von Themen zu erhalten.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top