2010-10-12 5 views
9

के साथ एंड्रॉइड ऐप डीबगिंग मुझे एमुलेटर पर एंड्रॉइड ऐप्स के साथ स्टैंड-अलोन जावा डीबगर का उपयोग करने में परेशानी हो रही है। जाहिर है, किसी भी रिमोट-सक्षम जावा डीबगर जैसे कि जेडीबी (या जेएसवाट) को नीचे दिए गए चरणों का पालन करके लीवरेज किया जा सकता है (जैसा कि मैं यहां और वहां पढ़ने के बाद समझता हूं):"jdb -attach" (या jswat)

1) एमुलेटर चालू करें, अपना ऐप इंस्टॉल करें एमुलेटर (एडीबी स्थापित)

2) "DevTools" अनुप्रयोग चलाने Dalvik सर्वर पर बारी (डी डी एम एस)

3) एमुलेटर पर, -> "विकास सेटिंग्स" -> एप्लिकेशन का चयन करें आप डीबग करना चाहते हैं, "डीबगर के लिए प्रतीक्षा करें" ध्वज

4) फिर से एमुलेटर में, अपना ऐप चलाएं; यह अवरुद्ध करने के लिए एक डीबगर की प्रतीक्षा कर रहा है, और दल्विक एक "लाल बग"

5) दाल्विक पर, लाल ध्वजांकित प्रक्रिया का चयन करें; इस प्रकार डीबग बंदरगाह को स्थानीयहोस्ट में भेजा जाता है: 8700

6) डीबगर को स्थानीयहोस्ट पर हुक करें: 8700। जेडीबी के साथ आपको "jdb -attach 8700"

जैसे ही डीबगर लॉन्च किया जाता है, आपके एमुलेटर पर एप अनब्लॉक करता है। इसलिए, ऐसा लगता है कि ऐप ने डीबगर का सही ढंग से पता लगाया है और इस प्रकार मुफ़्त चलता है।

हालांकि, यह मुद्दा है कि यह "मुक्त चलाता है" यानी, यह डीबगर को "रन" कमांड जारी करने की प्रतीक्षा नहीं करेगा। तो मुझे कोई ब्रेकपॉइंट स्थापित करने का कोई मौका नहीं है।

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

साथ jswat आप अल इन संदेशों को नहीं देख पा रहे लेकिन अंतिम परिणाम एक ही :-(

जरूरत नहीं कहने के लिए, "jdb -Attach" स्थानीय होस्ट पर चल रहे गैर एंड्रॉयड जावा एप्लिकेशन के साथ ठीक काम करता है

किसी भी संकेत?

हूँ मैं सिर्फ एक बेवकूफ विस्तार कहीं भी लापता?

एप्लिकेशन ("ग्रहण का इस्तेमाल करें" को छोड़कर), एक HelloWorld है आदेश का निर्माण होता है "चींटी डिबग"।

+०१२३५१६४१०

अग्रिम धन्यवाद।

+0

भौतिक और आभासी उपकरणों दोनों के साथ काम करता है: https://asantoso.wordpress.com/2009/09/26/using-jdb-with-adb-to-debugging-of-android-app-on-a-real -device / –

उत्तर

4

आपके .jdbrc फ़ाइल में ब्रेकपॉइंट सेट करने का सबसे अच्छा तरीका प्रतीत होता है, क्योंकि ये लोड और स्थगित हो जाते हैं और आपको प्रतीक्षा करने के दौरान डिबगर को पकड़ने की कोशिश कर रहे मनमाने ढंग से देरी लूप सेट करने के लिए अपना कोड बदलना नहीं पड़ता है। मैं, आपके जैसे, पाया है कि यदि आप कक्षा के नाम पर ब्रेक पॉइंट सेट करते हैं तो यह काम नहीं करता है। यह कहता है कि कक्षा को लोड होने तक परिभाषित किया जाता है, लेकिन फिर ऐसा लगता है कि वर्ग लोड होने पर जेडीबी कभी अधिसूचित नहीं होता है।

हालांकि यह काम करता है अगर आप अपने में

एक विशिष्ट वर्ग और लाइन नंबर पर एक ब्रेकपाइंट निर्धारित किया है।jdbrc फ़ाइल:

 
stop in com.android.helloandroid.HelloAndroid 
stop at com.android.helloandroid.HelloAndroid:21 

पहली पंक्ति कुछ भी नहीं करती है, जैसा कि आप पहले ही जानते हैं। दूसरी पंक्ति मेरे लिए यहां काम करती है:

 
Initializing jdb ... 
*** Reading commands from /home/codeboy2k/.jdbrc 
Deferring breakpoint com.android.helloandroid.HelloAndroid. 
It will be set after the class is loaded. 
> Deferring breakpoint com.android.helloandroid.HelloAndroid:21. 
It will be set after the class is loaded. 
> > Set deferred breakpoint com.android.helloandroid.HelloAndroid:21 

Breakpoint hit: "thread= main", com.android.helloandroid.HelloAndroid.onCreate(), line=21 bci=11 

main[1] 

तो कुंजी आपके ब्रेकपॉइंट्स में विशिष्ट पंक्ति संख्याओं का उपयोग करने लगती है। कोशिश करो। उम्मीद है कि यह आपकी मदद करता है और आपके लिए भी काम करता है।

0

हां, यह काम करता है :-) बहुत धन्यवाद, codeboy2k!

