2008-10-27 10 views
6

J'aime générer un vidage de thread par programme. Je l'ai appris qu'il y a essentiellement deux façons de le faire:Dump du programme par programme/JDI (Java Debugger Interface)

  1. Utilisez le "Java Virtual Machine Interface Tool" machine virtuelle Java-TI
  2. Utilisez le Abstraite plus "Java Debugger Interface" JDI

Pour la JVM-TI, j'ai pu trouver quelques informations utiles, mais je devrais écrire une DLL JNI que, pour le moment, je voudrais éviter. Avec le JDI, je peux utiliser Java et il semble que je suis capable de l'utiliser depuis l'application. Mais je n'ai pas été capable de trouver une sorte de tutoriel ou de HOWTO pour cela. La seule documentation que j'ai pu trouver, ce sont les Java-Docs http://java.sun.com/j2se/1.5.0/docs/guide/jpda/jdi/ ce qui n'est pas très utile, car cela ne me montre pas comment utiliser ces classes. Donc, est-ce que quelqu'un connaît un bon tutoriel/livre que je pourrais lire?

Merci pour toute aide!

Répondre

1

Avez-vous considéré l'alternative à distance? C'est à dire. VisualVM

thead dump with visualVM http://java.sun.com/javase/6/docs/technotes/guides/visualvm/images/applications-window-menu.png

jps and jstack sont également des outils utiles inclus dans JDK 5, en fournissant un procédé de ligne de commande rapide pour obtenir des traces de la pile de tous les fils actuels.

Cet article suggère que JDI est également utilisé comme remote tool. Donc, je ne suis pas sûr que vous pouvez déclencher un vidage de threads dans votre propre programme, mais vous trouvez un moyen de vous envoyer un signal SIGQUIT (kill -3) sur les plates-formes Unix, ou appuyez sur la touche Ctrl- sur Unix ou Ctrl-Break sur les plates-formes Windows.

Plus, JDI wasn't intended to be used to debug the same process in which the JDI client is running. Encore ce fil que je viens de relier est le plus proche que j'ai trouvé pour utiliser réellement JDI dans le même programme.

+0

Merci, maintenant au moins j'ai un forum spécifique où je peux demander! – BugSlayer

+0

De rien. Si c'est l'approche la plus utile, n'oubliez pas d'accepter cette réponse;) – VonC

+0

Notez que l'approche de connexion jvisualvm ne fonctionne que pour "votre propre" JVM et pas d'autres. Cela inclut lors de l'exécution en tant que service Windows. –

3

Thread.getAllStackTraces() décharges seulement la trace d'exécution tous les threads, mais ne donne pas les informations sur les verrous d'objet qui ont été obtenus par un thread particulier ou le verrou sur lequel un thread particulier a été en attente. Fondamentalement, nous ne serons pas en mesure de clouer des blocages avec cela.

Questions connexes