Melakukan debug jarak jauh pada aplikasi Java

254

Saya memiliki aplikasi java yang berjalan di mesin linux. Saya menjalankan aplikasi java menggunakan yang berikut:

java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n

Saya telah membuka port 4000 untuk TCP pada mesin Linux ini. Saya menggunakan gerhana dari mesin Windows XP dan mencoba untuk terhubung ke aplikasi ini. Saya telah membuka port di windows juga.

Kedua mesin berada di LAN tetapi saya sepertinya tidak bisa menghubungkan debugger ke aplikasi Java. Apa yang saya lakukan salah?

dzidzitop
sumber
Sama sekali bukan duplikat. Pertama, ini adalah pertanyaan lama. Kedua, jawaban untuk pertanyaan ini harus agnostik dari lingkungan debugging.
Addison

Jawaban:

476

Sunting: Saya perhatikan bahwa beberapa orang memotong dan menempel doa di sini. Jawaban yang awalnya saya berikan hanya relevan untuk OP. Berikut gaya doa yang lebih modern (termasuk menggunakan port 8000 yang lebih konvensional):

java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n <other arguments>

Jawaban asli berikut.


Coba ini:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n myapp

Dua poin di sini:

  1. Tidak ada spasi dalam runjdwpopsi.
  2. Opsi datang sebelum nama kelas. Setiap argumen yang Anda miliki setelah nama kelas adalah argumen untuk program Anda!
Chris Jester-Young
sumber
2
@DJGummikuh Bagus! Saya telah memperbarui posting untuk menggunakan -agentlibopsi gaya-baru untuk kesenangan memotong dan menempel Anda. :-)
Chris Jester-Young
Apakah kita selalu perlu memiliki kode sumber agar aplikasi jarak jauh ada di mesin tempat kita melakukan debugging jarak jauh?
MasterJoe2
Anda perlu tahu kode sumbernya. Entah Anda memiliki file .java atau Anda memiliki file .jar / .class yang digabungkan dengan dekompiler. IDE seperti Eclipse dapat memiliki dekompiler seperti JDecompiler diinstal sehingga Anda dapat men-debug file .class seolah-olah itu file .java (tidak termasuk komentar).
Iwan Satria
1
Layak mengulangi komentar dari stackoverflow.com/a/138518/500902 ini , "Karena Java 9" address = 1044 "tidak selalu mendengarkan di semua antarmuka." Address = *: 1044 "membuat Java 9+ berperilaku seperti Java 8" menjadi bolehkan debugging dari host yang berbeda
Marvin
84

Untuk JDK 1.3 atau sebelumnya:

-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006

Untuk JDK 1.4

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006

Untuk JDK yang lebih baru:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6006

Silakan ubah nomor port sesuai kebutuhan Anda.

Dari java technotes

Dari 5.0 dan seterusnya -agentlib: opsi jdwp digunakan untuk memuat dan menentukan opsi ke agen JDWP. Untuk rilis sebelum 5.0, opsi -Xdebug dan -Xrunjdwp digunakan (implementasi 5.0 juga mendukung opsi -Xdebug dan -Xrunjdwp tetapi opsi -agentlib: jdwp yang lebih baru lebih disukai karena agen JDWP di 5.0 menggunakan antarmuka JVM TI untuk menggunakan VM daripada antarmuka JVMDI yang lama)

Satu hal lagi yang perlu diperhatikan, dari dokumentasi antarmuka JVM Tool :

JVM TI diperkenalkan di JDK 5.0. JVM TI menggantikan Java Virtual Machine Profiler Interface (JVMPI) dan Java Debug Interface Mesin Virtual (JVMDI) yang, pada JDK 6, tidak lagi disediakan.

Sairam Krish
sumber
Berikut ini berfungsi dengan pengaturan default Eclipse: -agentlib: jdwp = transport = dt_socket, server = y, address = 8000
Sundae
29

Langkah:

  1. Mulai aplikasi java jarak jauh Anda dengan opsi debugging seperti yang dikatakan dalam posting di atas.
  2. Konfigurasikan Eclipse untuk debugging jarak jauh dengan menentukan host dan port.
  3. Mulai debugging jarak jauh di Eclipse dan tunggu koneksi berhasil.
  4. Setup breakpoint dan debug.
  5. Jika Anda ingin men-debug dari awal penggunaan aplikasi suspend = y, ini akan membuat aplikasi jarak jauh ditangguhkan hingga Anda terhubung dari gerhana.

Lihat Panduan langkah demi langkah pada debugging jarak jauh Java untuk detail lengkap.

Gaurav
sumber
16

Jawaban yang mencakup Java> = 9:

Untuk Java 9+, opsi JVM perlu sedikit perubahan dengan mengawali alamat dengan alamat IP mesin yang menjadi tuan rumah JVM, atau hanya *:

-agentlib:jdwp=transport=dt_socket,server=y,address=*:8000,suspend=n

Ini disebabkan oleh perubahan yang dicatat di https://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435 .

Untuk Java <9, nomor port cukup untuk terhubung.

M Anouti
sumber
8

Saya ingin menekankan bahwa urutan argumen itu penting .

Bagi saya java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jarperintah membuka port debugger ,

tetapi java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000perintah tidak .

Tuan hitam
sumber
3
Saya kira itu karena dalam contoh kedua Anda, semuanya setelah "app.jar" diteruskan sebagai argumen ke dalam metode utama Anda
xoX Zeus Xox
@xoXZeusXox ha ha. Ya, itu dianggap sebagai argumen. Terima kasih telah menyebutkan.
MrBlack
1

Ini adalah bagaimana Anda harus mengatur Eclipse Debugger untuk debugging jarak jauh:

Pengaturan Eclipse:

1. Klik Tombol Jalankan 2. Pilih
Konfigurasi Debug
3. Pilih "Aplikasi Java Jarak Jauh"
4. Konfigurasi Baru

  • Nama: GatewayPortalProject
  • Proyek: GatewayPortal-portlet
  • Tipe Koneksi: Pasang Soket
  • Properti Koneksi: i) localhost ii) 8787

Untuk JBoss:

1. Ubah /path/toJboss/jboss-eap-6.1/bin/standalone.confdi vm Anda sebagai berikut: Batalkan komentar pada baris berikut dengan menghapus #:

JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"

Untuk Tomcat:

Dalam file catalina.bat :

Langkah 1:

CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"

Langkah 2:

JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"

Langkah 3: Jalankan Tomcat dari command prompt seperti di bawah ini:

catalina.sh jpda start

Maka Anda perlu mengatur breakpoints di kelas Java yang ingin Anda debug.

Pritam Banerjee
sumber
Di Java 8 JDK mendukung variabel lingkungan JAVA_TOOL_OPTIONS sehingga untuk mengaktifkan debugger untuk aplikasi Java apa pun yang perlu Anda gunakan: JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n ps maaf untuk pengeditan, berkelahi dengan formatter.
Nathan Niesen