2010-03-29 6 views
15

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

यदि नहीं, तो ऐसा कुछ लिखना भी संभव है (मान लीजिए कि हम डीबग अवधि के लिए हॉटस्पॉट के बिना जीने के इच्छुक हैं)?

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

संपादित 2: मुझे पता है कि जावप मौजूद है - लेकिन यह केवल एक ही तरीका है (और बिना किसी प्रकार के विश्लेषण के)। उदाहरण (vmspec प्रलेखन से लिया कोड): जावा कोड से, हम का उपयोग करें "javac" इस संकलन:

void setIt(int value) { 
    i = value; 
} 
int getIt() { 
    return i; 
} 
एक जावा .class फाइल करने के लिए

। javap का उपयोग -c मैं इस उत्पादन प्राप्त कर सकते हैं:

Method void setIt(int) 
    0 aload_0 
    1 iload_1 
    2 putfield #4 
    5 return 
    Method int getIt() 
    0 aload_0 
    1 getfield #4 
    4 ireturn 

यह (विश्लेषण के बिना वास्तव में अच्छा नहीं - "क्षेत्र # 4 Example.i है") disassembly के भाग के लिए ठीक है, लेकिन मैं दो नहीं मिल सकता है अन्य "टूल्स":

  1. एक डीबगर जो स्वयं निर्देशों (स्टैक, मेमोरी डंप आदि के साथ) पर जाता है, जिससे मुझे वास्तविक कोड और पर्यावरण की जांच करने की अनुमति मिलती है।
  2. प्रक्रिया को उलट करने का एक तरीका - अलग किए गए कोड को संपादित करें और .class फ़ाइल (संपादित कोड के साथ) को पुन: बनाएँ।

उत्तर

11

मुझे नहीं लगता कि यह वास्तव में एक पूरा जवाब है, लेकिन कुछ संकेत दिए गए कि कुछ व्यावहारिक प्रदान कर सकता है:

(1) को देखने की दृष्टि से और सीधे बाईटकोड के साथ काम वर्ष BCEL Class Construction Kit उपयोगी हो सकता है में (यह बाइटकोड के लिए केवल जीयूआई संपादक मुझे पता है)।

(2) बाइटकोड के माध्यम से डीबगिंग और चरणबद्ध करने के मामले में, this Eclipse plugin, जो ग्रहण के डीबगर के साथ एकीकृत करता है, आपकी आवश्यकताओं को पूरा कर सकता है।

मुझे इन सुविधाओं को गठबंधन करने वाली किसी भी यूटिलिटीज से अवगत नहीं है और कोड को निष्पादित करते समय बाइटकोड में हेरफेर करने की अनुमति नहीं है (कम से कम उसी तरह आप ओलीडीबीजी, आदि में भी कर सकते हैं)। हालांकि, जावा debugger API रनटाइम पर कोड में हेरफेर करने में सक्षम होना चाहिए (हालांकि, सामान्य रूप से हॉटस्पॉट और जेआईटी की प्रकृति को देखते हुए, मुझे नहीं पता कि इसे लागू करने से ठीक पहले एक निर्देश को फिर से लिखना संभव होगा --- वर्तमान में निष्पादित बाइटकोड ओपोड वास्तव में एक अमूर्त है कि कैसे दुभाषिया ओप को लागू करने का विकल्प चुनता है, मूल कोड के विपरीत जहां असंबद्ध ओपोड वास्तव में, सीपीयू को भेजा गया निर्देश है)। वैकल्पिक रूप से, आप Java Instrumentation API देख सकते हैं जो रनटाइम पर बाइट कोड को फिर से परिभाषित करने का एक तरीका प्रदान करता है।और, ज़ाहिर है, any of the various open source bytecode manipulation libraries प्रेरणा प्रदान करने या प्रदान करने में सक्षम हो सकता है।

और, ज़ाहिर है, हमेशा पूरे JVM बुनियादी ढांचे को रोकने और JVM प्रक्रिया में डीबगर को जोड़ने का विकल्प हमेशा होता है। इस in this question और this page linked from that question पर कुछ चर्चा है।

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

+0

वाह, अच्छा जवाब। दयालुता ऐसा कोई उपकरण नहीं है। मुझे संदेह है कि मैं खुद को एक बनाऊंगा (बहुत रोचक - लेकिन काम पर दबाव, जीवन, पर्याप्त डोमेन ज्ञान नहीं ...)। बहुत पूर्ण उत्तर के लिए धन्यवाद। –

+0

+1 इन सभी जानकारी ने मुझे बहुत मदद की! =) धन्यवाद – jyz

2

जावा कोड को डीकंपलिंग के लिए JAD Decomplier पर एक नज़र डालें। फिर आप उत्पादित स्रोतों का उपयोग कर आईडीई के अंतर्निर्मित डीबगर चला सकते हैं। आईडीई इंटेलिजे, ग्रहण या नेटबीन हो सकता है। यह दृष्टिकोण पूरी तरह से स्वचालित नहीं है, लेकिन इसे नौकरी करना चाहिए।

+0

जो मैं ढूंढ रहा हूं वह नहीं - कृपया पूर्ण प्रतिक्रिया के लिए मेरा संपादन देखें। –

+0

ठीक है, तो जवाब है "ऐसी कोई चीज़ नहीं है"। –

+0

:( क्या ऐसी कोई चीज़ बनाने का कोई तरीका है? क्या वीएम डीबग एपीआई इसका समर्थन करता है? –

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