ตัวเลือกบรรทัดคำสั่ง Java ใดที่จะตั้งค่าเพื่อให้ JVM สามารถดีบักแบบระยะไกลได้


321

ฉันรู้ว่ามีบางอย่างJAVA_OPTSที่ตั้งค่าให้ดีบักโปรแกรม Java จากระยะไกล

พวกเขาคืออะไรและพวกเขาหมายถึงอะไร

คำตอบ:


303

ฉันมีบทความนี้คั่นหน้าในการตั้งค่านี้สำหรับ Java 5 และด้านล่าง

โดยพื้นฐานแล้วรันด้วย :

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

สำหรับJava 5 ขึ้นไปให้รันด้วย:

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

19
ควรพูดถึงคือคุณอาจต้องการกำหนดค่าที่อยู่ของคุณต้องการ*:1044เปิดใช้งานการดีบักแบบรีโมทจากคอมพิวเตอร์เครื่องใดก็ได้
Herr Derb

6
HerrDerb นั้นถูกต้อง .. เนื่องจาก Java 9 "address = 1044" นั้นไม่ได้ฟังในทุกอินเตอร์เฟส "address = *: 1044" ทำให้ Java 9+ ทำงานเหมือน Java 8 ...
alfonx

459

ก่อน Java 5.0 ให้ใช้-Xdebugและ-Xrunjdwpอาร์กิวเมนต์ ตัวเลือกเหล่านี้จะยังคงใช้งานได้ในรุ่นที่ใหม่กว่า แต่จะทำงานในโหมดตีความแทน JIT ซึ่งจะช้าลง

จาก Java 5.0 จะดีกว่าถ้าใช้-agentlib:jdwpตัวเลือกเดียว:

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

ตัวเลือก-Xrunjdwpหรือagentlib:jdwpข้อโต้แย้งคือ:

  • transport=dt_socket : หมายถึงวิธีที่ใช้เชื่อมต่อกับ JVM (ซ็อกเก็ตเป็นตัวเลือกที่ดีสามารถใช้ในการดีบักคอมพิวเตอร์ที่อยู่ห่างไกล)
  • address=8000 : พอร์ต TCP / IP เปิดเผยเพื่อเชื่อมต่อจากดีบักเกอร์
  • suspend=y : ถ้า 'y' ให้บอก JVM ให้รอจนกว่าตัวดีบั๊กจะเริ่มทำการประมวลผลมิฉะนั้น (ถ้า 'n') ให้เริ่มการทำงานทันที

7
ของคุณถูกต้อง .. ฉันลองกับ-Xdebugและ-Xrunjdwpแต่มันไม่ทำงาน เมื่อฉันลองกับ-Xrunjdwpหรือagentlib: jdwpมันใช้งานได้ (บน Java 7)
RoboAlex

นี้จะทำงานให้ฉันเมื่อฉันใส่คำพูดรอบมันมิฉะนั้นผมได้รับข้อผิดพลาดนี้: ข้อผิดพลาด: JDWP ไม่เซิร์ฟเวอร์เซิร์ฟเวอร์ขนส่ง dt_socket y = ระงับ = อยู่การ y = 8000 จะต้องมีที่อยู่การเชื่อมต่อที่ระบุผ่าน 'ที่อยู่ =' ตัวเลือก
แหวน

1
มีการXrunjdwpเลิกใช้ (หรือเอาออก?) ทำไมเราจะเลือกagentlib:jdwpมากกว่านั้น?
ArtOfWarfare

2
ฉันคิดว่าคุณผิด Netbeans ใช้-Xdebug -Xrunjdwpเมื่อทำการดีบักโปรเจ็กต์ Maven และพวกมันทำงานเหมือนกำลัง JITed
Aleksandr Dubinsky

78

เนื่องจาก Java 9.0 JDWP รองรับเฉพาะการเชื่อมต่อท้องถิ่นโดยค่าเริ่มต้น http://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435

สำหรับการดีบักแบบรีโมตควรรันโปรแกรมด้วย*:ที่อยู่:

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

1
สิ่งนี้ควรเพิ่ม upvotes มากขึ้นเนื่องจากเป็นคำใบ้สำคัญที่ใช้กับ Java เวอร์ชันใหม่ทั้งหมด
เซบาสเตียนเอส

1
แค่จดบันทึก: ลิงค์ของออราเคิลบอกว่าสิ่งนี้จะประสบความสำเร็จในพฤติกรรมแบบเดิม แต่ไม่ปลอดภัยและไม่แนะนำ
Chanseok Oh

9

สำหรับ java 1.5 หรือสูงกว่า:

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

สำหรับ java 1.4:

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

สำหรับ java 1.3:

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

นี่คือผลลัพธ์จากโปรแกรมอย่างง่าย:

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

5

ชวา

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

address ระบุพอร์ตที่จะอนุญาตให้มีการดีบัก

Maven

** แอพ Debug Spring Boot ด้วย Maven:

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

2

นี่คือทางออกที่ง่ายที่สุด

มีการกำหนดค่าพิเศษสภาพแวดล้อมจำนวนมากที่จำเป็นหากคุณใช้ Maven ดังนั้นถ้าคุณเริ่มโปรแกรมจาก maven เพียงแค่เรียกใช้mvnDebugคำสั่งแทนmvnมันจะดูแลการเริ่มต้นแอพของคุณด้วยการดีบักแบบรีโมทที่ได้รับการกำหนดค่า ตอนนี้คุณสามารถแนบดีบักเกอร์บนพอร์ต 8000

มันจะดูแลปัญหาสิ่งแวดล้อมทั้งหมดสำหรับคุณ


1

บรรทัดคำสั่ง

-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

1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER

ที่นี่เราเพิ่งใช้ Socket Attaching Connector ซึ่งเปิดใช้งานโดยค่าเริ่มต้นเมื่อการขนส่ง dt_socket ถูกกำหนดค่าและ VM กำลังทำงานในโหมดการดีบักเซิร์ฟเวอร์

สำหรับรายละเอียดเพิ่มเติมคุณสามารถดูได้ที่: https://stackify.com/java-remote-debugging/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.