प्लैटफ़ॉर्म के कोड को डीबग करना

Android Studio for Platform (ASfP) में एक बेहतरीन डीबगर उपलब्ध है. इसकी मदद से ये काम किए जा सकते हैं:

  • डीबग करने के लिए कोई डिवाइस चुनें.
  • अपने Java, Kotlin, C/C++, और Rust कोड में ब्रेकपॉइंट सेट करें.
  • रनटाइम के दौरान वैरिएबल की जांच करें और एक्सप्रेशन का आकलन करें.

डीबगर का इस्तेमाल करने से पहले, आपको अपने बिल्ड को किसी डिवाइस या एम्युलेटर पर फ़्लैश करना होगा.

ऐप्लिकेशन प्रोसेस (Java/Kotlin) को डीबग करना

Java या Kotlin ऐप्लिकेशन प्रोसेस को डीबग करने के लिए:

  1. ASfP में, अपने Java या Kotlin कोड में ब्रेकपॉइंट सेट करें.

  2. मेन्यू में जाकर, Run > Attach Debugger to Android Process को चुनें.

  3. प्रोसेस चुनें डायलॉग में, पक्का करें कि डीबग टाइप को सिर्फ़ Java पर सेट किया गया हो.

  4. सूची से अपना डिवाइस चुनें.

  5. वह आवेदन प्रक्रिया चुनें जिसे डीबग करना है.

  6. ठीक है पर क्लिक करें.

  7. ब्रेकपॉइंट पर पहुंचने के लिए, अपने डिवाइस पर ऐप्लिकेशन के साथ इंटरैक्ट करें.

सिस्टम प्रोसेस (C/C++) को डीबग करना

C या C++ में लिखी गई सिस्टम प्रोसेस को डीबग करने के लिए:

  1. पुष्टि करें कि सिर्फ़ एक डिवाइस या एम्युलेटर चल रहा हो.

  2. टर्मिनल खोलें और अपने AOSP चेकआउट रूट से adb root चलाएं: bash adb root

  1. ASfP में, अपने C/C++ कोड में ब्रेकपॉइंट सेट करें.

  2. मेन्यू में जाकर, Run > Attach Debugger to Android Process को चुनें.

  3. प्रोसेस चुनें डायलॉग में, डीबग टाइप को सिर्फ़ नेटिव या ड्यूल (Java + नेटिव) में बदलें.

  4. सिस्टम प्रोसेस देखने के लिए, सभी प्रोसेस दिखाएं बॉक्स को चुनें.

  5. सूची से अपना डिवाइस चुनें.

  6. वह सिस्टम प्रोसेस चुनें जिसे डीबग करना है. जैसे, surfaceflinger या system_server.

  7. ठीक है पर क्लिक करें.

  8. अपने ब्रेकपॉइंट पर पहुंचने के लिए, डिवाइस के साथ इंटरैक्ट करें.

Rust डीबग करना

ASfP, LLDB के साथ Debug Adapter Protocol (DAP) का इस्तेमाल करके, Rust को डीबग करने की सुविधा देता है. इस सेक्शन में, CodeLLDB को डीबग अडैप्टर सर्वर के तौर पर सेट अप करने का तरीका बताया गया है. साथ ही, होस्ट और Android डिवाइस पर Rust कोड को डीबग करने का तरीका बताया गया है.

CodeLLDB को डीबग अडैप्टर सर्वर के तौर पर सेट अप करना

  1. नया Debug Adapter Protocol रन/डीबग कॉन्फ़िगरेशन बनाएं:

    1. मेन्यू से चलाएं > कॉन्फ़िगरेशन में बदलाव करें को चुनें.
    2. + बटन पर क्लिक करें.
    3. Debug Adapter Protocol चुनें.
  2. सर्वर टैब में, नया सर्वर बनाएं पर क्लिक करें.

  3. नए डायलॉग में, टेंप्लेट चुनें पर क्लिक करें और सूची से CodeLLDB चुनें.

  4. CodeLLDB टेंप्लेट चुनने के बाद, नया सर्वर पहले से तय किए गए कॉन्फ़िगरेशन के साथ जुड़ जाता है.

    1. ट्रेस ड्रॉपडाउन में जाकर, ज़्यादा जानकारी को चुनकर वर्बोस ट्रेसिंग चालू करें.
    2. ऐसा एनवायरमेंट वैरिएबल जोड़ें जो आपके Android सोर्स प्रीबिल्ट में lldb-server का पाथ तय करता हो:
        LLDB_DEBUGSERVER_PATH=REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/runtimes_ndk_cxx/x86_64/lldb-server
        ```
    
    Replace `REPO_ROOT` with the absolute path to your Android source checkout.
    To find `CLANG_VERSION`, run the `get_clang_version.py` script from the root of
    your Android source tree:
    
    ```bash
        ./build/soong/scripts/get_clang_version.py
    
    1. <<insert base directory>> सेक्शन में कोई बदलाव न करें.

