ग्रहण डिबगर हमेशा किसी भी स्पष्ट अपवाद के बिना ThreadPoolExecutor पर ब्लॉक करता है, क्यों?


209

मैं एक्लिप्स पर अपने सामान्य प्रोजेक्ट्स पर काम कर रहा हूं, यह J2EE एप्लिकेशन है, जिसे स्प्रिंग, हाइबरनेट और इसी तरह बनाया गया है। मैं इसके लिए Tomcat 7 का उपयोग कर रहा हूं (कोई विशेष कारण नहीं, मैं किसी भी नई सुविधा का फायदा नहीं उठाता, मैं बस यही कोशिश करना चाहता था)। हर बार जब मैं अपने आवेदन को डीबग करता हूं, तो ऐसा होता है कि एक्लिप्स डिबगर पॉप आउट हो जाता है जैसे कि यह एक ब्रेकपॉइंट पर पहुंच गया है, लेकिन ऐसा नहीं है, वास्तव में यह जावा स्रोत फ़ाइल पर बंद हो जाता है ThreadPoolExecutor। कंसोल पर कोई स्टैक ट्रेस नहीं है, यह बस बंद हो जाता है। फिर अगर मैं फिर से शुरू पर क्लिक करता हूं तो यह चालू हो जाता है और ऐप पूरी तरह से काम करता है। डीबगर विंडो में यह दिखाता है:

Daemon Thread ["http-bio-8080"-exec-2] (Suspended (exception RuntimeException)) 
    ThreadPoolExecutor$Worker.run() line: 912   
    TaskThread(Thread).run() line: 619

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

कोई सुराग?


1
@ AmosM.Carpenter यह जावा ईई नहीं है, जेईई नहीं? यहाँ तक कि आपका अपना लिंक भी सुझाव देता है
eis

जवाबों:


290

पोस्ट किए गए स्टैक ट्रेस इंगित करता है कि डेमॉन थ्रेड में एक RuntimeException का सामना किया गया था। यह आम तौर पर रनटाइम पर अनचेक किया जाता है, जब तक कि मूल डेवलपर ने अपवाद को नहीं पकड़ा और संभाला हो।

आमतौर पर, एक्लिप्स में डीबगर को उस स्थान पर निष्पादन को निलंबित करने के लिए कॉन्फ़िगर किया गया है, जहां अपवाद सभी अपवादों को छोड़ दिया गया था । ध्यान दें कि अपवाद को बाद में संभाला जा सकता है, स्टैक फ्रेम में नीचे की ओर और थ्रेड समाप्त होने का कारण नहीं हो सकता है। यह देखे गए व्यवहार का कारण होगा।

ग्रहण के व्यवहार को कॉन्फ़िगर करना सीधा है: विंडो पर
जाएं > प्राथमिकताएं > जावा > डीबग करें और अनचाहे अपवादों पर निलंबन निष्पादित करें


