2009-05-28 11 views
16

हमारे पास कुछ एप्लिकेशन हैं जो कभी-कभी खराब स्थिति में आते हैं, लेकिन केवल उत्पादन में (बिल्कुल!)। एक ढेर डंप लेने के दौरान राज्य की जानकारी इकट्ठा करने में मदद मिल सकती है, रिमोट डीबगर का उपयोग करना अक्सर आसान होता है। इस की स्थापना आसान है - एक ही उसकी कमांड लाइन में जोड़ने की जरूरत:, परिवहन = dt_socket, सर्वर = yउत्पादन के लिए सुरक्षित डिबगिंग JVMs

कोई प्रतीत हो रहा है निलंबित = n, पता = पोर्ट:

-Xdebug -Xrunjdwp उपलब्ध सुरक्षा तंत्र, इसलिए उत्पादन में डीबगिंग को चालू करने से मनमाने ढंग से कोड निष्पादन (हॉटस्पैड के माध्यम से) प्रभावी ढंग से अनुमति मिल जाएगी।

हमारे पास 1.4.2 और 1.5 सूर्य जेवीएम का मिश्रण है जो सोलारिस 9 और लिनक्स (रेडहाट एंटरप्राइज़ 4) पर चल रहा है। हम सुरक्षित डिबगिंग कैसे सक्षम कर सकते हैं? उत्पादन सर्वर निरीक्षण के हमारे लक्ष्य को प्राप्त करने के लिए कोई अन्य तरीका?

अद्यतन: जेडीके 1.5+ जेवीएम के लिए, कोई एक इंटरफ़ेस और पोर्ट निर्दिष्ट कर सकता है जिस पर डीबगर को बांधना चाहिए। तो, कार्लोप के लूपबैक के लिए बाध्यकारी सुझाव और स्थानीय डेवलपर बॉक्स में बस एक एसएसएच सुरंग का उपयोग करना चाहिए, एसएसएच सर्वर पर ठीक से स्थापित किया जाना चाहिए।

हालांकि, ऐसा लगता है कि जेडीके 1.4x डीबग पोर्ट के लिए एक इंटरफेस को निर्दिष्ट करने की अनुमति नहीं देता है। तो, हम या तो नेटवर्क में कहीं भी डीबग बंदरगाह तक पहुंच को अवरुद्ध कर सकते हैं या ओएस में कुछ सिस्टम-विशिष्ट अवरोधन कर सकते हैं (आईपी चेन जेरेड सुझाए गए इत्यादि)?

अद्यतन # 2:

कमांड लाइन पैरामीटर:

-Xdebug 
-Xrunjdwp: 
    transport=dt_socket, 
    server=y, 
    suspend=n, 
    address=9001, 
    onthrow=com.whatever.TurnOnDebuggerException, 
    launch=nothing 

जावा डिबगर चालू करने के लिए कोड: यह एक हैक हमें हमारे जोखिम को सीमित, यहां तक ​​कि 1.4.2 JVMs पर देंगे है

try { 
    throw new TurnOnDebuggerException(); 
} catch (TurnOnDebugger td) { 
    //Nothing 
} 

TurnOnDebuggerException किसी भी अपवाद की गारंटी हो सकती है कि कहीं और नहीं फेंक दिया जाए।

मैंने यह साबित करने के लिए एक विंडोज बॉक्स पर परीक्षण किया कि (1) डीबगर बंदरगाह प्रारंभ में कनेक्शन प्राप्त नहीं करता है, और (2) ऊपर दिखाए गए टर्नऑनडेबगर अपवाद को फेंकने से डीबगर को जिंदा आना पड़ता है। लॉन्च पैरामीटर की आवश्यकता थी (कम से कम जेडीके 1.4.2 पर), लेकिन कचरा मूल्य JVM द्वारा शानदार तरीके से संभाला गया था।

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

