हमारे पास कुछ एप्लिकेशन हैं जो कभी-कभी खराब स्थिति में आते हैं, लेकिन केवल उत्पादन में (बिल्कुल!)। एक ढेर डंप लेने के दौरान राज्य की जानकारी इकट्ठा करने में मदद मिल सकती है, रिमोट डीबगर का उपयोग करना अक्सर आसान होता है। इस की स्थापना आसान है - एक ही उसकी कमांड लाइन में जोड़ने की जरूरत:, परिवहन = 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) डीबगरमेनप्रैपर, एक वर्ग जो मतदान थ्रेड को मारता है और फिर प्रतिबिंबित रूप से किसी अन्य निर्दिष्ट वर्ग की मुख्य विधि को कॉल करता है।
- अपने स्टार्ट-अप लिपियों में DebuggerMainWrapper के साथ अपने "मुख्य" वर्ग की जगह
- दो प्रणाली (डी) पैरामीटर, एक वास्तविक मुख्य वर्ग को निर्दिष्ट जोड़ें, और:
यह कैसे अपने प्रयोग किया जाता है दूसरा फाइल सिस्टम पर एक फाइल निर्दिष्ट करता है।
- ऑनथ्रो = com.whatever के साथ कमांड लाइन पर डीबगर कॉन्फ़िगर करें। TurnOnDebuggerException भाग जोड़ा गया
- क्लासपाथ में ऊपर वर्णित तीन कक्षाओं के साथ एक जार जोड़ें।
अब, जब आप अपना जेवीएम शुरू करते हैं तो सब कुछ समान होता है सिवाय इसके कि एक पृष्ठभूमि पराग धागा शुरू होता है। यह मानते हुए कि फ़ाइल (हमारे को टर्नऑनडेबगर कहा जाता है) प्रारंभ में मौजूद नहीं है, परादाता प्रत्येक एन सेकेंड के लिए जांच करता है। जब परामर्शकर्ता इसे पहले नोटिस करता है, तो यह फेंकता है और तुरंत TurnOnDebuggerException को पकड़ता है। फिर, एजेंट को लात मार दिया जाता है।
आप इसे वापस नहीं कर सकते हैं, और मशीन चालू होने पर बहुत सुरक्षित नहीं है। उलझन में, मुझे नहीं लगता कि डीबगर एकाधिक एक साथ कनेक्शन की अनुमति देता है, इसलिए डीबगिंग कनेक्शन को बनाए रखना आपकी सबसे अच्छी रक्षा है। हमने फ़ाइल अधिसूचना विधि चुना क्योंकि यह हमें निर्देशिका में ट्रिगर फ़ाइल निर्दिष्ट करके हमारे मौजूदा यूनिक्स ऑथेन/लेखक से पिगबैक करने की इजाजत देता है जहां केवल उचित उपयोगों के अधिकार हैं। आप आसानी से एक छोटी सी युद्ध फ़ाइल बना सकते हैं जिसने सॉकेट कनेक्शन के माध्यम से एक ही उद्देश्य प्राप्त किया। बेशक, चूंकि हम डीबगर बंद नहीं कर सकते हैं, हम केवल बीमार आवेदन को मारने से पहले डेटा इकट्ठा करने के लिए इसका इस्तेमाल करेंगे। अगर कोई यह कोड चाहता है, तो कृपया मुझे बताएं। हालांकि, यह आपको अपने आप को एक साथ फेंकने में केवल कुछ मिनट लगेगा।
यदि यह काम करता है (अब परीक्षण), यह हमारे लिए सबसे अच्छा विकल्प लगता है। ऐसा नहीं है कि हम नियमित रूप से डीबग करते हैं, लेकिन हम एक गलत व्यवहार स्थिति में एक JVM पकड़ने की क्षमता चाहते हैं। – ShabbyDoo
मुझे लगता है कि यह केवल जेडीके 1.5+ पर काम करेगा: http://java.sun.com/j2se/1.5.0/docs/guide/jpda/enhancements.html देखें "dt_socket परिवहन में संशोधन किया गया है उपरोक्त लिंक में "सर्वर मोड में चलते समय स्थानीय पता लें। – ShabbyDoo
@Shabby - हाँ - ऐसा लगता है कि यह 1.5+ काम करेगा, और यह एक अच्छा समाधान है। वैकल्पिक रूप से फ़ायरवॉल (सॉफ़्टवेयर या हार्डवेयर) के माध्यम से डीबग पोर्ट को लॉक करना है। शायद आपके लिनक्स होस्ट के लिए चेकआउट ipchains? (http://tldp.org/HOWTO/IPCHAINS-HOWTO.html) – Jared