Debuggen Sie eine Java-Anwendung, ohne die JVM mit Debug-Argumenten zu starten

95

Normalerweise müssen Sie den JVM mit Argumenten wie den folgenden starten, um einen Debuger an eine laufende JVM anzuhängen:

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

Was kann ich tun, wenn ich einen Prozess debuggen möchte, der nicht im Debug-Modus gestartet wurde?

Diese Situation tritt auf, wenn ein Produktionssystem (dh ohne Debug-Argumente gestartet) einen "zufälligen" Fehler aufweist (ich verwende den Begriff lose). Daher kann ich das JVM nicht mit den entsprechenden Argumenten neu starten, da niemand weiß, wie der Fehler erneut reproduziert werden kann. Ist es in dieser Situation unmöglich, eine Verbindung zur JVM herzustellen?

Zur Verdeutlichung ist es nicht möglich, Tools wie jdb zum Anhängen an bereits ausgeführte JVMs zu verwenden, es sei denn, sie wurden im Debug-Modus gestartet

von der JVM-Manpage

Eine andere Möglichkeit, jdb zu verwenden, besteht darin, es an eine Java-VM anzuhängen, die bereits ausgeführt wird. Eine VM, die mit jdb debuggt werden soll, muss mit den folgenden Optionen gestartet werden:

hhafez
quelle
Siehe auch Java-API zum
Aktivieren des

Antworten:

47

Möglicherweise können Sie jsadebugd ( JDK ) verwenden, um einen Debug-Server an den Prozess anzuhängen (verfügbar unter Windows mit den Debugging-Tools für Windows ). Es ist als experimentell markiert, daher sollten Sie es zuerst auf einem Testgerät ausprobieren.

Verwendung:

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

Der Konnektorname withe arg kann mit gefunden werden jdb -listconnectors.

McDowell
quelle
1
Ich verwende Linux so dies die vielversprechendste Lösung zu sein scheint
hhafez
Irgendwelche Erfahrungen, die man damit teilen kann?
Thorbjørn Ravn Andersen
1
Ich habe die Erfahrung gemacht, dass es in den Zeiten, in denen ich es brauchte, gut funktioniert hat. In der Zwischenzeit sind alle werkseitigen Instanzen der Software nicht so konfiguriert, dass sie standardmäßig mit JVM-Debug-Optionen gestartet werden, sodass wir die unterstützte Methode verwenden können.
Hhafez
Auf Java wurde 11 jsadebugddurch ersetzt jhsdb debugd. So wird das jhsdb debugd --pid <pid>. Siehe Folien eines Vortrags, in dem jhsdb und die Dokumente für jhsdb
Delthas
Es scheint auch SADebugServerAttachingConnectorentfernt worden jdbzu sein, und ich denke, der Ersatz soll jhsdb hsdb/ sein jhsdb clhsdb. Ich kann keine Dokumente finden, zu denen ich Argumente geben kann jhsdb clhsdb.
Delthas
32

Nur um dies zu verdeutlichen, ist es nicht möglich, Tools wie jdb zum Anhängen an bereits ausgeführte JVMs >> zu verwenden, es sei denn, sie wurden im Debug-Modus gestartet

In Sowjetrußland liest Sie die Quelle

jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426
Topfpflanze
quelle
1
Nun, das ist die "unterstützte" Antwort, aber die experimentelle Antwort ist die, die ich akzeptiert habe, so dass sie in einer nicht unterstützten Fasion durchgeführt werden kann
hhafez
7

VisualVM ist kein Debugger, aber Sie können Thread-Dumps und Heap-Dumps daraus abrufen, die bei der Diagnose einiger Probleme hilfreich sein können. Die nützlichsten Funktionen erfordern JVM 5 oder 6.

sk.
quelle
Link funktioniert nicht .... vielleicht entfernen Sie das http: // vor dem https: // ... Ich hätte aber noch nicht genug Ruf
Newtopian
+1 VisualVM sieht wirklich interessant aus. Übrigens: Link ist jetzt behoben.
Sleske
5

Die Verwendung von jstack (nützlich bei Deadlocks) oder des VisualVM-Plugins btrace könnte ebenfalls hilfreich sein

Vijay
quelle
-5

Sie können immer jdb verwenden und von Hand debuggen: P.

OscarRyz
quelle
2
Ich habe immer gedacht, dass Sie mit jdb keine Verbindung zu jvm herstellen können, es sei denn, die jvm wurde gestartet, um Debug-Verbindungen zuzulassen. Bin ich falsch?
Hhafez
Soweit ich weiß, besteht die von Ihnen erwähnte Option darin, das Remote-Debuggen Ihres "Java" -Befehls (der VM) zu "aktivieren". Sie können jedoch stattdessen auch den Befehl "jdb" verwenden. Anstelle von Java MyApp würden Sie also wie jdb MyApp vorgehen (und interaktiv debuggen, Haltepunkte setzen, ausführen, anhalten, beobachten usw. usw.)
OscarRyz
1
Ich denke nicht, dass dies gemäß der JDB-Manpage korrekt ist - Zitat starten Eine andere Möglichkeit, JDB zu verwenden, besteht darin, es an eine Java-VM anzuhängen, die bereits ausgeführt wird. Eine VM, die mit JDB debuggt werden soll, muss mit den folgenden Optionen gestartet werden: - Ende Zitat
Hhafez
Mit dem richtigen Connector (derzeit nicht unterstützt) kann jdb eine Verbindung zu einem laufenden Prozess herstellen.
Thorbjørn Ravn Andersen