2010-02-23 17 views
6

मैं अपवाद फेंकने पर उत्पन्न होने वाले स्टैक ट्रेस को अक्षम करना चाहता हूं। मैं का इस्तेमाल किया है,जावा प्रोग्राम में स्टैक ट्रेस पीढ़ी को कैसे अक्षम करें?

Runtime.getRuntime().traceInstructions(false); 
Runtime.getRuntime().traceMethodCalls(false); 

लेकिन अभी भी मैं देख सकता था ट्रेस उत्पन्न हो रही है। आप ऐसा कैसे कर सकते हैं? इसके अलावा मुझे यह पता लगाने की ज़रूरत है कि कोई मेरी कक्षा को डीबग कर रहा है या नहीं।

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

एक तरीका यह है कि मैं ने पाया है कि सभी अपवाद है कि मेरे क्रम जार से होने वाले कर रहे हैं, मैं सिर्फ उन्हें पकड़ने और अपवाद वस्तु पर एक खाली StackTraceElement सरणी की स्थापना की और इसे फिर से फेंक ... है

ऐसी आवश्यकता क्यों है? मान लीजिए कि आप मेरे एसडीके का उपयोग कर एक एप्लीकेशन विकसित करते हैं। (एसडीके जार आपके आवेदन के साथ बंडल नहीं कर सकते हैं..मैंने इसे प्रतिबंधित कर दिया है और यह अंतिम है :) !!) अब अपने क्लाइंट की मशीन पर अपना एप्लिकेशन चलाने के लिए आपको (या क्लाइंट) को इंस्टॉल करने की आवश्यकता है ग्राहक की मशीन पर रनटाइम और अपना आवेदन चलाएं। अब क्या होगा यदि आपका ग्राहक मेरे रनटाइम जार का उपयोग करके अपने स्वयं के अनुप्रयोगों को विकसित करना शुरू कर देता है !! मेरे व्यापार के लिए खतरा है .... भयानक आवश्यकता क्यों है।

स्टैक ट्रेस को अक्षम क्यों करें?
स्टैक ट्रेस पीढ़ी या विधि कॉल ट्रेस पीढ़ी को अक्षम करके मैं अपने रनटाइम जारों के साथ विकासशील कोड बनाना चाहता था और इसलिए मैंने इस तरह से अपना प्रश्न क्यों शुरू किया ... इस तरह की आवश्यकता प्राप्त करने के लिए कुछ अन्य समाधान सुझाएं ...

+0

मुझे लगता है कि दो अलग-अलग यहाँ सवाल कर रहे हैं। आपको उन्हें अलग से संबोधित करना चाहिए। – Joel

+2

कृपया अधिक जानकारी जोड़ें, उदाहरण के लिए आप वास्तव में स्टैक ट्रेस को अक्षम क्यों करना चाहते हैं? "stacktrace अक्षम करें" (जैसा कि यह केवल अपवादों की श्रृंखला है) द्वारा आपको वास्तव में क्या मतलब है –

+2

मुझे लगता है कि आप यहां अपने उपयोगकर्ताओं को खराब सेवा दे रहे हैं। एक एसडीके सहायक अपवाद नहीं दे रहा है? –

उत्तर

2

जेवीएम (कम से कम, सूर्य के कार्यान्वयन के लिए जेवीएम के कार्यान्वयन) के कुछ जटिल भाग हैं जो स्टैक ट्रेस पीढ़ी अक्षम होने पर काम नहीं करते हैं (मैंने इसे प्रतिबिंब के लिए कुछ समर्थन विधियों के कार्यान्वयन में देखा)। इसलिए मुझे नहीं लगता कि स्टैक ट्रेस पीढ़ी को अक्षम किया जा सकता है। Runtime.trace*() विधियां कुछ और के बारे में हैं (एक डिबगिंग टूल स्टैक निशान से अधिक गहन है)।

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

+0

मैं सभी अपवाद निशान अक्षम करना चाहता हूं। मैं obfuscation का उपयोग नहीं कर सकता क्योंकि मेरा उत्पाद एक एसडीके है जिसका उपयोग विकास में किया जाएगा। मैं एक रनटाइम भी पेश कर रहा हूं जिसका उपयोग तब किया जाता है जब लोग अपने एसडीके का उपयोग करके बनाए गए अपने अनुप्रयोगों को तैनात करना चाहते हैं। मेरी आवश्यकता यह है कि मेरे रनटाइम जार का उपयोग करने वाले किसी भी व्यक्ति को लिखे गए कोड को डीबग करने में सक्षम नहीं होना चाहिए ... या कम से कम मैं अपने रनटाइम जार से स्टैक ट्रेस पीढ़ी से बचकर इसे डीबग करना कठिन बना दूंगा। –

+2

