ดีบักแอ็พพลิเคชัน java โดยไม่เริ่ม JVM ด้วยอาร์กิวเมนต์ดีบัก


98

โดยปกติในการแนบดีบักเกอร์กับ jvm ที่รันอยู่คุณจะต้องเริ่ม jvm ด้วยอาร์กิวเมนต์ดังต่อไปนี้:

> java -Xdebug -Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n

ตอนนี้ถ้าฉันต้องการดีบักกระบวนการที่ไม่ได้เริ่มในโหมดดีบักฉันจะทำอย่างไร?

สถานการณ์นี้เกิดขึ้นเมื่อระบบการผลิต (เช่นเริ่มต้นโดยไม่มีอาร์กิวเมนต์ดีบัก) แสดงข้อผิดพลาด 'สุ่ม' (ฉันใช้คำว่าหลวม ๆ ) ดังนั้นฉันจึงไม่สามารถรีสตาร์ท jvm ด้วยอาร์กิวเมนต์ที่เหมาะสมได้เพราะไม่มีใครรู้วิธีสร้างจุดบกพร่องอีกครั้ง เป็นไปไม่ได้ที่จะแนบ JVM ในสถานการณ์นี้หรือไม่?

เพียงเพื่อชี้แจงว่าเป็นไปไม่ได้ที่จะใช้เครื่องมือเช่น jdb เพื่อแนบกับ JVM ที่รันอยู่แล้วเว้นแต่จะเริ่มต้นในโหมดดีบัก

จากหน้า JVM man

อีกวิธีในการใช้ jdb คือการเชื่อมต่อกับ Java VM ที่กำลังทำงานอยู่ VM ที่จะดีบักด้วย jdb ต้องเริ่มต้นด้วยตัวเลือกต่อไปนี้:


คำตอบ:


48

คุณอาจสามารถใช้jsadebugd ( JDK ) เพื่อแนบเซิร์ฟเวอร์ดีบักเข้ากับกระบวนการ (พร้อมใช้งานบน Windows ที่มีเครื่องมือดีบั๊กสำหรับ Windows ) ถูกทำเครื่องหมายว่าอยู่ในระหว่างการทดลองดังนั้นคุณอาจต้องทดลองใช้กับเครื่องทดสอบก่อน

การใช้งาน:

jsadebugd <pid>
jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=localhost

หาเรื่องชื่อตัวเชื่อมต่อ withe jdb -listconnectorsสามารถพบการใช้


1
ฉันใช้ linux ดังนั้นนี่จึงเป็นทางออกที่มีแนวโน้มมากที่สุด
hhafez

มีประสบการณ์ที่จะแบ่งปันนี้หรือไม่?
Thorbjørn Ravn Andersen

1
ประสบการณ์ของฉันคือมันใช้งานได้ดีในช่วงเวลาที่ฉันต้องการในเวลาเดียวกันทั้งหมดในอินสแตนซ์จากโรงงานของซอฟต์แวร์ไม่มีการกำหนดค่าให้เปิดใช้งานด้วยตัวเลือกการดีบัก jvm ตามค่าเริ่มต้นดังนั้นเราจึงสามารถใช้วิธีการที่รองรับได้
hhafez

บน Java 11 jsadebugdถูกแทนที่ด้วยjhsdb debugd. jhsdb debugd --pid <pid>เพื่อที่จะกลายเป็น ดูสไลด์ของการพูดคุยที่นำเสนอ jhsdbและเอกสารสำหรับ jhsdb
Delthas

ดูเหมือนว่าSADebugServerAttachingConnectorจะถูกลบออกจากการjdbเป็นอย่างดีและผมคิดว่าการเปลี่ยนควรจะเป็น/jhsdb hsdb jhsdb clhsdbฉันไม่สามารถหาเอกสารใด ๆ jhsdb clhsdbในสิ่งที่ข้อโต้แย้งเพื่อมอบให้แก่
Delthas

32

เพียงเพื่อชี้แจงว่าเป็นไปไม่ได้ที่จะใช้เครื่องมือเช่น jdb เพื่อแนบกับ JVM ที่รันอยู่แล้ว>> เว้นแต่จะเริ่มต้นในโหมดดีบัก

ในแหล่งที่มาของโซเวียตรัสเซียอ่านคุณ

jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426

1
นั่นคือคำตอบที่ "รองรับ" แต่คำตอบทดลองเป็นคำตอบที่ฉันยอมรับดังนั้นจึงสามารถทำได้ในรูปแบบที่ไม่รองรับ
hhafez

7

VisualVMไม่ใช่ดีบักเกอร์ แต่คุณสามารถรับเธรดดั๊มและฮีพดั้มได้ซึ่งจะมีประโยชน์ในการวินิจฉัยปัญหาบางอย่าง คุณสมบัติที่มีประโยชน์ที่สุดต้องใช้ JVM 5 หรือ 6


ลิงค์ใช้งานไม่ได้ .... บางทีคุณอาจจะลบ http: // ก่อน https: // ... ฉันจะมี แต่ชื่อเสียงยังไม่เพียงพอ
Newtopian

+1 VisualVM ดูน่าสนใจจริงๆ BTW: ลิงก์ได้รับการแก้ไขแล้ว
sleske


-5

คุณสามารถใช้ jdb และ debug ด้วยมือได้ตลอดเวลา: P


2
ฉันคิดเสมอว่าคุณไม่สามารถเชื่อมต่อกับ jvm กับ jdb ได้เว้นแต่ jvm จะเริ่มต้นด้วยเพื่ออนุญาตการเชื่อมต่อดีบักฉันผิดหรือเปล่า?
hhafez

เท่าที่ฉันเข้าใจตัวเลือกที่คุณกล่าวถึงคือการ "เปิดใช้งาน" การดีบักระยะไกลของคำสั่ง "java" ของคุณ (VM) แต่คุณยังสามารถใช้คำสั่ง jdb แทนได้ ดังนั้นแทนที่จะเป็น java MyApp คุณจะไปเหมือน jdb MyApp (และดีบักแบบโต้ตอบตั้งค่าเบรกพอยต์เรียกใช้หยุดดู ฯลฯ )
OscarRyz

1
ฉันไม่คิดว่าถูกต้องตามหน้า jdb man - start quote อีกวิธีในการใช้ jdb คือการแนบไปกับ Java VM ที่กำลังทำงานอยู่ VM ที่จะดีบักด้วย jdb ต้องเริ่มต้นด้วยตัวเลือกต่อไปนี้: - end quote
hhafez

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