जावा एप्लिकेशन को दूरस्थ डीबग करना


254

मेरे पास लाइन मशीन पर चलने वाला जावा एप्लिकेशन है। मैं निम्नलिखित का उपयोग करके जावा एप्लिकेशन चलाता हूं:

java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n

मैंने इस लिनक्स मशीन पर टीसीपी के लिए पोर्ट 4000 खोला है। मैं Windows XP मशीन से ग्रहण का उपयोग करता हूं और इस एप्लिकेशन से कनेक्ट करने का प्रयास करता हूं। मैंने खिड़कियों में भी पोर्ट खोला है।

दोनों मशीनें लैन पर हैं, लेकिन मैं डिबगर को जावा एप्लिकेशन से कनेक्ट नहीं कर सकता। मैं क्या गलत कर रहा हूं?




डुप्लिकेट नहीं है। पहला, यह एक पुराना सवाल है। दूसरा, इस प्रश्न का उत्तर डिबगिंग वातावरण का अज्ञेय होना चाहिए।
एडिसन

जवाबों:


476

संपादित करें: मैंने देखा कि कुछ लोग यहां के आह्वान को काट और चिपका रहे हैं। मूल रूप से मैंने जो उत्तर दिया, वह केवल ओपी के लिए प्रासंगिक था। यहाँ एक और आधुनिक आह्वान शैली है (8000 से अधिक पारंपरिक बंदरगाह का उपयोग करके)

java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n <other arguments>

मूल उत्तर इस प्रकार है।


इसे इस्तेमाल करे:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n myapp

यहां दो बिंदु:

  1. runjdwpविकल्प में कोई स्थान नहीं ।
  2. विकल्प वर्ग के नाम से पहले आते हैं। वर्ग के नाम के बाद आपके पास जो भी तर्क हैं, वे आपके कार्यक्रम के लिए तर्क हैं!


2
@DJGummikuh अच्छा लगा! मैंने -agentlibआपके कटिंग-एंड-पेस्टिंग खुशी के लिए नए-शैली के विकल्प का उपयोग करने के लिए पोस्ट अपडेट किया है । :-)
क्रिस जेस्टर-यंग

क्या हमें मशीन में उपस्थित होने के लिए हमेशा रिमोट कोड के लिए स्रोत कोड की आवश्यकता होती है जहां हम दूरस्थ डीबगिंग करते हैं?
मास्टरजॉ 2

आपको सोर्स कोड पता होना चाहिए । या तो आपके पास .java फाइलें हैं या आपके पास .jar / .class फाइलें हैं, जो डीकॉम्पिलेटर के साथ संयुक्त हैं। आईडीई जैसे कि एक्लिप्स में एक डिकंपाइलर हो सकता है जैसे कि JDecompiler स्थापित हो ताकि आप .class फ़ाइल को डीबग कर सकें जैसे कि यह .java फ़ाइल (टिप्पणियों को छोड़कर) हो।
इवान सतरिया

1
इस stackoverflow.com/a/138518/500902 से एक टिप्पणी दोहराते हुए , "चूंकि जावा 9" पता = 1044 "हमेशा सभी इंटरफेस पर नहीं सुन रहा है।" पता = *: 1044 "जावा 8 के लिए जावा 9+ का व्यवहार करता है।" विभिन्न होस्ट से डिबगिंग की अनुमति दें
मार्विन

84

JDK 1.3 या इससे पहले के लिए:

-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006

JDK 1.4 के लिए

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

नए JDK के लिए:

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

कृपया अपनी आवश्यकताओं के आधार पर पोर्ट नंबर बदलें।

से जावा technotes

5.0 से -agentlib: jdwp विकल्प का उपयोग JDWP एजेंट के लिए विकल्पों को लोड करने और निर्दिष्ट करने के लिए किया जाता है। 5.0 से पहले रिलीज़ के लिए, -Xdebug और -Xrunjdwp विकल्पों का उपयोग किया जाता है (5.0 कार्यान्वयन भी -Xdebug और -Xrunjdwp विकल्पों का समर्थन करता है, लेकिन नए -agentlib: jwwp विकल्प बेहतर है क्योंकि 5.0 में JDWP एजेंट JVM TI इंटरफ़ेस का उपयोग करता है) पुराने JVMDI इंटरफ़ेस के बजाय VM)

जेवीएम टूल इंटरफेस प्रलेखन से एक और बात ध्यान देने योग्य है :

