ฉันรู้ว่ามีบางอย่างJAVA_OPTS
ที่ตั้งค่าให้ดีบักโปรแกรม Java จากระยะไกล
พวกเขาคืออะไรและพวกเขาหมายถึงอะไร
ฉันรู้ว่ามีบางอย่างJAVA_OPTS
ที่ตั้งค่าให้ดีบักโปรแกรม Java จากระยะไกล
พวกเขาคืออะไรและพวกเขาหมายถึงอะไร
คำตอบ:
ฉันมีบทความนี้คั่นหน้าในการตั้งค่านี้สำหรับ 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
ก่อน 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') ให้เริ่มการทำงานทันทีXrunjdwp
เลิกใช้ (หรือเอาออก?) ทำไมเราจะเลือกagentlib:jdwp
มากกว่านั้น?
-Xdebug -Xrunjdwp
เมื่อทำการดีบักโปรเจ็กต์ Maven และพวกมันทำงานเหมือนกำลัง JITed
เนื่องจาก 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
สำหรับ 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
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8001,suspend=y -jar target/cxf-boot-simple-0.0.1-SNAPSHOT.jar
address
ระบุพอร์ตที่จะอนุญาตให้มีการดีบัก
** แอพ Debug Spring Boot ด้วย Maven:
mvn spring-boot:run -Drun.jvmArguments=**"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8001"
นี่คือทางออกที่ง่ายที่สุด
มีการกำหนดค่าพิเศษสภาพแวดล้อมจำนวนมากที่จำเป็นหากคุณใช้ Maven ดังนั้นถ้าคุณเริ่มโปรแกรมจาก maven เพียงแค่เรียกใช้mvnDebug
คำสั่งแทนmvn
มันจะดูแลการเริ่มต้นแอพของคุณด้วยการดีบักแบบรีโมทที่ได้รับการกำหนดค่า ตอนนี้คุณสามารถแนบดีบักเกอร์บนพอร์ต 8000
มันจะดูแลปัญหาสิ่งแวดล้อมทั้งหมดสำหรับคุณ
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=PORT_NUMBER
gradle bootrun --debug-jvm
mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER
ที่นี่เราเพิ่งใช้ Socket Attaching Connector ซึ่งเปิดใช้งานโดยค่าเริ่มต้นเมื่อการขนส่ง dt_socket ถูกกำหนดค่าและ VM กำลังทำงานในโหมดการดีบักเซิร์ฟเวอร์
สำหรับรายละเอียดเพิ่มเติมคุณสามารถดูได้ที่: https://stackify.com/java-remote-debugging/
*:1044
เปิดใช้งานการดีบักแบบรีโมทจากคอมพิวเตอร์เครื่องใดก็ได้