web-dev-qa-db-fra.com

Déboguer une Java sans démarrer la JVM avec des arguments de débogage

Normalement, pour attacher un débogueur à un jvm en cours d'exécution, vous devez démarrer le jvm avec des arguments tels que les suivants:

> Java -Xdebug -Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n

Maintenant, si je veux déboguer un processus qui n'a pas été démarré en mode débogage, que puis-je faire?

Cette situation se produit lorsqu'un système de production (c'est-à-dire démarré sans arguments de débogage) présente un bogue `` aléatoire '' (j'utilise le terme librement). Je ne peux donc pas redémarrer le jvm avec les arguments appropriés, car personne ne sait comment reproduire le bogue. Est-il impossible de se connecter à la JVM dans cette situation?

Juste pour clarifier, il n'est pas possible d'utiliser des outils comme jdb pour attacher à des JVM déjà en cours d'exécution à moins qu'elles n'aient été démarrées en mode débogage

à partir de la page de manuel JVM

ne autre façon d'utiliser jdb est de l'attacher à un Java VM qui est déjà en cours d'exécution. A VM = qui doit être débogué avec jdb doit être démarré avec les options suivantes:

92
hhafez

Vous pourrez peut-être utiliser jsadebugd ( JDK ) pour attacher un serveur de débogage au processus (disponible sur Windows avec le - Outils de débogage pour Windows ). Il est marqué comme expérimental, vous pouvez donc d'abord l'essayer sur une machine de test.

Usage:

jsadebugd <pid>
jdb -connect Sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=localhost

Le nom du connecteur avec l'argument peut être trouvé à l'aide de jdb -listconnectors.

46
McDowell

Juste pour clarifier, il n'est pas possible d'utiliser des outils comme jdb pour attacher à des JVM déjà en cours d'exécution>> à moins qu'elles n'aient été démarrées en mode débogage

en russie soviétique source vous lit

jdb -connect Sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426
29
potted plant

VisualVM n'est pas un débogueur, mais vous pouvez en obtenir des vidages de threads et des vidages de tas qui peuvent être utiles pour diagnostiquer certains problèmes. Les fonctionnalités les plus utiles nécessitent JVM 5 ou 6.

8
sk.

utiliser jstack (utile en cas de blocages) ou le plugin btrace VisualVM pourrait aussi faire l'affaire

5
Vijay