2010-01-13 14 views
8

मैं एक देशी साझा लाइब्रेरी डीबग करने की कोशिश कर रहा हूं कि मेरा ऐप जेएनआई के माध्यम से उपयोग करता है। मैं "gdbserver --attach pid" के साथ बस एक चल रहे ऐप से जुड़ा हूं लेकिन जब मैं gdbserver कमांड लॉन्च करता हूं तो मुझे वास्तव में अपना ऐप लॉन्च करने की आवश्यकता होती है।GDBSERVER के साथ एंड्रॉइड पर ऐप डीबग कैसे करें?

इस विषय पर एक लाख ब्लॉग हिट हैं लेकिन उनमें से कोई भी स्पष्ट नहीं है कि आप अपना ऐप कैसे लॉन्च करते हैं। वे सभी बस "gdbserver 10.0.2.2:1234 ./MyProgram" टाइप करने के लिए कहते हैं, लेकिन "MyProgram" वास्तव में क्या है। क्या वह MyProgram.apk है? क्या यह MyProgram.so है? क्या यह कुछ अन्य फाइल है जो ऐप इंस्टॉल होने पर बनाई जाती है? यदि हां, तो इसका रास्ता क्या है?

उत्तर

4

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

एक APK में एक आवेदन का शुभारंभ कई कदम

  1. system_server प्रक्रिया को कोई लक्ष्य अपने आवेदन का अनुरोध प्राप्त करता है शामिल है।
  2. ज़ीगोट प्रक्रिया को एक नई प्रक्रिया को फोर्क करने और अपनी कक्षा की एक विधि चलाने के लिए कहा जाता है।
  3. आपका आवेदन नई प्रक्रिया में चलता है।

आप एक निष्पादन गुजर gdbserver करने से सीधे एक APK शुरू नहीं कर सकते हैं, इसकी काफी आसान am आदेश का उपयोग कर खोल के शुरुआती यह गति प्रदान करने के।

$ adb -d shell 
# am 
usage: am [subcommand] [options] 

    start an Activity: am start [-D] <INTENT> 
     -D: enable debugging 

    send a broadcast Intent: am broadcast <INTENT> 

    start an Instrumentation: am instrument [flags] <COMPONENT> 
     -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT) 
     -e <NAME> <VALUE>: set argument <NAME> to <VALUE> 
     -p <FILE>: write profiling data to <FILE> 
     -w: wait for instrumentation to finish before returning 

    start profiling: am profile <PROCESS> start <FILE> 
    stop profiling: am profile <PROCESS> stop 

    <INTENT> specifications include these flags: 
     [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>] 
     [-c <CATEGORY> [-c <CATEGORY>] ...] 
     [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...] 
     [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...] 
     [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...] 
     [-n <COMPONENT>] [-f <FLAGS>] [<URI>] 


# am start -n com.android.browser/.BrowserActivity 
Starting: Intent { cmp=com.android.browser/.BrowserActivity } 
# 

एक बार आपका एप्लिकेशन चलने के बाद, gdbserver --attach <pid> का उपयोग करें जैसा कि आपके पास है। यदि आप भाग्यशाली हैं तो आपका आवेदन आपके मूल कोड में कॉल करने से पहले कुछ उपयोगकर्ता इंटरैक्शन की प्रतीक्षा करता है ताकि आपको जीडीबी में अपने ब्रेकपॉइंट्स को अटैच करने और सेट करने का मौका दिया जा सके।

4

गूगल आपकी समस्या का एक अधिकारी समाधान प्रदान करता है: 'NDK-gdb'

यह NDK में शामिल है। आईआईआरसी, यह आवश्यक है कि आपके पास एपीके के अंदर बंडल किए गए gdbserver की एक प्रति है; आईआईआरसी, यह स्वचालित रूप से होगा यदि आपने अपना एपीके 'ndk-build' के साथ बनाया है, और उपयुक्त तर्क निर्दिष्ट किए हैं।

कृपया $ NDK/docs/NDK-BUILD.html और $ NDK/docs/NDK-GDB.html में गूगल के दस्तावेज़ देखें

</रयान >

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