JVM TI को JDK 5.0 में पेश किया गया था। JVM TI जावा वर्चुअल मशीन प्रोफाइलर इंटरफ़ेस (JVMPI) और जावा वर्चुअल मशीन डीबग इंटरफ़ेस (JVMDI) को बदल देता है, जो कि JDK 6 के रूप में, अब प्रदान नहीं किए जाते हैं।


निम्नलिखित ग्रहण की डिफ़ॉल्ट सेटिंग्स के साथ काम करता है: -agentlib: jdwp = transport = dt_socket, server = y, पता = 8000
Sundae

29

कदम:

  1. उपरोक्त पोस्ट में डिबगिंग विकल्पों के साथ अपना रिमोट जावा एप्लिकेशन शुरू करें।
  2. होस्ट और पोर्ट निर्दिष्ट करके दूरस्थ डीबगिंग के लिए ग्रहण कॉन्फ़िगर करें।
  3. ग्रहण में दूरस्थ डिबगिंग शुरू करें और कनेक्शन के सफल होने की प्रतीक्षा करें।
  4. ब्रेकपॉइंट और डीबग सेटअप करें।
  5. यदि आप अनुप्रयोग के उपयोग को निलंबित = y से प्रारंभ करना चाहते हैं, तो यह दूरस्थ अनुप्रयोग को तब तक निलंबित रखेगा जब तक आप ग्रहण से कनेक्ट नहीं करते।

देखें जावा दूरस्थ डीबगिंग पर चरण दर चरण मार्गदर्शिका पूर्ण विवरण के लिए।


16

जावा को कवर करने का उत्तर> = 9:

जावा 9+ के लिए, जेवीएम विकल्प जेवीएम की मेजबानी करने वाले मशीन के आईपी पते के साथ पते को उपसर्ग द्वारा थोड़ा बदलाव की जरूरत है, या बस *:

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

यह https://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435 में उल्लिखित परिवर्तन के कारण है ।

जावा <9 के लिए, पोर्ट नंबर कनेक्ट करने के लिए पर्याप्त है।


8

मैं इस बात पर जोर देना चाहता हूं कि तर्कों का क्रम महत्वपूर्ण है

मेरे लिए java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jarकमांड डिबगर पोर्ट खोलता है ,

लेकिन java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000आज्ञा नहीं है


3
मुझे लगता है कि क्योंकि आपके दूसरे उदाहरण में, "app.jar" के बाद सब कुछ आपके मुख्य विधि में तर्कों के रूप में पारित हो जाता है
xoX ज़ीउस ज़ॉक्स

@xoXZeusXox हा हा। हां, यह तर्कों के रूप में पारित हुआ। उल्लेख करने के लिए धन्यवाद।
मलबैक

1

इस तरह से आपको दूरस्थ डिबगिंग के लिए ग्रहण डिबगर को सेटअप करना चाहिए:

ग्रहण सेटिंग्स:

1. रन बटन पर क्लिक करें
। डिबग कॉन्फ़िगरेशन का
चयन करें 3. "दूरस्थ जावा अनुप्रयोग" का चयन करें
4. नया कॉन्फ़िगरेशन

  • नाम: GatewayPortalProject
  • प्रोजेक्ट: गेटवेपॉर्टल-पोर्टलेट
  • कनेक्शन प्रकार: सॉकेट अटैच
  • कनेक्शन गुण: i) लोकलहोस्ट ii) 8787

JBoss के लिए:

1. /path/toJboss/jboss-eap-6.1/bin/standalone.confअपने vm में इस प्रकार बदलें : # को हटाकर निम्न पंक्ति को हटाएं:

JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"

टॉमकैट के लिए:

में catalina.bat फ़ाइल:

चरण 1:

CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"

चरण 2:

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

चरण 3: नीचे की तरह कमांड प्रॉम्प्ट से टॉमकैट चलाएँ:

catalina.sh jpda start

फिर आपको उन जावा वर्गों में ब्रेकपॉइंट सेट करने की आवश्यकता है जिन्हें आप डीबग करना चाहते हैं।


Java 8 में JDK एक JAVA_TOOL_OPTIONS पर्यावरण चर का समर्थन करता है ताकि किसी भी जावा अनुप्रयोग के लिए डीबगर को सक्षम करने में सक्षम हो: JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n एडिट के लिए खेद है, फॉर्मेटर के साथ लड़ना।
नाथन निसेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.