# 3 अद्यतन: मैं तीन वर्गों लेखन समाप्त हो गया: (1) TurnOnDebuggerException, एक सादे 'ol जावा अपवाद, (2) DebuggerPoller, एक पृष्ठभूमि एक निर्दिष्ट फ़ाइल के अस्तित्व के लिए जाँच करता है फाइल सिस्टम पर थ्रेड, और (3) डीबगरमेनप्रैपर, एक वर्ग जो मतदान थ्रेड को मारता है और फिर प्रतिबिंबित रूप से किसी अन्य निर्दिष्ट वर्ग की मुख्य विधि को कॉल करता है।

  1. अपने स्टार्ट-अप लिपियों में DebuggerMainWrapper के साथ अपने "मुख्य" वर्ग की जगह
  2. दो प्रणाली (डी) पैरामीटर, एक वास्तविक मुख्य वर्ग को निर्दिष्ट जोड़ें, और:

    यह कैसे अपने प्रयोग किया जाता है दूसरा फाइल सिस्टम पर एक फाइल निर्दिष्ट करता है।

  3. ऑनथ्रो = com.whatever के साथ कमांड लाइन पर डीबगर कॉन्फ़िगर करें। TurnOnDebuggerException भाग जोड़ा गया
  4. क्लासपाथ में ऊपर वर्णित तीन कक्षाओं के साथ एक जार जोड़ें।

अब, जब आप अपना जेवीएम शुरू करते हैं तो सब कुछ समान होता है सिवाय इसके कि एक पृष्ठभूमि पराग धागा शुरू होता है। यह मानते हुए कि फ़ाइल (हमारे को टर्नऑनडेबगर कहा जाता है) प्रारंभ में मौजूद नहीं है, परादाता प्रत्येक एन सेकेंड के लिए जांच करता है। जब परामर्शकर्ता इसे पहले नोटिस करता है, तो यह फेंकता है और तुरंत TurnOnDebuggerException को पकड़ता है। फिर, एजेंट को लात मार दिया जाता है।

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

उत्तर

8

यदि आप एसएसएच का उपयोग करते हैं तो आप सुरंग और सुरंग को अपने स्थानीय होस्ट में सुरंग की अनुमति दे सकते हैं। कोई विकास आवश्यक नहीं है, सब एसएसडीडी, एसएसएच और/या पुटी का उपयोग करके किया जाता है।

आपके जावा सर्वर पर डीबग सॉकेट स्थानीय इंटरफेस 127.0.0.1 पर स्थापित किया जा सकता है।

+0

यदि यह काम करता है (अब परीक्षण), यह हमारे लिए सबसे अच्छा विकल्प लगता है। ऐसा नहीं है कि हम नियमित रूप से डीबग करते हैं, लेकिन हम एक गलत व्यवहार स्थिति में एक JVM पकड़ने की क्षमता चाहते हैं। – ShabbyDoo

+1

मुझे लगता है कि यह केवल जेडीके 1.5+ पर काम करेगा: http://java.sun.com/j2se/1.5.0/docs/guide/jpda/enhancements.html देखें "dt_socket परिवहन में संशोधन किया गया है उपरोक्त लिंक में "सर्वर मोड में चलते समय स्थानीय पता लें। – ShabbyDoo

+0

