इस पेज पर, ओएस डेवलपमेंट के लिए LLDB का इस्तेमाल करने के बारे में जानकारी दी गई है. ऐप्लिकेशन डेवलपमेंट के लिए, अपने ऐप्लिकेशन को डीबग करना लेख पढ़ें. इसमें, LLDB पर आधारित Android Studio के जीयूआई का इस्तेमाल करने का तरीका बताया गया है.
GDB अब काम नहीं करता या उपलब्ध नहीं है. अगर आपको GDB से LLDB पर स्विच करना है, तो सबसे पहले LLDB ट्यूटोरियल पढ़ें. अगर आप GDB के विशेषज्ञ उपयोगकर्ता हैं, तो ट्रांज़िशन के दौरान GDB से LLDB के लिए कमांड मैप का इस्तेमाल करना बहुत मददगार होता है.
ज़रूरी शर्तें
डीबगर का इस्तेमाल करने के लिए:
- सामान्य
envsetup.sh
कमांड की मदद से, बिल्ड एनवायरमेंट सेट अप करें. - वही
lunch
कमांड चलाएं जिसका इस्तेमाल आपने बिल्ड करते समय किया था. ध्यान दें कि लंच आइटम, डिवाइस से पूरी तरह मेल खाना चाहिए जिसे डीबग किया जा रहा है. अगर लंच आइटम, अटैच किए गए डिवाइस से मेल नहीं खाता है, तो आपको इस तरह का गड़बड़ी का मैसेज मिलेगा:You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
- अपने डिवाइस को मशीन से कनेक्ट करें.
एनवायरमेंट सेट अप करने के बारे में ज़्यादा जानने के लिए, एनवायरमेंट सेट अप करना लेख पढ़ें.
बाइनरी को डीबग करना
अपनी मशीन पर बनाई गई बाइनरी को डीबग करने के लिए, आपको सबसे पहले बाइनरी को डिवाइस पर कॉपी करना होगा और फिर डीबगर को लॉन्च करना होगा. उदाहरण के लिए:
adb push test.exe /data/local/tmp/test.exe
lldbclient.py --port 5038 -r /data/local/tmp/test.exe
चल रहे ऐप्लिकेशन या प्रोसेस को डीबग करना
किसी चल रहे ऐप्लिकेशन या नेटिव डेमन से कनेक्ट करने के लिए, पीआईडी के साथ lldbclient.py
का इस्तेमाल करें. उदाहरण के लिए, PID
1234 वाली प्रोसेस को डीबग करने के लिए, होस्ट पर यह चलाएं:
lldbclient.py -p 1234
स्क्रिप्ट, पोर्ट फ़ॉरवर्डिंग सेट अप करती है. साथ ही, डिवाइस पर सही रिमोट डीबगिंग स्टब शुरू करती है. इसके बाद, होस्ट पर डीबगर शुरू करती है और उसे सिंबल ढूंढने के लिए कॉन्फ़िगर करती है. आखिर में, उसे रिमोट डीबगिंग स्टब से कनेक्ट करती है.
नेटिव प्रोसेस के स्टार्टअप को डीबग करना
किसी प्रोसेस के शुरू होने पर उसे डीबग करने के लिए, -r
के साथ lldbclient.py
का इस्तेमाल करें. उदाहरण के लिए, ls /bin
को डीबग करने के लिए, होस्ट पर यह चलाएं:
lldbclient.py -r /system/bin/ls /bin
इसके बाद, डीबगर के प्रॉम्प्ट में continue
डालें.
ऐप्लिकेशन के स्टार्टअप को डीबग करना
कभी-कभी, ऐप्लिकेशन के शुरू होने पर ही उसे डीबग करना पड़ता है. जैसे, ऐप्लिकेशन क्रैश होने पर, आपको कोड के ज़रिए यह देखना हो कि क्रैश होने से पहले क्या हुआ था.
अटैच करना कुछ मामलों में काम करता है, लेकिन कुछ मामलों में ऐसा करना मुश्किल होता है. ऐसा इसलिए होता है, क्योंकि अटैच करने से पहले ही ऐप्लिकेशन क्रैश हो जाता है. logwrapper
का तरीका (strace
के लिए इस्तेमाल किया जाता है) हमेशा काम नहीं करता, क्योंकि हो सकता है कि ऐप्लिकेशन के पास कोई पोर्ट खोलने की अनुमतियां न हों. साथ ही, lldbserver
को यह पाबंदी इनहेरिट हो जाती है.
ऐप्लिकेशन के स्टार्टअप को डीबग करने के लिए, सेटिंग में जाकर 'डेवलपर के लिए सेटिंग और टूल' का इस्तेमाल करें. इससे, ऐप्लिकेशन को किसी Java डीबगर के अटैच होने का इंतज़ार करने का निर्देश दिया जा सकता है:
- सेटिंग > डेवलपर के लिए सेटिंग और टूल > डीबग करने के लिए ऐप्लिकेशन चुनें पर जाएं. इसके बाद, सूची से अपना ऐप्लिकेशन चुनें और डीबगर के लिए इंतज़ार करें पर क्लिक करें.
- ऐप्लिकेशन को लॉन्चर से या कमांड लाइन का इस्तेमाल करके चलाएं:
adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
- ऐप्लिकेशन के लोड होने और एक डायलॉग दिखने का इंतज़ार करें. इसमें आपको बताया जाएगा कि ऐप्लिकेशन, डीबगर के लिए इंतज़ार कर रहा है.
lldbserver
/lldbclient
को सामान्य तरीके से अटैच करें, ब्रेकपॉइंट सेट करें, और फिर प्रोसेस जारी रखें.
ऐप्लिकेशन को चलाने के लिए, Java डीबग वायर प्रोटोकॉल (JDWP) डीबगर अटैच करें. जैसे, Java डीबगर (jdb):
adb forward tcp:12345 jdwp:XXX # (Where XXX is the PID of the debugged process.)
jdb -attach localhost:12345
क्रैश होने वाले ऐप्लिकेशन या प्रोसेस को डीबग करना
अगर आपको debuggerd
को क्रैश हुई प्रोसेस को निलंबित करना है, ताकि आप डिबगर को अटैच कर सकें, तो सही प्रॉपर्टी सेट करें:
- Android 11 के बाद
adb shell setprop debug.debuggerd.wait_for_debugger true
- Android 11 और उससे पहले के वर्शन
adb shell setprop debug.debuggerd.wait_for_gdb true
- Android 6.0 Marshmallow और इससे पहले के वर्शन
adb shell setprop debug.db.uid 999999
क्रैश के सामान्य आउटपुट के आखिर में, debuggerd
, logcat में कॉपी और चिपकाने के निर्देश देता है. इससे, क्रैश हुई प्रोसेस से डीबगर को कनेक्ट करने का तरीका पता चलता है.
VS Code की मदद से डीबग करना
LLDB, Visual Studio Code पर प्लैटफ़ॉर्म कोड को डीबग करने की सुविधा देता है. डिवाइसों पर चल रहे नेटिव कोड को कंट्रोल करने और डीबग करने के लिए, LLDB CLI इंटरफ़ेस के बजाय VS Code डीबगर फ़्रंटएंड का इस्तेमाल किया जा सकता है.
डीबग करने के लिए VS Code का इस्तेमाल करने से पहले, CodeLLDB एक्सटेंशन इंस्टॉल करें.
VS Code का इस्तेमाल करके कोड को डीबग करने के लिए:
- पक्का करें कि
lldbclient.py
याlldbclient.py
को चलाने के लिए ज़रूरी सभी बिल्ड आर्टफ़ैक्ट (जैसे, सिंबल) मौजूद हों. - VS Code में कोई निर्देश चलाने के लिए, Ctrl+Shift+P दबाएं. इसके बाद, डीबग करें:
कॉन्फ़िगरेशन जोड़ें... खोजें और LLDB चुनें.
इससे
launch.json
फ़ाइल खुलती है और सूची में एक नया JSON ऑब्जेक्ट जुड़ जाता है. - नए जोड़े गए डीबगर कॉन्फ़िगरेशन को दो टिप्पणी लाइनों -
// #lldbclient-generated-begin
और// #lldbclient-generated-end
से बदलें, ताकि आपकी कॉन्फ़िगरेशन सूची इस तरह दिखे:"configurations": [ // #lldbclient-generated-begin // #lldbclient-generated-end ]
lldbclient.py
, कॉन्फ़िगरेशन को कहां लिखना है, यह पता लगाने के लिए इन टिप्पणियों का इस्तेमाल करता है. अगर सूची में अन्य आइटम हैं, तो अन्य कॉन्फ़िगरेशन के बाद, टिप्पणी वाली लाइनें जोड़ें. - उस टर्मिनल में यह कमांड चलाएं जहां आपने
envsetup.sh
औरlunch
चलाया है:lldbclient.py --setup-forwarding vscode-lldb \ --vscode-launch-file LAUNCH_JSON_PATH \ ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...
lldbclient.py
, जनरेट किए गए कॉन्फ़िगरेशन कोlaunch.json
में लिखता है और चलता रहता है. ऐसा होना लाज़िमी है.lldbclient.py
प्रोग्राम को बंद न करें. अगर--vscode-launch-file
को छोड़ा जाता है, तो स्क्रिप्ट JSON स्निपेट को प्रिंट करेगी. आपको इसे मैन्युअल तरीके सेlaunch.json
में कॉपी करके चिपकाना होगा.अगर
-r
फ़्लैग मौजूद है, तो यह आखिरी फ़्लैग होना चाहिए. ऐसा इसलिए, क्योंकि टूल, फ़्लैग को पार्स करता है. - रन और डीबग करें साइड बार खोलें - नया कॉन्फ़िगरेशन, डीबगर की सूची में दिखना चाहिए. डीबग करना शुरू करें (F5) दबाएं. डिबगर 10 से 30 सेकंड के बाद कनेक्ट हो जाना चाहिए.
अगर नया कॉन्फ़िगरेशन, 'चालू करें और डीबग करें' व्यू में नहीं दिखता है, तो डीबगर की सूची को रीफ़्रेश करने के लिए विंडो को फिर से लोड करें - Ctrl+Shift+P दबाएं और
reload window
टाइप करें. - डीबग करने के बाद,
lldbclient.py
प्रोग्राम को बंद करने के लिए,lldbclient.py
चला रहे टर्मिनल पर जाएं और Enter दबाएं. स्क्रिप्ट को फिर से चलाने पर,#lldbclient-generated
टिप्पणियों के बीच कॉन्फ़िगरेशन जनरेट होगा और पुराने कॉन्टेंट को बदल दिया जाएगा. इसके लिए, आपको उन्हें मैन्युअल तरीके से हटाने की ज़रूरत नहीं है.
जनरेट किए गए लॉन्च कॉन्फ़िगरेशन में कस्टम प्रॉपर्टी जोड़ने के लिए, --vscode-launch-props
फ़्लैग का इस्तेमाल किया जा सकता है. उदाहरण के लिए:
lldbclient.py --setup-forwarding vscode-lldb \
--vscode-launch-props \
'{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
...
Build
नाम का टास्क चलाने के लिए कहेंगी. साथ ही, स्क्रिप्ट से जनरेट किए गए चरणों में, डीबग शुरू करने का नया चरण जोड़ेंगी.
VS Code के दस्तावेज़ और
CodeLLDB एक्सटेंशन के उपयोगकर्ता मैन्युअल में, उपलब्ध प्रॉपर्टी की खास जानकारी देखी जा सकती है.