Apa saja opsi baris perintah Java yang akan ditetapkan untuk memungkinkan JVM untuk di-debug jarak jauh?

321

Saya tahu ada beberapa yang JAVA_OPTSdiatur untuk men-debug program Java dari jarak jauh.

Apa itu dan apa artinya?

paulgreg
sumber

Jawaban:

303

Saya memiliki artikel ini ditandai pada pengaturan ini untuk Java 5 dan di bawah.

Pada dasarnya jalankan dengan :

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

Untuk Java 5 dan di atasnya , jalankan dengan:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044
Hans Sjunnesson
sumber
19
Layak untuk disebutkan adalah bahwa Anda mungkin ingin mengonfigurasi alamat Anda seperti *:1044mengaktifkan debugging jarak jauh dari komputer mana pun
Herr Derb
6
HerrDerb benar .. Karena Java 9 "address = 1044" tidak selalu mendengarkan pada semua antarmuka. "address = *: 1044" membuat Java 9+ berperilaku seperti Java 8 ...
alfonx
459

Sebelum Java 5.0, gunakan -Xdebugdan -Xrunjdwpargumen. Opsi ini masih akan berfungsi di versi yang lebih baru, tetapi akan berjalan dalam mode yang diartikan sebagai ganti JIT, yang akan lebih lambat.

Dari Java 5.0, lebih baik menggunakan -agentlib:jdwpopsi tunggal:

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

Opsi -Xrunjdwpatau agentlib:jdwpargumen adalah:

  • transport=dt_socket : berarti cara yang digunakan untuk terhubung ke JVM (soket adalah pilihan yang baik, dapat digunakan untuk men-debug komputer yang jauh)
  • address=8000 : Port TCP / IP terbuka, untuk terhubung dari debugger,
  • suspend=y : jika 'y', beri tahu JVM untuk menunggu sampai debugger dilampirkan untuk memulai eksekusi, jika tidak (jika 'n'), segera mulai eksekusi.
paulgreg
sumber
7
Anda benar sekali .. Saya mencoba dengan -Xdebug dan -Xrunjdwp tetapi tidak berhasil. ketika saya mencoba dengan -Xrunjdwp atau agentlib: jdwp berfungsi. (di Jawa 7)
RoboAlex
Ini hanya berfungsi untuk saya ketika saya memberikan tanda kutip di sekitarnya, jika tidak saya akan mendapatkan kesalahan ini: ERROR: JDWP Transport non-server dt_socket server = y suspend = y address = 8000 harus memiliki alamat koneksi yang ditentukan melalui opsi 'address ='
Ring
1
Apakah Xrunjdwpditinggalkan (atau dihapus?) Mengapa kita harus mengambilnya agentlib:jdwp?
ArtOfWarfare
2
Saya pikir kamu salah. Netbeans menggunakan -Xdebug -Xrunjdwpketika men-debug proyek Maven, dan mereka berjalan seperti mereka JIT.
Aleksandr Dubinsky
78

Karena Java 9.0 JDWP hanya mendukung koneksi lokal secara default. http://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435

Untuk debugging jarak jauh seseorang harus menjalankan program dengan *:alamat:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000
Antony Shumskikh
sumber
1
Ini harus mendapatkan lebih banyak upvotes, karena ini merupakan petunjuk penting yang berlaku untuk semua versi Java baru.
Sebastian S
1
Hanya membuat catatan: tautan Oracle mengatakan ini akan mencapai perilaku lama yang sama, tetapi tidak aman dan tidak disarankan.
Chanseok Oh
9

Untuk java 1.5 atau lebih besar:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

Untuk java 1.4:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

Untuk java 1.3:

java -Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

Ini adalah output dari program sederhana:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044 HelloWhirled
Listening for transport dt_socket at address: 1044
Hello whirled
thebiggestlebowski
sumber
5

Jawa

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8001,suspend=y -jar target/cxf-boot-simple-0.0.1-SNAPSHOT.jar

address menentukan port yang memungkinkannya untuk di-debug

Maven

** Aplikasi Debug Spring Boot dengan Maven:

mvn spring-boot:run -Drun.jvmArguments=**"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8001"
Jovi Qiao
sumber
2

Inilah solusi termudah.

Ada banyak konfigurasi khusus lingkungan yang diperlukan jika Anda menggunakan Maven. Jadi, jika Anda memulai program Anda dari maven, jalankan saja mvnDebugalih-alih mvn, itu akan memulai aplikasi Anda dengan konfigurasi debugging jarak jauh. Sekarang Anda bisa melampirkan debugger pada port 8000.

Ini akan mengurus semua masalah lingkungan untuk Anda.

neves
sumber
1

Garis komando

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

Gradle

gradle bootrun --debug-jvm

Maven

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER
Santosh b
sumber
1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER

Di sini kita hanya menggunakan Socket Attaching Connector, yang diaktifkan secara default ketika transport dt_socket dikonfigurasi dan VM berjalan dalam mode debugging server.

Untuk lebih jelasnya Anda bisa merujuk ke: https://stackify.com/java-remote-debugging/

Boney
sumber