Eseguire il debug di un'applicazione Java senza avviare la JVM con argomenti di debug


95

Normalmente per collegare un debuger a una jvm in esecuzione è necessario avviare la jvm con argomenti come i seguenti:

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

Ora, se voglio eseguire il debug di un processo che non è stato avviato in modalità debug, cosa posso fare?

Questa situazione si verifica quando un sistema di produzione (cioè avviato senza argomenti di debug) mostra un bug "casuale" (uso il termine liberamente). Quindi non posso riavviare la jvm con gli argomenti appropriati, perché nessuno sa come riprodurre nuovamente il bug. È impossibile collegarsi alla JVM in questa situazione?

Giusto per chiarire che non è possibile utilizzare strumenti come jdb per collegarsi a JVM già in esecuzione a meno che non siano stati avviati in modalità debug

dalla pagina man di JVM

Un altro modo per utilizzare jdb è collegarlo a una Java VM già in esecuzione. Una VM di cui eseguire il debug con jdb deve essere avviata con le seguenti opzioni:


Risposte:


47

Potresti essere in grado di usare jsadebugd ( JDK ) per collegare un server di debug al processo (disponibile su Windows con gli strumenti di debug per Windows ). È contrassegnato come sperimentale, quindi potresti provarlo prima su una macchina di prova.

Utilizzo:

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

Il nome del connettore con arg può essere trovato utilizzando jdb -listconnectors.


1
Sto usando Linux, quindi questa sembra essere la soluzione più promettente
hhafez

Qualche esperienza da condividere con questo?
Thorbjørn Ravn Andersen

1
La mia esperienza è che ha funzionato bene le volte che ne avevo bisogno, nel frattempo tutte le istanze di fabbrica del software non sono configurate per l'avvio con le opzioni di debug jvm per impostazione predefinita, quindi possiamo utilizzare il metodo supportato.
hhafez

Su Java 11 è jsadebugdstato sostituito da jhsdb debugd. Così diventa jhsdb debugd --pid <pid>. Guarda le diapositive di un discorso che presenta jhsdb e i documenti per jhsdb
Delthas

Sembra che sia SADebugServerAttachingConnectorstato rimosso anche da jdb, e penso che la sostituzione dovrebbe essere jhsdb hsdb/ jhsdb clhsdb. Non riesco a trovare alcun documento su quali argomenti dare jhsdb clhsdb.
Delthas

32

Giusto per chiarire che non è possibile utilizzare strumenti come jdb per collegarsi a JVM già in esecuzione>> a meno che non siano stati avviati in modalità debug

nella fonte russa sovietica ti legge

jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426

1
beh, questa è la risposta "supportata" ma la risposta sperimentale è quella che ho accettato, quindi può essere eseguita in una modalità non supportata
hhafez

7

VisualVM non è un debugger, ma puoi ottenere dump di thread e dump di heap che possono essere utili per diagnosticare alcuni problemi. Le funzionalità più utili richiedono JVM 5 o 6.


il collegamento non funziona ... forse è meglio rimuovere http: // prima di https: // ... ma non avrei ancora abbastanza reputazione
Newtopian

+1 VisualVM sembra davvero interessante. BTW: il collegamento è stato risolto ora.
sleske

5

anche usare jstack (utile in caso di deadlock) o il plugin btrace VisualVM potrebbe fare il trucco


-5

Puoi sempre usare jdb ed eseguire il debug a mano: P


2
Ho sempre pensato che non puoi collegarti a jvm con jdb a meno che non sia stato avviato jvm per consentire le connessioni di debug. Sbaglio?
hhafez

Per quanto ho capito, l'opzione che hai menzionato è di "abilitare" il debug remoto del tuo comando "java" (la VM) Ma puoi anche usare il comando jdb. Quindi invece di java MyApp andresti come jdb MyApp (ed esegui il debug interattivo, imposta punti di interruzione, corri, ferma, guarda, ecc.)
OscarRyz

1
Non penso che sia corretto secondo la pagina man di jdb - start quote Un altro modo per usare jdb è collegarlo a una Java VM che è già in esecuzione. Una VM di cui eseguire il debug con jdb deve essere avviata con le seguenti opzioni: - end quote
hhafez

Con il connettore corretto (non supportato per ora) jdb può connettersi a un processo in esecuzione.
Thorbjørn Ravn Andersen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.