मैंने और अधिक प्रयोग किए हैं, और ऐसा लगता है कि यदि आप एक विधि नाम निर्दिष्ट करते हैं तो यह भी काम करता है (उदाहरण के लिए "com.android.helloandroid.HelloAndroid.onCreate" में रोकें)। मुख्य चाल, इस प्रकार, जेडीबी की स्टार्टअप फ़ाइल में प्रारंभिक ब्रेकपॉइंट डालना है, इसलिए ऐप उस ब्रेकपॉइंट पर अवरुद्ध होगा, और फिर वास्तविक डीबग सत्र के साथ जारी रहेगा।

मैंने jswat के साथ भी प्रयास किया है, और सही प्रक्रिया निम्नानुसार है: स्रोत कोड लोड करें, अपने ब्रेकपॉइंट्स सेट करें (कम से कम प्रारंभिक एक), फिर एप में डीबगर संलग्न करें (जो इस बीच प्रतीक्षा कर रहा था डीबगर)। तब से, ऐप एक ब्रेकपॉइंट से दूसरी तरफ आगे बढ़ेगा। हालांकि, यह एक दयालुता है कि jswat स्रोत प्रगति पर ही प्रगति नहीं दिखाता है :-(

0

जब आप दाल्विक लॉन्च करते हैं तो कमांड लाइन पर निलंबन = y जेडीडब्ल्यूपी विकल्प भी देखें ... नोट: मेरे पास है इसका परीक्षण नहीं किया गया है, हालांकि दाल्विक के पास सही कमांड लाइन विकल्पों के साथ लोड होने पर निलंबित करने की क्षमता है।

0

मेरे गैर-ग्रहण सेटअप पर एक बात मैंने देखी है कि अगर मेरे पास अभी भी एडीवी चल रहा है तो मैं डीबग सत्र प्राप्त कर सकता हूं संलग्न करें (पोर्ट 8700) लेकिन मैं ब्रेकपॉइंट्स को हिट करने के लिए नहीं मिल सकता ... एडीवी बंद करें और यह काम करता है। मुझे नहीं पता कि यह मेरे लिए क्यों काम करता है लेकिन यह मेरे लिए क्यों काम करता है।

Here यह मेरी मदद के मामले में सेटअप है। अब संस्करण 17 पर लेकिन ओथ इसकी तुलना में एक ही सेटअप है।

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