Debug aplikasi java tanpa memulai JVM dengan argumen debug

96

Biasanya untuk memasang debuger ke jvm yang sedang berjalan, Anda perlu memulai jvm dengan argumen seperti berikut:

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

Sekarang jika saya ingin men-debug proses yang tidak dimulai dalam mode debug, apa yang dapat saya lakukan?

Situasi ini muncul ketika sistem produksi (yaitu dimulai tanpa debug args) menunjukkan bug 'acak' (saya menggunakan istilah longgar). Jadi saya tidak bisa memulai ulang jvm dengan argumen yang sesuai, karena tidak ada yang tahu bagaimana mereproduksi bug lagi. Apakah tidak mungkin untuk melampirkan ke JVM dalam situasi ini?

Hanya untuk memperjelas, tidak mungkin menggunakan alat seperti jdb untuk melampirkan ke JVM yang sudah berjalan kecuali jika mereka dimulai dalam mode debug

dari halaman manual JVM

Cara lain untuk menggunakan jdb adalah dengan melampirkannya ke VM Java yang sudah berjalan. VM yang akan di-debug dengan jdb harus dimulai dengan opsi berikut:

hhafez.dll
sumber

Jawaban:

48

Anda mungkin dapat menggunakan jsadebugd ( JDK ) untuk memasang server debug ke proses (tersedia di Windows dengan Alat Debugging untuk Windows ). Ini ditandai sebagai eksperimental, jadi Anda mungkin ingin mencobanya di mesin uji terlebih dahulu.

Pemakaian:

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

Nama konektor withe arg dapat ditemukan menggunakan jdb -listconnectors.

McDowell
sumber
1
Saya menggunakan linux jadi sepertinya ini adalah solusi yang paling menjanjikan
hhafez
Ada pengalaman untuk dibagikan dengan ini?
Thorbjørn Ravn Andersen
1
Pengalaman saya adalah bahwa ini bekerja dengan baik pada saat saya membutuhkannya, sementara itu semua dalam contoh pabrik perangkat lunak tidak dikonfigurasi untuk diluncurkan dengan opsi debug jvm secara default sehingga kami dapat menggunakan metode yang didukung.
hhafez
Di Jawa 11 jsadebugddiganti dengan jhsdb debugd. Jadi itu menjadi jhsdb debugd --pid <pid>. Lihat slide ceramah yang menyajikan jhsdb dan dokumen untuk jhsdb
Delthas
Tampaknya SADebugServerAttachingConnectortelah dihapus jdbjuga, dan saya pikir penggantinya seharusnya jhsdb hsdb/ jhsdb clhsdb. Saya tidak dapat menemukan dokumen apa pun tentang argumen apa yang harus diberikan jhsdb clhsdb.
Delthas
32

Hanya untuk memperjelas, tidak mungkin menggunakan alat seperti jdb untuk melampirkan ke JVM yang sudah berjalan>> kecuali jika mereka dimulai dalam mode debug

di sumber rusia soviet membaca Anda

jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426
tanaman di dalam pot
sumber
1
yah itu adalah jawaban yang "didukung" tetapi jawaban eksperimental adalah yang saya terima, jadi ini dapat dilakukan dalam fasion yang tidak didukung
hhafez
7

VisualVM bukanlah debugger, tetapi Anda bisa mendapatkan thread dump dan heap dump darinya yang dapat berguna dalam mendiagnosis beberapa masalah. Fitur yang paling berguna membutuhkan JVM 5 atau 6.

sk.
sumber
Tautan tidak berfungsi .... mungkin Anda akan menghapus http: // sebelum https: // ... Saya akan tetapi belum memiliki reputasi yang cukup
Newtopian
+1 VisualVM terlihat sangat menarik. BTW: Tautan sudah diperbaiki sekarang.
sleske
5

menggunakan jstack (berguna jika terjadi kebuntuan) atau plugin VisualVM btrace juga bisa melakukan trik

Vijay
sumber
-5

Anda selalu dapat menggunakan jdb dan debug dengan tangan: P

OscarRyz
sumber
2
Saya selalu berpikir bahwa Anda tidak dapat melampirkan ke jvm dengan jdb kecuali jvm dimulai dengan untuk mengizinkan koneksi debug. Apakah saya salah?
hhafez
Sejauh yang saya mengerti, opsi yang Anda sebutkan adalah untuk "mengaktifkan" debug jarak jauh dari perintah "java" Anda (VM). Tetapi Anda juga dapat menggunakan perintah jdb sebagai gantinya. Jadi, alih-alih java MyApp, Anda akan menggunakan jdb MyApp (dan men-debug secara interaktif, mengatur breakpoint, menjalankan, menghentikan, menonton, dll.)
OscarRyz
1
Menurut saya itu tidak benar menurut halaman manual jdb - mulai kutipan Cara lain untuk menggunakan jdb adalah dengan melampirkannya ke Java VM yang sudah berjalan. VM yang akan di-debug dengan jdb harus dimulai dengan opsi berikut: - kutipan akhir
hhafez
Dengan konektor yang benar (tidak didukung untuk saat ini) jdb dapat terhubung ke proses yang sedang berjalan.
Thorbjørn Ravn Andersen