@Shabby - हाँ - ऐसा लगता है कि यह 1.5+ काम करेगा, और यह एक अच्छा समाधान है। वैकल्पिक रूप से फ़ायरवॉल (सॉफ़्टवेयर या हार्डवेयर) के माध्यम से डीबग पोर्ट को लॉक करना है। शायद आपके लिनक्स होस्ट के लिए चेकआउट ipchains? (http://tldp.org/HOWTO/IPCHAINS-HOWTO.html) – Jared

0

जेएमएक्स में जानकारी/सेवाएं निर्यात करें और फिर इसे दूरस्थ रूप से एक्सेस करने के लिए आरएमआई + एसएसएल का उपयोग करें। आपकी स्थिति जेएमएक्स के लिए डिज़ाइन की गई है (एम प्रबंधन के लिए खड़ा है)।

+0

मैं मानता हूं कि आम मेट्रिक्स को जेएमएक्स के माध्यम से उजागर किया जाना चाहिए। हम वास्तव में हल्के उत्पादन प्रोफाइलर (विली) का उपयोग कर रहे हैं, लेकिन राज्य की जानकारी को कैप्चर करने में यह बहुत अच्छा नहीं है, और मोटे अनाज वाले निशान तक ही सीमित हो सकता है। दूसरा मुद्दा यह है कि इनमें से कुछ ऐप्स (आंशिक रूप से) तृतीय-पक्ष हैं, इसलिए हम सर्वोत्तम रूप से अपूर्ण स्रोत के साथ डिबगिंग करेंगे। – ShabbyDoo

+1

मैं अभी भी यह मानता हूं कि उत्पादन अनुप्रयोग में आपके डीबगर को हुक अप करना एक बुरा विचार है। उपयोगकर्ताओं को यह पता नहीं चल रहा है कि जब आप ब्रेकपॉइंट हिट करते हैं और स्मृति के माध्यम से कुछ क्षण बिताते हैं तो क्या हो रहा है। मैं आपके कोड में स्पॉट ढूंढने की कोशिश करता हूं जिसमें समस्याएं आ रही हैं और वर्तमान स्थिति को जेएमएक्स के माध्यम से बेनकाब कर रही हैं और क्या हो रहा है इसके विस्तृत लेखापरीक्षा लॉग रखे। – Kevin

+1

हम वास्तव में डीबगिंग से पहले हमारे लोड-संतुलित क्लस्टर से बुरी तरह व्यवहार करने का उदाहरण ले रहे होंगे। मैं सहमत हूं कि एक ऐप w/सक्रिय उपयोगकर्ताओं को डीबग करना वास्तव में एक बुरा विचार होगा। – ShabbyDoo

2

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

+0

क्या कोई डोमेन सॉकेट पर डिफ़ॉल्ट इंटरफ़ेस पर पोर्ट बंद कर सकता है? मेरी समस्या है (जो मैंने अपनी प्रारंभिक पोस्ट के बाद पाया) यह है कि 1.4.x सूर्य जेवीएम केवल डिफ़ॉल्ट (?) इंटरफ़ेस से जुड़ सकता है। इसलिए, कुछ जादुई मैपिंग की आवश्यकता होगी ताकि इस बंदरगाह को वीएम के बाहर नहीं उजागर किया जा सके। – ShabbyDoo

0

अच्छा सवाल।

मुझे डिबगिंग पोर्ट से कनेक्शन एन्क्रिप्ट करने की किसी भी अंतर्निहित क्षमता से अवगत नहीं है।

एक बेहतर/आसान समाधान हो सकता है, लेकिन मैं निम्नलिखित करना होगा:

  1. ब्लॉक डिबगिंग बंदरगाह (रों) के लिए पहुँच है कि एक फ़ायरवॉल के पीछे रखो उत्पादन मशीन।
  2. मेजबान पर प्रॉक्सी प्रक्रिया चलाएं जो बंदरगाह से जुड़ती है, और सॉकेट से इनपुट और आउटपुट को एन्क्रिप्ट करता है।
  3. डिबगिंग वर्कस्टेशन पर प्रॉक्सी क्लाइंट चलाएं जो इनपुट को एन्क्रिप्ट/डिक्रिप्ट करता है। यह सर्वर प्रॉक्सी से कनेक्ट है। उनके बीच संचार एन्क्रिप्ट किया जाएगा।
  4. अपने डीबगर को प्रॉक्सी क्लाइंट से कनेक्ट करें।
+0

एक साइड नोट के रूप में: हमारे उत्पादन सर्वर फ़ायरवॉल के पीछे हैं, लेकिन वे कुछ आंतरिक नेटवर्क सेगमेंट के संपर्क में हैं। – ShabbyDoo

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