मुझे पता चला कि एक तरीका यह है कि मेरे रनटाइम जार से उत्पन्न होने वाले सभी अपवाद, मैं उन्हें पकड़ लेता हूं और अपवाद ऑब्जेक्ट पर एक खाली स्टैकट्रेस एलिमेंट सरणी सेट करता हूं और इसे फिर से फेंक देता हूं ... –

+0

+1 केवल ProGuard का उपयोग करने के लिए । –

1

क्या आप इसे सभी अपवादों के लिए अक्षम करना चाहते हैं?

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

5
  1. मुझे नहीं लगता कि यह संभव है कोड पता करने के लिए के लिए है कि यह डिबग की जा रही है, सिवाय इसके कि अप्रत्यक्ष (और अविश्वसनीय) को मापने कितनी देर तक यह कोड दृश्यों निष्पादित करने के लिए ले जाता है की तरह तरह से करते हैं।

  2. सभी स्टैकट्रैक को अक्षम करना संभव नहीं है।आप कुछ भी करने के लिए Throwable.fillInStackTrace() ओवरराइड करके अपवाद कक्षाओं के लिए स्ट्रैक्ट्रेस अक्षम कर सकते हैं जिन्हें आप स्वयं परिभाषित करते हैं। लेकिन यह उन वर्गों के लिए काम नहीं करेगा जिन्हें आप नहीं बदल सकते हैं।

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

EDIT - मैंने जो कुछ करने की कोशिश कर रहे हैं उस पर मैंने अपनी राय संशोधित की है। यह देखते हुए कि आप जो कर रहे हैं वह एक एसडीके वितरित कर रहा है, जिसे आप अपने ग्राहकों को अपने अनुप्रयोगों में एम्बेड करने की उम्मीद कर रहे हैं, पूरे जावा एप्लिकेशन के लिए स्टैकट्रैक को ग्राहक शत्रुतापूर्ण व्यवहार, आईएमओ के रूप में गिना जाता है। अपने "कीमती" आईपी की सुरक्षा के दुष्प्रभाव के रूप में, आप ग्राहक/डेवलपर के लिए अपने कोड को डीबग करना मुश्किल बना रहे हैं। यहां तक ​​कि कोड भी है जिसमें कॉल स्टैक पर आपकी बहुमूल्य विधियां नहीं हैं!

यदि मैं एक ग्राहक था, तो शायद मैं यह पसंद करूंगा कि आपने ऐसा करने से obfuscated कोड भेज दिया हो। लेकिन सबसे अधिक संभावना है कि, मैं एक वैकल्पिक सॉफ़्टवेयर सप्लायर खोजने के लिए बहुत कठिन प्रयास करता हूं कि ने अपने भुगतान करने वाले ग्राहकों को चोरों के रूप में नहीं माना।

8

मैं भी तुम क्यों ऐसा करना चाहते हैं पर उत्सुक हूँ, लेकिन अगर आप वास्तव में अपने कारणों है, तो आप कम से कम दो विकल्प हैं:

आप अपने खुद के अपवाद कार्यान्वयन के लिए पीढ़ी स्टैक ट्रेस अक्षम करना चाहते हैं, आप बस fillInStackTrace विधि ओवरराइड कर सकते हैं:

public static class MyException extends Exception { 
    @Override 
    public Throwable fillInStackTrace() { 
     return null; 
    }  
} 

आप सभी अपवाद के लिए इसे अक्षम करना चाहते हैं, तो आप फेंकने योग्य कक्षा में fillInStackTrace विधि को बदलने के लिए एक बाइट कोड उपकरण एजेंट का उपयोग कर सकते हैं। हालांकि यह केवल जावा 6 के लिए काम करेगा, क्योंकि जावा 5 में आपको इंस्ट्रूमेंटेशन का उपयोग करके जावा विधि के साथ देशी विधि (fillInStackTrace) को प्रतिस्थापित करने की अनुमति नहीं है।

+2

सभी अपवादों के लिए 'fillInStackTrace' को बदलना चीजों को तोड़ने के लिए उत्तरदायी है; जैसे जावा सुरक्षा। –

+0

@ स्टीफन: क्या आप यह बताने की परवाह करते हैं कि क्यों, या यह स्पष्ट होना चाहिए? – jarnbjo

+0

आईआईआरसी, कुछ सुरक्षा जांच में कॉलस्टैक की जांच करना शामिल है यह देखने के लिए कि कॉलर "विशेषाधिकार प्राप्त" कोड है या नहीं। आईआईआरसी यह fillInStackTrace पर निर्भर करता है। –

0

Throwable.setStackTrace (StackTraceElement [] स्टैकट्रेस) स्टैकट्रेस के लिए किसी भी अतिरिक्त अपने कॉल के बाद अवरुद्ध कर देगा:

Throwable t = new Throwable(); 
StackTraceElement[] myStackTrace = new StackTraceElement[] { 
new StackTraceElement("MySDKClass","MySDKMethod","MySDKFile",0) 
}; 
t.setStackTrace(trace); 
संबंधित मुद्दे