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

Android Studio for Platform (ASfP), Debug टूल विंडो में मौजूद Attach टैब के आस-पास, कई भाषाओं वाले प्लैटफ़ॉर्म को डीबग करने की सुविधा इंटिग्रेट करता है:

  • किसी फ़िज़िकल डिवाइस या Cuttlefish वर्चुअल डिवाइस पर चल रहे किसी ऐप्लिकेशन या सिस्टम प्रोसेस से Java डिबगर, नेटिव डिबगर (बंडल किया गया LLDB) या दोनों को अटैच करने के लिए, Run > Attach to Android Process (Control+Alt+A) को चुनें.
  • अटैच करने से पहले, लोड की गई हर शेयर की गई लाइब्रेरी (.so) और उसके आठ वर्णों वाले ईएलएफ़ बिल्ड आईडी की जांच करें. इसके लिए, लाइब्रेरी पैनल में जाएं. साथ ही, चेक मार्क वाले आइकॉन से यह पुष्टि करें कि out/target/product/<device>/symbols में मौजूद लोकल डीबग सिंबल मैच कर रहे हैं.
  • टूलबार से डिवाइस से जुड़ी ज़रूरी शर्तें मैनेज करें: सिस्टम प्रोसेस दिखाएं की मदद से फ़िल्टर करें. adb root चलाने के लिए, रूट किया गया डिवाइस पर क्लिक करें. जब यह सुविधा चालू होती है, तब डिवाइस रूट किया गया है दिखता है. userdebug बिल्ड पर JDWP चालू करने के लिए, JDWP चालू करें पर क्लिक करें.
  • शर्त और अपवाद वाले ब्रेकपॉइंट सेट करें, एडिटर में इनलाइन वैरिएबल वैल्यू देखें, ड्रॉप फ़्रेम और स्मार्ट स्टेप इन का इस्तेमाल करें, और रनटाइम पर स्ट्रक्चर्ड C++ और Rust टाइप की जांच करें.

डीबगर का इस्तेमाल करने से पहले, अपना lunch टारगेट बनाएं, ताकि लोकल out/target/product/<device>/symbols/.build-id सिंबल इंडेक्स मौजूद हो. इसके बाद, मिलती-जुलती डिवाइस इमेज को फ़्लैश करें या लॉन्च करें.

Java और ड्यूअल Java और नेटिव डीबगिंग

Java या Kotlin ऐप्लिकेशन, सिस्टम ऐप्लिकेशन (जैसे कि com.android.messaging, Settings या SystemUI) या JNI और C++ या Rust कोड को कॉल करने वाली प्रोसेस को डीबग करने के लिए, यह तरीका अपनाएं:

  1. Java, Kotlin, C, C++ या Rust की सोर्स फ़ाइलों में ब्रेकपॉइंट सेट करें.
  2. Run > Attach to Android Process (Control+Alt+A) को चुनें. ASfP, डीबग टूल विंडो में पिन किया गया अटैच करें टैब खोलता है.
  3. डिवाइस ड्रॉप-डाउन मेन्यू से, अपना टारगेट डिवाइस चुनें. अगर userdebug बिल्ड पर JDWP चालू नहीं है, तो JDWP चालू करें पर क्लिक करें. ASfP, persist.debug.dalvik.vm.jdwp.enabled=1 को सेट करता है और डिवाइस को रीबूट करता है. चालू होने पर, बटन JDWP चालू है दिखाता है. इस पर राइट-क्लिक करने पर, JDWP बंद करें कार्रवाई दिखती है.
  4. टेबल से टारगेट प्रोसेस चुनें. Java और ART प्रोसेस में, कॉफ़ी कप का आइकॉन दिखता है.
  5. अटैच करें टैब में सबसे नीचे, Java डिबगर, नेटिव डिबगर या दोनों को चुनें. दोनों को चुनने पर, डीबग टूल विंडो में लिंक किए गए दो टैब खुलते हैं: <process> (<pid>) बिल्ट-इन LLDB के लिए और <process> (<pid>)-jdwp Java के लिए. इन दोनों सेशन की लाइफ़साइकल एक-दूसरे से जुड़ी होती हैं. इसलिए, किसी भी सेशन को रोकने पर, दोनों सेशन रुक जाते हैं.
  6. अटैच करें पर क्लिक करें. इसके बाद, अपने डिवाइस पर मौजूद ऐप्लिकेशन के साथ इंटरैक्ट करके, ब्रेकपॉइंट पर पहुंचें.

अटैच टैब के साथ लिंक किए गए, Java और नेटिव डीबगिंग के दो टैब

सिस्टम प्रोसेस (C और C++) डीबग करना और सिंबल की पुष्टि करना

