2015-09-10 8 views
9

मैं lldb का उपयोग कर एंड्रॉइड स्टूडियो के मूल डिबगिंग से एंड्रॉइड मूल ऐप को डीबग करने का प्रयास कर रहा हूं।
मेरे मूल ऐप में एक libmain.so है जो एंड्रॉइड स्टूडियो द्वारा संकलित और चलाया जाता है और एक और बाहरी libother.so मेरे द्वारा संकलित। डिबगिंग करते समय, मैं libmain.so में ब्रेकपॉइंट्स सेट करने में सक्षम हूं लेकिन libother.so नहीं।
दोनों साझा वस्तुओं को छीन लिया गया है लेकिन किसी भी तरह से एंड्रॉइड स्टूडियो lldb libmain.so के unstripped संस्करण के बारे में पता है बनाता है। मैं libother.so के लिए भी ऐसा करना चाहता हूँ।एलएलडीबी: प्रतीकों फ़ाइल जोड़ें?

क्या आदेश मैं इतना है कि यह मेरी स्थानीय मशीन पर एक unstripped फ़ाइल से प्रतीकों लोड होगा lldb देने की जरूरत है?
मैं अपने स्थानीय unstripped संस्करण के लिए एक रास्ता के साथ मुख्य .so अंक देख जब मैं image list कार्य करें:

/Users/username/Projects/gow/android/AppName/app/build/intermediates/binaries/debug/arm7/obj/armeabi-v7a/libmain.so

और /var/folders/3w/5nr95lxx3qvdm2ylb8c8b7500000gn/T/./lldb/module_cache/remote-android/.cache/B5F32653-0000-0000-0000-000000000000/libother.so

की तरह एक पथ के साथ दूसरे .so मैं कैसे करूँ lldb को libother.so के अप्रतिबंधित संस्करण को ढूंढें?
मैंने image add और target symbols add की कोशिश की लेकिन यह काम नहीं किया।

+0

आप Gradle साथ ऐप्लिकेशन का निर्माण करते हैं? यदि हां, तो क्या आप अपनी बिल्ड फाइल साझा कर सकते हैं? अपनी एंड्रॉइड.एमके फ़ाइल को भी साझा करें –

+0