मेरे मामले में stackoverflow.com/questions/8911146/… इसने मदद नहीं की :-(
गंगनुस

5
मैंने इसके बारे में ग्रहण बग 384073 दर्ज किया है क्योंकि यह अनिवार्य रूप से वेब एप्लिकेशन को डीबग करते समय इस विकल्प को अनुपयोगी बनाता है।
डैनियल सेरोडियो जूल

9
एक्लिप्स पर "सस्पेंडेड एक्सपट्र्स पर सस्पेंड एक्ज़ीक्यूटिव" को डिसेबल करना एक खराब वर्कअराउंड है: क्या होगा अगर आप चाहते हैं कि एक्लिप्स असली अनकवर्ड अपवाद पर सस्पेंड हो, जैसे कि आपके ही कोड से उत्पन्न? ऐसा लगता है कि यह

3
@ लिफ्ट: मैं वही सोच रहा था! Bugs.eclipse.org/bugs/show_bug.cgi?id=384073#c4 के अनुसार , कोई भी व्यक्ति: वैश्विक ब्रेकपॉइंट को अक्षम कर सकता है, java.lang.Exception पर एक नया ब्रेकपॉइंट बना सकता है, और इस नए बनाए गए ब्रेकपॉइंट के खिलाफ एक अनन्य फ़िल्टर लागू कर सकता है।
rektide

3
@ डैनियल ... टॉमकैट टीम के साथ एक मुद्दा दर्ज करना बेहतर होगा। मुझे लगता है कि यह व्यवहार टॉमकैट 7 में नया है ... ग्रहण वह करता है जो इसे करना चाहिए था ... (कभी नहीं सोचा था कि मैं एक दिन ग्रहण का बचाव करूंगा ... :)
स्टिजन डे विट

47

एक अधिक विशिष्ट समाधान है, जो RuntimeExceptionकेवल एक दिए गए वर्ग से फेंके गए ग्रहण को रोकता है ।

  1. डीबगिंग परिप्रेक्ष्य से एक नया अपवाद ब्रेकपॉइंट जोड़ें
  2. इसके गुणों पर जाएं
  3. छानने के लिए जाओ
  4. में "चुना गया स्थान (रों) पर सीमित करें", क्लिक करें " जोड़ें क्लास "
  5. जोड़ना java.util.concurrent.ThreadPoolExecutor
  6. चेकबॉक्स को अनटिक करें , जिसका अर्थ है कि इन पर ध्यान नहीं दिया जाएगा

1
मैं इसे Tomcat 7 और Eclipse / STS 3.4.0 के साथ काम करने के लिए प्रतीत नहीं कर सकता। क्या कोई अन्य सेटिंग्स आवश्यक हैं? क्या इस ब्रेकपॉइंट पर पंजीकृत होना चाहिए RuntimeException? क्या इसे सक्षम या अक्षम करना है? क्या 'पकड़े गए स्थान' और 'अनचाहे स्थान' चालू या बंद होने चाहिए?
हेनरिक हेमबर्गर

2
ऐसा प्रतीत होता है कि अपवाद ब्रेकपॉइंट को java.lang.RuntimeException होने की आवश्यकता है, सक्षम होना चाहिए, केवल अनचाहे स्थान के लिए होना चाहिए और इसमें java.util.concurrent.ThreadPoolExecutest वर्ग की जाँच नहीं होनी चाहिए।
मारिओ

दुर्भाग्य से, Ubuntu 14.04 पर "चयनित स्थान (नों पर रोक)" उपलब्ध नहीं है, ग्रहण के लिए 4.4.0।
ईजी

24

जब कोई वेब पुनः लोड किया जाता है तो यह व्यवहार tomcat द्वारा ट्रिगर किया जाता है। यह टॉमकैट "मेमोरी लीक प्रोटेक्शन" फीचर का हिस्सा है जो (अन्य चीजों के अलावा) इसके थ्रेड्स के नवीनीकरण को मजबूर करता है।

यह अब संस्करण 7.0.54 और 8.0c के टोमैट से तय किया गया है: https://issues.apache.org/bugzilla/show_bug.cgi?id=56492


2

मैंने देखा है कि सर्वर फ़ाइलों (jsp या जावा) को संशोधित करने के बाद अक्सर ऐसा होता है और STS को एप्लिकेशन को पुनः लोड करने में परेशानी होती है।

यह आमतौर पर सर्वर को फिर से शुरू करने के लिए होता है ताकि इसे परिवर्तनों को सिंक्रनाइज़ करने के लिए प्राप्त किया जा सके।

JRebel शुरू करने के बाद - ऐसा लगता है कि यह दूर चला गया है। इसलिए, मुझे लगता है कि यह एसटीएस में एक प्रतिलिपि प्रस्तुत करने योग्य मुद्दा है, जब डिबग मोड में कोड को हॉटस्पैपिंग किया जाता है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.