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:


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.


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

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.


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

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.