मैं इसे ग्रेडल के साथ बना देता हूं। निर्माण फ़ाइल एक ही है कि चायदानी उदाहरण के साथ आता है के समान है (https://developer.android.com/ndk/samples/sample_teapot.html) फर्क सिर्फ इतना है कि मेरी परियोजना में मैं एक फ़ोल्डर "jniLibs" कहा जाता है तो धीरे-धीरे इस फ़ोल्डर को पाता है और इसमें एएसके को भी जोड़ता है। .so के निर्माण के लिए एंड्रॉइड.एमके भी एक मानक है जिसका उपयोग एंड्रॉइड स्टूडियो समर्थन से पहले एनएनडी के साथ निर्माण के लिए किया जाता था। यह क्लैंग और सी ++ _ स्थिर (यहां जोड़ने के लिए बहुत बड़ा) का उपयोग करता है। मैं लेट्स का उपयोग कर रहा हूं एनडीके – shoosh

+0

क्या आप विंडोज़ पर डिबगिंग कर रहे हैं? आपके द्वारा प्रदान किए गए पथ मुझे एंड्रॉइड से हैं। एनडीके में अभी भी कुछ ज्ञात बग हैं; जब एलएलडीबी ब्रेकपॉइंट्स के साथ डीबगिंग हमेशा विंडोज पर काम नहीं करती है; यदि आप इसमें भाग लेते हैं, तो आप अस्थायी कार्यवाही के रूप में जीडीबी डिबगिंग पर स्विच कर सकते हैं। –

उत्तर

2

"target.source-नक्शा" सेटिंग का उपयोग

(lldb) सेटिंग्स सूची target.source-नक्शा
स्रोत-नक्शा - स्रोत पथ एक के बीच स्थान के परिवर्तन को ट्रैक किया जाता remappings स्रोत फ़ाइल निर्मित होने पर, और वर्तमान सिस्टम पर यह कहां मौजूद है। यह duples की एक सरणी के होते हैं, प्रत्येक गेहरा के पहले तत्व फ़ाइल का पथ का कुछ हिस्सा (रूट पर शुरू) जब यह बनाया गया था, और दूसरा है जहां मूल निर्माण पदानुक्रम के शेष है स्थानीय प्रणाली पर जड़ें। प्रत्येक सरणी का तत्व क्रम में चेक किया गया है और पहला मैच जीतने वाले परिणाम में जीतता है।

यानी

settings set target.source-map /build_src /source 

जहां इमारत पर्यावरण /build_src और the.dSYM फ़ाइलें (प्रतीक) किया जा रहा है के तहत कॉपी कर रहे हैं /source

संपादित करें:

बाइनरी अक्सर निर्माण किया जा रहा करने के बाद हटा दिए जाते हैं और एक रिलीज में पैक किया गया। अपने निर्माण प्रणाली एक unstripped निष्पादन की बचत होती है, तो इस निष्पादन करने के लिए एक रास्ता कुंजी DBGSymbolRichExecutable का उपयोग कर उपलब्ध कराया जा सकता

आप एक शेल कमांड कि एक UUID मूल्य दिया जाएगा और कुछ कुंजी के साथ एक plist लौटने की उम्मीद है लिख सकते हैं जो निर्दिष्ट करता है कि बाइनरी कहां है।

आप का उपयोग खोल स्क्रिप्ट सक्षम कर सकते हैं:

% defaults write com.apple.DebugSymbols DBGShellCommands /path/to/shellscript 

आपका खोल स्क्रिप्ट की तरह "23516BE4-29BE-350C-91C9-F36E7999F0F1" एक UUID स्ट्रिंग मान द्वारा सक्रिय किया जाएगा।खोल स्क्रिप्ट निम्न स्वरूप में एक plist के साथ प्रतिक्रिया कर सकते हैं:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
"http://www.apple.com/DTDs/PropertyList-1.0.dtd";> 
<plist version="1.0"> 
<dict> 
     <key>23516BE4-29BE-350C-91C9-F36E7999F0F1</key> 
     <dict> 
       <key>DBGArchitecture</key> 
       <string>i386</string> 
       <key>DBGBuildSourcePath</key> 
       <string>/path/to/build/sources</string> 
       <key>DBGSourcePath</key> 
       <string>/path/to/actual/sources</string> 
       <key>DBGDSYMPath</key> 
       <string>/path/to/foo.dSYM/Contents/Resources/DWARF/foo</string> 
       <key>DBGSymbolRichExecutable</key> 
       <string>/path/to/unstripped/exectuable</string> 
     </dict> 
     <key>A40597AA-5529-3337-8C09-D8A014EB1578</key> 
     <dict> 
       <key>DBGArchitecture</key> 
       <string>x86_64</string> 
       ..... 
     </dict> 
</dict> 
</plist> 

अधिक जानकारी के लिए कृपया देखें:

http://lldb.llvm.org/symbols.html

https://www.mail-archive.com/[email protected]/msg01142.html

संपादित करें 2:

टर्मिनल आदेश एक निष्पादन के निर्माण UUID मुद्रित करने के लिए

$ xcrun dwarfdump --uuid <PATH_TO_APP_EXECUTABLE> 

source

+0

ढूंढता है लेकिन मेरे पास .dSYM फ़ाइलें नहीं हैं, केवल अप्रतिबंधित साझा ऑब्जेक्ट ... – shoosh

+0

मेरे उत्तर का संपादन देखें – Pat

+0

यह अच्छा है !, मैं अपने .so apriori के UUID कैसे सेट/प्राप्त कर सकता हूं? – shoosh

1

पूर्णता के लिए, मैं क्या कर समाप्त हो गया
है - unstripped साझा वस्तु को /Users/username/Projects/gow/android/AppName/app/build/intermediates/binaries/debug/arm7/obj/armeabi-v7a/ से एक सिमलिंक जोड़ने - -Wl,--build-id=sha1 libmain.so
की Android.mk में LOCAL_LDFLAGS में जोड़ें ।

unstripped .so लगता है, सही ढंग से अपने प्रतीकों पेश एंड्रॉयड-स्टूडियो के LLDB अनुमति और libmain.so कोड में breakpoints जोड़ने के लिए मुझे अनुमति दी है।

2

इस सूत्र में जवाब MacOSX के लिए विशिष्ट होने लगते हैं। मैं लिनक्स का उपयोग कर रहा हूं, इसलिए ये जवाब बहुत उपयोगी नहीं थे। कुछ समय बाद मैंने इसे समझ लिया है, और यहां एक बहुत ही सरल समाधान है। इससे पहले कि आप "प्रक्रिया देते हैं" क्या आप निम्न आदेश पर अमल करना चाहिए:

settings set target.exec-search-paths /path/to/directory/with/unstripped/library/on/host 

इस सेटिंग lldb के साथ पुस्तकालय का सही संस्करण खोजने कोई समस्या नहीं है।

बीटीडब्ल्यू, एंड्रॉइड स्टूडियो के नवीनतम संस्करणों में बाहरी पुस्तकालयों के साथ कोई समस्या नहीं है (वास्तव में, एक ही तकनीक का उपयोग सभी पुस्तकालयों, दोनों "आंतरिक" और "बाहरी" दोनों के सही पथ निर्धारित करने के लिए किया जाता है, कम से कम यदि आप ' ग्रैडल के साथ फिर से निर्माण)। लेकिन अगर आप स्टैंडअलोन एलएलडीबी का उपयोग करते हैं, तो यह बहुत आसान हो सकता है।

प्रत्येक डिबगिंग सत्र की शुरुआत के बाद यह टाइपिंग से बचने के लिए आप फ़ाइल इस आदेश को (जैसे lldb.cmd) और फिर इस तरह lldb शुरू बचा सकते हैं:

./lldb -S lldb.cmd 
+0

ऐसा लगता है कि यह एएस 2.2.2 (लिनक्स के तहत भी चल रहा है) में काम नहीं करता है। 'lldb'' .lldb/module_cache/में संग्रहीत पुस्तकालयों का उपयोग कर रहा है ... '(मैं इसे' छवि सूची' में देख सकता हूं) जिसमें डीबग प्रतीकों नहीं हैं। मैंने 'रन/डीबग कॉन्फ़िगरेशन' में 'एलएलडीबी स्टार्टअप कमांड' के तहत exec-search-path डाल दिया है। पथ स्वयं ही {{abs_path_to_project}/ऐप/बिल्ड/इंटरमीडिएट्स/एनडीकेबिल्ड/डीबग/ओबीजे/स्थानीय/आर्मेबी-वी 7 ए' को इंगित करता है क्योंकि इस निर्देशिका में डीबग प्रतीकों के साथ साझा पुस्तकालय शामिल हैं। मैं यहां क्या गलत कर रहा हूं पर कोई विचार? –

+0

मुझे 'एलएलडीबी स्टार्टअप कमांड 'के बारे में पता नहीं है, कभी इसका इस्तेमाल नहीं किया। क्या आप इसे मैन्युअल रूप से टाइप कर सकते हैं, क्या यह काम करता है? क्या आपकी 'छवि सूची' पर पुस्तकालय दिखाई देते हैं? –

+1

क्षमा करें, यह पता चला कि मेरी लाइब्रेरी डीबग के लिए ठीक तरह से नहीं बनाई गई थी, बिल्डिंग प्रक्रिया को ठीक करने के बाद आपके उत्तर ने मेरे लिए काम किया। धन्यवाद। –

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