सिस्टम डेमॉन, HAL या सिस्टम सेवाओं (जैसे कि android.hardware.bluetooth-service.cuttlefish, surfaceflinger या audioserver) को डीबग करने के लिए, यह तरीका अपनाएं:

  1. Run > Attach to Android Process (Control+Alt+A) खोलें. अगर टूलबार में रूट किया गया डिवाइस दिखता है, तो उस पर क्लिक करें. इससे ASfP, adb root को चलाएगा और डिवाइस रूट किया गया है दिखाएगा.
  2. सबसे ऊपर मौजूद टूलबार में, सिस्टम प्रोसेस दिखाएं को चुनें. इसके बाद, अपनी टारगेट प्रोसेस के लिए फ़िल्टर करें.
  3. लाइब्रेरी पैनल में लोकल डीबग सिंबल की पुष्टि करें: किसी प्रोसेस को चुनने पर, लाइब्रेरी टेबल में, प्रोसेस में लोड की गई हर ईएलएफ़ शेयर की गई लाइब्रेरी (.so) और उसके ईएलएफ़ बिल्ड आईडी के पहले आठ हेक्साडेसिमल वर्ण दिखते हैं. ASfP, हर बिल्ड आईडी की तुलना out/target/product/<device>/symbols से करता है (APEX में मौजूद लाइब्रेरी को हल करने के लिए symbols/.build-id ज़रूरी है):
    • पुष्टि की गई लाइब्रेरी के साथ सही का निशान दिखता है. किसी भी हल की गई लाइन पर कर्सर ले जाकर, उसके पूरे लोकल .debug सिंबल पाथ की झलक देखें.
    • जिन लाइब्रेरी की समस्याएं हल नहीं हुई हैं और जिनके लोकल सिंबल मैच नहीं हो रहे हैं उनके लिए, चेतावनी वाला आइकॉन दिखता है.
  4. नॉन-Java प्रोसेस का पता लगाना: जब C++ या Rust प्रोसेस (षट्भुज C आइकॉन से मार्क की गई) को चुना जाता है, तो ASfP, Java डीबगर को छिपा देता है. साथ ही, Java डीबग करने की सुविधा उपलब्ध नहीं है, यह Java प्रोसेस नहीं है. मैसेज दिखाता है. हालांकि, नेटिव डीबगर को चालू रखता है.
  5. अपनी C, C++ या Rust सोर्स फ़ाइलों में ब्रेकपॉइंट सेट करें. इसके बाद, अटैच करें पर क्लिक करें और डिवाइस पर कोड पाथ ट्रिगर करें.

लाइब्रेरी टेबल, ईएलएफ़ बिल्ड आईडी, और लोकल सिंबल चेक मार्क दिखाने वाला टैब अटैच करें

Rust कोड को डीबग करना

ASfP, Rust प्लैटफ़ॉर्म कोड को डीबग करने के लिए, C और C++ के लिए इस्तेमाल किए जाने वाले बिल्ट-इन LLDB डीबगर का इस्तेमाल करता है. इसके लिए, किसी बाहरी अडैप्टर या मैन्युअल सर्वर सेटअप की ज़रूरत नहीं होती: ASfP, अपने बंडल किए गए टूल चेन से lldb-dap का इस्तेमाल करता है. साथ ही, आपके AOSP प्रीबिल्ट से Rust के प्रीटी-प्रिंटर को अपने-आप लोड करता है. इससे String, Vec, HashMap, और Option जैसे स्टैंडर्ड टाइप, वैरिएबल पैनल में स्ट्रक्चर्ड वैल्यू दिखाते हैं.

किसी डिवाइस पर चल रही Rust प्रोसेस से अटैच करना

सिस्टम प्रोसेस (C और C++) डीबग करना में दिया गया तरीका अपनाएं: Run > Attach to Android Process खोलें, पुष्टि करें कि Device is rooted और लोकल सिंबल, Libraries पैनल में सही का निशान दिखाते हैं, Native debugger को चेक किया गया है, और Attach पर क्लिक करें. Rust और C या C++ के स्टैक फ़्रेम, एक ही डीबग सेशन में एक साथ दिखते हैं.

rust_test या rust_test_host मॉड्यूल को डीबग करना

  1. Android.bp या rust_test_host टारगेट का एलान करने वाली rust_test फ़ाइल खोलें. इसके बाद, मॉड्यूल टाइप के बगल में मौजूद गटर में, चलाएं आइकॉन पर क्लिक करें.
  2. '<ModuleName>' को डीबग करें को चुनें. ASfP, टारगेट बनाता है. साथ ही, आपकी होस्ट मशीन या कनेक्ट किए गए डिवाइस पर LLDB के तहत टेस्ट बाइनरी लॉन्च करता है. इसके बाद, आपके रस्ट ब्रेकपॉइंट पर रुक जाता है.
  3. किसी एक टेस्ट फ़ंक्शन को डीबग करने या LLDB स्टार्टअप कमांड को पसंद के मुताबिक बनाने के लिए, Run > Edit Configurations खोलें. इसके बाद, जनरेट किया गया Soong Test कॉन्फ़िगरेशन चुनें और Method सेट करें या Debugger विकल्पों को बड़ा करें. Soong Test के कॉन्फ़िगरेशन के विकल्पों के बारे में ज़्यादा जानकारी के लिए, atest की मदद से टेस्ट प्लैटफ़ॉर्म कोड देखें.

ASfP में स्ट्रक्चर्ड वैरिएबल विज़ुअलाइज़र की मदद से, Rust प्लैटफ़ॉर्म कोड को डीबग करना