होस्ट पर रस्ट बाइनरी को डीबग करना

  1. अपने Debug Adapter Protocol Run/Debug कॉन्फ़िगरेशन में, Configuration टैब खोलें.
  2. डीबग मोड के तौर पर लॉन्च करें को चुनें.
  3. वर्किंग डायरेक्ट्री अपडेट करें और वह बाइनरी फ़ाइल चुनें जिसे आपको डीबग करना है.
  4. कॉन्फ़िगरेशन सेव करने के लिए, ठीक है पर क्लिक करें.
  5. कॉन्फ़िगरेशन के बगल में मौजूद, डीबग करें आइकॉन पर क्लिक करके, डीबग सेशन शुरू करें.

पहली बार इस सुविधा का इस्तेमाल करने पर, CodeLLDB डाउनलोड हो जाता है. आपको कंसोल में DAP ट्रेस दिखने चाहिए. आपके Rust कोड में सेट किए गए ब्रेकपॉइंट, उम्मीद के मुताबिक हिट होने चाहिए.

Android डिवाइस पर Rust बाइनरी को डीबग करना (अटैच मोड)

  1. पीआईडी ढूंढना: उस ऐप्लिकेशन का प्रोसेस आईडी (पीआईडी) ढूंढें जिसे आपको Android डिवाइस पर डीबग करना है.

  2. डिवाइस पर lldb-server शुरू करें: अपने Android सोर्स ट्री चेकआउट के रूट से, lldbclient.py स्क्रिप्ट चलाएं. साथ ही, <PID> को प्रोसेस आईडी से बदलें:

    lldbclient.py --setup-forwarding vscode-lldb -p <PID>
    

    यह स्क्रिप्ट, डिवाइस पर सही lldb-server को पुश करती है, उसे शुरू करती है, पोर्ट फ़ॉरवर्डिंग (होस्ट पोर्ट 5039 से डिवाइस तक) सेट अप करती है, और अगले चरणों के लिए ज़रूरी DAP JSON कॉन्फ़िगरेशन को आउटपुट करती है. इस टर्मिनल को खुला रखें.

  3. होस्ट पर CodeLLDB डीबग अडैप्टर शुरू करें:

    • CodeLLDB एक्सटेंशन डायरेक्ट्री पर जाएं (डिफ़ॉल्ट: ~/.lsp4ij/dap/codelldb/extension/adapter).
    • ज़रूरी एनवायरमेंट वैरिएबल सेट करें और अडैप्टर सर्वर शुरू करें. इसके लिए, सर्वर सेटअप में तय किए गए REPO_ROOT और CLANG_VERSION को बदलें:
        # Sets PYTHONHOME env variable
        export PYTHONHOME=REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/python3
    
        # Tell the dynamic linker where to find python libs
        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/python3/lib
    
        # Starts the CodeLLDB Debugger Adapter server on port 1234
        ./codelldb --liblldb REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/lib/liblldb.so --port 1234
    
  4. ASfP DAP क्लाइंट को कॉन्फ़िगर करना:

    1. ASfP में, Debug Adapter Protocol Run/Debug configuration पर वापस जाएं.
    2. कॉन्फ़िगरेशन टैब चुनें.
    3. डीबग मोड को अटैच करें पर सेट करें.
    4. Address को localhost पर सेट करें.
    5. Port को 1234 पर सेट करें.
    6. lldbclient.py कमांड (दूसरा चरण) से मिले JSON आउटपुट को DAP पैरामीटर (JSON) फ़ील्ड में चिपकाएं.
  5. डीबग सेशन शुरू करने के लिए, डीबग करें पर क्लिक करें.

समस्या का हल

  • अगर आपको गड़बड़ी error: Connection shut down by remote side while waiting for reply to initial handshake packet दिखती है, तो मौजूदा डीबग सेशन बंद करें. इसके बाद, डिवाइस पर lldb-server और होस्ट पर CodeLLDB अडैप्टर को रीस्टार्ट करें.