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:
quelle
Antworten:
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:
Der Konnektorname withe arg kann mit gefunden werden
jdb -listconnectors
.quelle
jsadebugd
durch ersetztjhsdb debugd
. So wird dasjhsdb debugd --pid <pid>
. Siehe Folien eines Vortrags, in dem jhsdb und die Dokumente für jhsdbSADebugServerAttachingConnector
entfernt wordenjdb
zu sein, und ich denke, der Ersatz solljhsdb hsdb
/ seinjhsdb clhsdb
. Ich kann keine Dokumente finden, zu denen ich Argumente geben kannjhsdb clhsdb
.In Sowjetrußland liest Sie die Quelle
quelle
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.
quelle
Die Verwendung von jstack (nützlich bei Deadlocks) oder des VisualVM-Plugins btrace könnte ebenfalls hilfreich sein
quelle
Sie können immer jdb verwenden und von Hand debuggen: P.
quelle