2010-02-17 16 views
34

असाइन किया गया है, तो मैं एक वैरिएबल को कुछ मान निर्दिष्ट करते समय jdb (जिसे मैं एक्लिप्स डीबगर के माध्यम से उपयोग कर रहा हूं) तोड़ना चाहता हूं। मुझे कुछ विशिष्ट रेखा पर ब्रेकपॉइंट सेट करने में दिलचस्पी नहीं है बल्कि अधिक आम तौर पर।ब्रेक करें जब एक वैरिएबल को कुछ मान

उदाहरण के लिए, हर बार x == null तोड़ें।

ऐसी चीज प्राप्त करने योग्य है?

+0

जो आप खोज रहे हैं वह एक [संपत्ति परिवर्तन श्रोता] (http://docs.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html) जैसा है जो आपको एक विशिष्ट परिवर्तन का पता लगाने देगा और स्टैक ट्रेस कैप्चर करें। मुझे विश्वास नहीं है कि यह अभी तक किसी भी डीबगर में उपलब्ध है, और मूल पुस्तकालय डेवलपर्स ने इसे संपत्ति में नहीं बनाया है, तो इसे कार्यान्वित करना मुश्किल होगा। – Cebence

उत्तर

5

हाँ, उन watchpoints कहा जाता है और watchpoints घड़ी भाव हो सकता है।

संस्करणों और इस तरह के आधार पर, आप इसे रूपरेखा दृश्य में एक चर का चयन करके और उस पर राइट-क्लिक करके या चर के दृश्य में, इसे नियंत्रित/क्लिक करके करते हैं।

एक संदर्भ मेनू जोड़ें घड़ी अभिव्यक्ति और संपादित घड़ी अभिव्यक्ति लिए विकल्प होगा।

+0

मैं वॉचपॉइंट्स के साथ चारों ओर खेल रहा हूं लेकिन वे तब तक हिट नहीं लगते जब तक वे चरम सीमा में नहीं होते हैं। क्या मैं एक घड़ी को परिभाषित कर सकता हूं और जब यह देखे गए चर के दायरे में आता है तो यह सक्षम हो सकता है? क्या देखे गए चर नामों को अर्हता प्राप्त करने का कोई तरीका है? – Daniel

+0

ऐसा लगता है कि कोई विशिष्ट मान मिलने पर आपको केवल तभी ब्रेक करने की प्रतीत नहीं होती है। – mjaggard

31

हाँ - क्या आप सेटअप करने के लिए जरूरत है एक 'सशर्त ब्रेकप्वाइंट' है - यह आप प्रोग्राम निष्पादन बंद करो और डिबगर के माध्यम से कदम जब आवेदन की एक निश्चित राज्य तक पहुँच जाता है की क्षमता देता है।

तो, मान लीजिए कि आप निष्पादन में एक खास बिंदु में पर जाना चाहते हैं एक निश्चित शर्त पूरी हो जाती है (छवि संलग्न के अनुसार), तो आप इस इस प्रकार कर सकते हैं करते हैं:

  1. अपने डिबगर खोलें परिप्रेक्ष्य और चयन 'breakpoints' टैब

  2. कोड फ़ाइल में एक नया ब्रेकप्वाइंट जोड़ें - उपयुक्त जगह पर जहाँ आप प्रोग्राम निष्पादन

  3. निरीक्षण करने के लिए चाहते हैं

    फिर वापस 'ब्रेकप्वाइंट' टैब पर जाएँ, नए जोड़े गए प्रविष्टि पर राइट क्लिक करें, और चुनें 'ब्रेकप्वाइंट गुण'

  4. सेट हालत जिस पर यह सक्रिय किया जाना चाहिए

alt text

+5

हाय डायंक, क्या आपका सुझाव किसी विशेष लाइन नंबर पर संतुष्ट होने वाली स्थिति पर निर्भर नहीं है? मुझे एक और सामान्य समाधान चाहिए जो रेखा संख्याओं की पहचान करने की आवश्यकता को रोक देगा। मैं सिर्फ यह जानना चाहता हूं कि "x" को कुछ असाइन किया गया है, भले ही असाइनमेंट की विधि हो। – Daniel

+0

हाय डैनियल, आपके प्रश्न हर बार "x" (एक चर) को एक निश्चित मान निर्धारित करता है जिसे आप नियंत्रण प्रवाह को तोड़ना चाहते हैं। सवाल है, कहाँ? ठीक है, अगर आप इसके बारे में सोचते हैं, तो "x" को एक उदाहरण या स्थानीय चर होना चाहिए। दोनों संदर्भों में आप जान लेंगे कि आपके स्रोत में कौन सी रेखा आप देखना चाहेंगे, है ना? (सेटर, या स्थानीय ब्लॉक गुंजाइश)। उस बिंदु से, आप कॉल स्टैक और बैकट्रैक को देखते हैं। – Dinuk

+3

हाय डायंक, मैं वास्तव में एक पुस्तकालय में एक समस्या को डीबग करने की कोशिश कर रहा था जो मेरा नहीं है। परिवर्तनीय संरक्षित है और आधार वर्ग को विस्तारित करने के लिए एक बड़े पैमाने पर बड़े पैमाने पर पदानुक्रम है जहां इसे परिभाषित किया गया है। पहुंच कई जगहों पर हो सकती है, इसलिए मैं एक संदर्भ मुक्त ब्रेकपॉइंट चाहता था। ऐसा लगता है कि thSoft और DigitalRoss उनके सुझाव में सही हैं। – Daniel

0

क्षमा करें, लेकिन ग्रहण में जो कुछ भी आप चाहते हैं उसे करने का कोई तरीका नहीं है। आपको जो चाहिए वह ब्रेकपॉइंट की सशर्त अभिव्यक्ति के साथ एक दृष्टिकोण है। यह ग्रहण में मौजूद नहीं है।

आपकी समस्या भी एक लाइब्रेरी डीबग विशिष्ट है। आपको जो चाहिए उसे प्राप्त करने के लिए शायद अन्य तरीके हैं। यह देखने के लिए फोरम पर खोजें कि डेवलपर ऐसा कैसे करते हैं।

8

आप Field Modification Watchpoints के साथ बहुत करीब आ सकते हैं। वे वस्तुओं के क्षेत्रों (स्थानीय चर, पैरामीटर, या अभिव्यक्तियों) पर नहीं रखा जा सकता है और जब भी फ़ील्ड लिखा जाता है तब वे ट्रिगर होते हैं, लेकिन यह निकटतम ग्रहण है जो आप चाहते हैं।

+0

+1 लेकिन नोटिस गलत समझा: जो के साथ ठीक हो रहा है क्षेत्र (तक सीमित होने के अलावा ओपी की आवश्यकता), यह ठीक नहीं होगा जब यह _changes_ है, लेकिन जब यह _written_ है (भले ही यह पिछले मान के साथ लिखा गया हो)। – leonbloy

9

संपादित करें: The ticket I've linked in this answer को सत्यापित/निश्चित चिह्नित किया गया है। इसे नवीनतम ऑक्सीजन रिलीज, as detailed in the release notes में एकीकृत किया गया है।मैं अपना मूल उत्तर नीचे छोड़ दूंगा क्योंकि इस बारे में बहुत उपयोगी जानकारी है कि जेडीआई और जेडीटी ग्रहण में कैसे मिलकर काम करते हैं।


मैं आपके प्रश्न के अंतिम उत्तर से शुरू करने जा रहा हूं, इसलिए यदि आप नहीं चाहते हैं तो आपको विवरण पढ़ने की आवश्यकता नहीं है। असल में, यह एक तरह का संभव है लेकिन बहुत से प्रश्नों के साथ पहले जवाब देना होगा। यदि आप इसे छोड़ना चाहते हैं और सीधे टिकट पर जाना चाहते हैं, here you go, लेकिन मैं आपको पढ़ने की सलाह देता हूं।

ग्रहण JVM के साथ वॉचपॉइंट्स पंजीकृत करने के लिए JDI (उस पृष्ठ के बहुत नीचे) का उपयोग करता है। यह EventRequestManager विधियों के माध्यम से किया जाता है (कार्यान्वयन JVM स्वयं द्वारा प्रदान किया जाता है, ग्रहण नहीं) जो घड़ी बिंदु बनाते हैं, यानी EventRequstManager.createModificationWatchpointRequest। इन तरीकों को स्वीकार करने वाली एकमात्र चीज Field है (ध्यान दें कि यह प्रतिबिंबित Field वर्ग नहीं है)। तो संक्षेप में, ग्रहण सीधे जावा के माध्यम से नहीं कर सकता है। कभी डर नहीं, जावा सशर्त ब्रेकपॉइंट्स को संभाल नहीं करता है। जावा पर भरोसा करने के बजाए उन्हें सीधे ग्रहण के माध्यम से भी लागू किया जाता है। हालांकि, कुछ चेतावनियां हैं जो सशर्त ब्रेकपॉइंट्स की तुलना में सशर्त घड़ी को लागू करने के लिए और अधिक कठिन बनाती हैं।

चलो सादे, सशर्त ब्रेकपॉइंट्स पर विचार करें। उन्हें काम करने के लिए, आपको एक संदर्भ की आवश्यकता है जिसमें आप कोड स्निपेट निष्पादित कर सकते हैं। कोड के निष्पादन संदर्भ के बिना, हम स्निपेट में अभिव्यक्ति/कथन का मूल्यांकन नहीं कर सकते हैं क्योंकि हमारे पास चर, मान, प्रकार इत्यादि को हल करने का कोई तरीका नहीं है। यह AST पार्सर का उपयोग करके किया जाता है जो जावा कोड को वास्तविक निर्देशों में संसाधित करता है । याद रखें कि आप एक शर्त में कई कथन टाइप कर सकते हैं, केवल एक अभिव्यक्ति नहीं। इसके बाद मूल्यांकनकर्ता इसे संदर्भित करने के बाद अभिव्यक्ति का मूल्यांकन करने के लिए एक संदर्भ (विशेष रूप से, IJavaStackFrame) का उपयोग करता है।

अब एक सशर्त दृष्टिकोण के बारे में सोचें, क्योंकि यह अंतिम बिंदु बहुत महत्वपूर्ण है। वॉचपॉइंट के निष्पादन संदर्भ क्या है? परिवर्तनीय पहुंच न केवल एक ही कक्षा के भीतर हो सकती है, बल्कि अन्य कक्षाओं में भी हो सकती है (protected और पैकेज सदस्यों को सोचें), और आंतरिक कक्षाओं में भी (MyClass.this.myField के माध्यम से)। इसका मतलब है कि:

  1. स्थानीय चर कभी नहीं संगत क्षेत्र विभिन्न तरीकों से पहुँचा जा सकता के बाद से कर रहे हैं लगातार क्षेत्र से पहुँचा जा सकता के बाद से कर रहे हैं,
  2. जहाँ से का उपयोग शुरू हो जाती है वर्ग के सदस्य चर कभी नहीं एकाधिक कक्षाएं,
  3. निष्पादन संदर्भ में उपलब्ध आयातित वर्ग कभी भी (2), और
  4. फ़ील्ड की पहुंच कभी भी संगत नहीं होती है क्योंकि इसे किसी उदाहरण के साथ योग्यता की आवश्यकता हो सकती है, वर्ग का नाम, super याजैसे कुछ के साथ 210 (आंतरिक कक्षा के उपयोग के लिए)।

ऐसी सुविधा की व्यवहार्यता सीमित है। वास्तव में निष्पादन संदर्भ में बिल्कुल कुछ भी सुसंगत होने के बाद से आप एक दृष्टिकोण के लिए एक गैर-बदलते सशर्त बयान का मूल्यांकन करने के लिए कड़ी मेहनत करेंगे। इसका मतलब है कि कोड को आसानी से पार्स नहीं किया जा सकता है और विशेष अर्थ के बिना व्याख्या की तरह के रूप में कोड के टुकड़े, के लिए लागू:

myField हमेशा की तरह, this.myField या super.myField या MyClass.myField या MyClass.this.myField रूप में ही है पर जहां क्षेत्र है निर्भर करता है पहुंचा जा रहा है

यह चीजों को काफी जटिल करता है, खासकर ऐसी प्रणाली में जो अपेक्षाकृत जटिल है। सशर्त ब्रेकपॉइंट कोड का एक उदाहरण here पाया जा सकता है (Ctrl + F का उपयोग कर getEvaluationEngine के लिए खोजें)। अब इसे लें और नियमों के एक सेट के आधार पर अभिव्यक्ति पर प्री-प्रोसेसिंग में जोड़ें जहां हम हैं और जहां क्षेत्र है, और चीजें करने से जटिल हो सकता है।

AFAIK, आप कुछ ऐसा नहीं कर सकते हैं, "यदि पुराना/नया मान यह है, तो निलंबित करें", क्योंकि वह जानकारी केवल स्टैक फ्रेम में प्राप्त जानकारी से उपलब्ध नहीं है (और इस प्रकार से डिबगर)। मूल्य को आवंटित अभिव्यक्ति का मूल्यांकन घड़ी के समय के हिसाब से किया गया है, लेकिन इसका परिणाम डीबगर के लिए उपलब्ध नहीं है, इसलिए यह दृष्टिकोण के आधार पर मूल्यांकनकर्ता के लिए उपलब्ध नहीं है। असाइनमेंट करने के लिए पहले एक कदम किया जाना होगा, फिर अभिव्यक्ति को चरण के बाद मूल्यांकन करना होगा। यह बहुत गन्दा होगा, और ईमानदारी से, उस पर हैकी।

किसी भी मामले में, यदि आप इस सुविधा के लिए अपना समर्थन आवाज देना चाहते हैं, तो आप this Eclipse ticket का उपयोग कर सकते हैं। हालांकि, यह 2005 के बाद से रहा है (अब तक 8 साल) और समुदाय से सीमित समर्थन है। टीबीएच, मुझे यह बहुत दूर नहीं दिख रहा है, विशेष रूप से इस तरह के फीचर अनुरोध के पीछे अपेक्षाओं के अधिक स्पष्टीकरण के बिना और इसके पीछे कुछ प्रमुख डिजाइन विचारों के बिना।

+0

मुझे लगता है कि यह सुविधा के लिए अच्छा होगा। इसके लिए मतदान – tgkprog

+0

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

+0

@mjaggard भी वास्तविक ओरेकल बग डेटाबेस निजी है, और आप केवल इसे एक्सेस कर सकते हैं ओरेकल समर्थन अनुबंध के लिए भुगतान करें। ओपनजेडीके बग डेटाबेस हालांकि खुला है। – Brian

संबंधित मुद्दे