ในส่วนนี้ลองใช้การดีบักระยะไกล Java และบันทึกสิ่งง่าย ๆ เพื่อเริ่มต้น แม้ว่ามันจะเป็นบันทึก!
เขียนโปรแกรมง่ายๆและพิมพ์ลงในขวดและโยนลงในเซิร์ฟเวอร์ระยะไกลเพื่อเรียกใช้โดยจำลองว่าเซิร์ฟเวอร์ระยะไกลกำลังทำงานอยู่ ใช้โปรแกรมการส่ง Java Calling Shell Script เป็นตัวอย่าง ซอร์สโค้ดมีดังนี้ (โปรแกรมต่อไปนี้เป็นรหัสตัวอย่างง่าย ๆ อย่าสนใจเกี่ยวกับข้อกำหนดรหัส):
นำเข้า Java.io.InputStream; Javashell คลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {ลอง {String Grant = "Chmod U+X subment-job.sh"; runtime runtime = runtime.getRuntime (); Process GrantProc = runtime.exec (Grant); int resultCode = grantProc.waitfor (); System.out.println (รหัสผลลัพธ์); GrantProc = runtime.exec ("./ subment-job.sh"); resultCode = grantProc.waitfor (); System.out.println (รหัสผลลัพธ์); InputStream ใน = GrantProc.getInputStream (); ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [1024]; รหัส int; ในขณะที่ ((code = in.read (บัฟเฟอร์, 0, buffer.length))! = -1) {system.out.print (สตริงใหม่ (บัฟเฟอร์, 0, รหัส)); } / ** * The Dead Loop ป้องกันไม่ให้ดีบักเกอร์ออกก่อนที่จะเชื่อมต่อ (ทดสอบฟังก์ชันพารามิเตอร์ Suspend) * / System.out.println ("Shell Script ถูกดำเนินการแล้วและงานการพิมพ์ที่กำหนดเวลาจะเริ่มขึ้น!"); int i = 0; ในขณะที่ (จริง) {thread.sleep (2000); System.out.println ("นี่คือ" th " + (++ i) +" ลูปที่สอง! ");}} catch (ข้อยกเว้น e) {system.out.println (" นี่คือ excption! ");} ในที่สุด {}}}}}}}}}}หลังจากส่งไปยังเซิร์ฟเวอร์ระยะไกลให้เรียกใช้:
คัดลอกรหัสดังนี้: java -xdebug -xnoagent -djava.compiler = ไม่มี -xrunjdwp: การขนส่ง = dt_socket, ที่อยู่ = 9999, เซิร์ฟเวอร์ = y, suspend = y -jar javashell.jar
โปรแกรมจะถูกบล็อกและรอให้ดีบักเกอร์เชื่อมต่อ ในเวลานี้เราสามารถใช้ Eclipse สำหรับการดีบักระยะไกล:
คลิกดีบักเกอร์เพื่อเชื่อมต่อและติดตามซอร์สโค้ดเพื่อเรียกใช้:
มีเอาต์พุตจากระยะไกลพิสูจน์ว่าโปรแกรมระยะไกลกำลังติดตามการดำเนินการดีบักเกอร์:
ณ จุดนี้เราเสร็จสิ้นกระบวนการดีบัก จากนั้นลองใช้กรณีที่พารามิเตอร์ suspend = n:
คัดลอกรหัสดังนี้: java -xdebug -xnoagent -djava.compiler = ไม่มี -xrunjdwp: การขนส่ง = dt_socket, ที่อยู่ = 9999, เซิร์ฟเวอร์ = y, suspend = n -jar javashell.jar
ในเวลานี้คุณจะพบว่าโปรแกรมระยะไกลไม่ได้บล็อกและรอการเชื่อมต่อดีบักเกอร์ดีบักเกอร์ แต่โปรแกรมดำเนินการตามปกติ:
ในเวลานี้เราสามารถใช้ดีบักเกอร์ระยะไกลของ Eclipse สำหรับการดีบักระยะไกล แต่ควรสังเกตว่าเบรกพอยต์ในพื้นที่ของเราสามารถถูกตีที่รหัสระยะไกลที่ไม่ได้ดำเนินการหรือรหัสที่กำลังดำเนินการ ตัวอย่างเช่นเราสามารถทำลายคะแนนใน The Dead Loop (The Dead Loop เป็นรหัสที่ถูกดำเนินการตลอดเวลา):
จากนั้นเริ่มดีบักเกอร์:
อยู่ที่จุดพัก จากนั้นติดตามตำแหน่งเบรกพอยต์เพื่อดำเนินการตรวจแก้จุดบกพร่องของเราต่อไป ณ จุดนี้คุณควรรู้บทบาทของพารามิเตอร์การระงับ:
ในพารามิเตอร์การดีบัก JVM มีพารามิเตอร์ที่เรียกว่า "Suspend" ซึ่งมีสองค่า "Y" หรือ "N"
หากคุณต้องการดีบักที่จุดเริ่มต้นให้ตั้งค่าพารามิเตอร์เป็น "Suspend = Y" ดังนั้น Eclipse จะเชื่อมต่อกับแอปพลิเคชัน Java จากระยะไกล
หากคุณต้องการเรียกใช้โครงการก่อนจากนั้นเชื่อมต่อ Eclipse คุณสามารถตั้งค่าพารามิเตอร์เป็น "Suspend = N" เพื่อให้แอปพลิเคชัน Java จะทำงานตามปกติและ Eclipse จะเริ่มการเชื่อมต่อระยะไกล
รายละเอียดพารามิเตอร์เพิ่มเติม:
-xdebug เปิดใช้งานการดีบัก
-xnoagent ปิดการใช้งาน DEFAULT SUN.tools.debug ดีบักเกอร์
-djava.compiler = ไม่มีห้ามโหลดคอมไพเลอร์ JIT
-xRunJDWP โหลดตัวอย่างการดำเนินการอ้างอิง JPDA ของ JDWP
การขนส่งถูกใช้เพื่อสื่อสารระหว่าง debuggers และกระบวนการที่ใช้โดย VM
การถ่ายโอนซ็อกเก็ต DT_Socket
DT_SHMEM การถ่ายโอนหน่วยความจำที่ใช้ร่วมกัน Windows เท่านั้น
เซิร์ฟเวอร์ = y/n ไม่ว่าจะต้องดำเนินการ VM เป็นเซิร์ฟเวอร์การดีบักหรือไม่
ที่อยู่ = 3999 หมายเลขพอร์ตของเซิร์ฟเวอร์ดีบั๊กหมายเลขพอร์ตที่ไคลเอนต์ใช้เพื่อเชื่อมต่อกับเซิร์ฟเวอร์
suspend = y/n ไม่ว่าจะเริ่ม VM หรือไม่หลังจากไคลเอนต์ดีบักสร้างการเชื่อมต่อ
คีย์ลัดการดีบัก Eclipse:
F5 ก้าวเข้าสู่
F6 ก้าวไป
F7 ก้าวออก
F8 ดำเนินการต่อไปยังจุดพักถัดไป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น