अपना ऐप्लिकेशन डीबग करना

Android Studio में एक डिबगर होता है. इसकी मदद से, ये काम किए जा सकते हैं:

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

इस पेज पर, डीबगर के बुनियादी कामों के लिए निर्देश दिए गए हैं. ज़्यादा जानकारी के लिए, IntelliJ IDEA डीबगिंग दस्तावेज़ भी देखें.

डीबग करने की सुविधा चालू करना

डीबग करने से पहले, ये काम करें:

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

ऐसे बिल्ड वैरिएंट का इस्तेमाल करें जिसमें बिल्ड कॉन्फ़िगरेशन में debuggable true (Kotlin स्क्रिप्ट में isDebuggable = true) शामिल हो.

आम तौर पर, हर Android Studio प्रोजेक्ट में शामिल डिफ़ॉल्ट "डीबग" वैरिएंट को चुना जा सकता है. भले ही, वह build.gradle फ़ाइल में न दिखे. हालांकि, अगर आपको ऐसे नए बिल्ड टाइप तय करने हैं जिन्हें डीबग किया जा सके, तो आपको बिल्ड टाइप में debuggable true जोड़ना होगा:

Groovy

android {
    buildTypes {
        customDebugType {
            debuggable true
            ...
        }
    }
}

Kotlin

android {
    buildTypes {
        create("customDebugType") {
            isDebuggable = true
            ...
        }
    }
}

यह प्रॉपर्टी, C/C++ कोड वाले मॉड्यूल पर भी लागू होती है.

ध्यान दें: jniDebuggable प्रॉपर्टी का इस्तेमाल अब नहीं किया जाता.

अगर आपका ऐप्लिकेशन किसी ऐसे लाइब्रेरी मॉड्यूल पर निर्भर करता है जिसे आपको डीबग भी करना है, तो उस लाइब्रेरी को भी debuggable true के साथ पैकेज किया जाना चाहिए, ताकि वह अपने डीबग सिंबल को बनाए रखे. यह पक्का करने के लिए कि आपके ऐप्लिकेशन प्रोजेक्ट के डीबग करने लायक वैरिएंट को लाइब्रेरी मॉड्यूल का डीबग करने लायक वैरिएंट मिले, अपनी लाइब्रेरी के नॉन-डिफ़ॉल्ट वर्शन पब्लिश करें.

डीबग करना शुरू करें

डीबग सेशन शुरू करने के लिए, यह तरीका अपनाएं:

  1. अपने ऐप्लिकेशन के कोड में ब्रेक पॉइंट सेट करें.
  2. टूलबार में, टारगेट डिवाइस मेन्यू से कोई डिवाइस चुनें, ताकि उस पर अपने ऐप्लिकेशन को डीबग किया जा सके.
    टारगेट डिवाइस का मेन्यू.
    पहली इमेज. टारगेट डिवाइस का मेन्यू.

    अगर आपने कोई डिवाइस कॉन्फ़िगर नहीं किया है, तो आपको Android Emulator का इस्तेमाल करने के लिए, यूएसबी की मदद से कोई डिवाइस कनेक्ट करना, वाई-फ़ाई की मदद से कोई डिवाइस कनेक्ट करना या एवीडी बनाना होगा.

  3. टूलबार में, डीबग करें पर क्लिक करें.

    अगर आपका ऐप्लिकेशन डिवाइस पर पहले से चल रहा है, तो आपको एक डायलॉग बॉक्स दिखेगा. इसमें आपसे पूछा जाएगा कि क्या आपको रन मोड से डीबग मोड पर स्विच करना है. डीबग करने की प्रोसेस शुरू करने के लिए, डिवाइस को रीस्टार्ट करना होगा. ऐप्लिकेशन के उसी इंस्टेंस को चालू रखने के लिए, डीबग रद्द करें पर क्लिक करें. इसके बजाय, डीबगर को चालू ऐप्लिकेशन से अटैच करें. ऐसा न करने पर, Android Studio एक APK बनाता है, उसे डीबग पासकोड से साइन करता है, उसे आपके चुने हुए डिवाइस पर इंस्टॉल करता है, और उसे चलाता है.

    अगर आपने अपने प्रोजेक्ट में C और C++ कोड जोड़ा है, तो Android Studio आपके नेटिव कोड को डीबग करने के लिए, डीबग विंडो में LLDB डीबगर भी चलाता है.

  4. अगर डीबग विंडो नहीं खुली है, तो View > Tool Windows > Debug को चुनें या टूल विंडो बार में डीबग करें पर क्लिक करें.

चल रहे किसी ऐप्लिकेशन में डीबगर अटैच करना

अगर आपके डिवाइस पर ऐप्लिकेशन पहले से चल रहा है, तो उसे रीस्टार्ट किए बिना डीबग करना शुरू किया जा सकता है. इसके लिए, यह तरीका अपनाएं:

  1. Attach debugger to Android process पर क्लिक करें.
  2. Choose Process डायलॉग में, वह प्रोसेस चुनें जिससे आपको डीबगर को अटैच करना है.
    1. अगर एम्युलेटर या रूट किए गए डिवाइस का इस्तेमाल किया जा रहा है, तो सभी प्रोसेस देखने के लिए, सभी प्रोसेस दिखाएं को चुनें. रूट किए गए डिवाइस पर, यह डिवाइस पर चल रही सभी प्रोसेस दिखाएगा. हालांकि, रूट नहीं किए गए डिवाइस पर, यह सिर्फ़ डीबग करने लायक प्रोसेस दिखाएगा.
    2. Use Android Debugger Settings from मेन्यू में जाकर, कोई मौजूदा रन/डीबग कॉन्फ़िगरेशन चुना जा सकता है. C और C++ कोड के लिए, इससे आपको मौजूदा कॉन्फ़िगरेशन में LLDB स्टार्टअप कमांड, LLDB पोस्ट-अटैच कमांड, और सिंबल डायरेक्ट्री का फिर से इस्तेमाल करने की सुविधा मिलती है.
    3. अगर आपके पास कोई मौजूदा रन/डीबग कॉन्फ़िगरेशन नहीं है, तो नया बनाएं को चुनें. इस विकल्प को चुनने पर, डीबग टाइप मेन्यू चालू हो जाता है. यहां कोई दूसरा डीबग टाइप चुना जा सकता है. Android Studio, डिफ़ॉल्ट रूप से 'अपने-आप पता लगाएं' डीबग टाइप का इस्तेमाल करता है. इससे आपके लिए सबसे सही डीबगर विकल्प चुना जाता है. यह इस बात पर निर्भर करता है कि आपके प्रोजेक्ट में Java या C/C++ कोड शामिल है या नहीं.
  3. ठीक है पर क्लिक करें.

    इसके बाद, आपको डीबग विंडो दिखेगी.

डिवाइस एक्सप्लोरर (View > टूल विंडो > Device Explorer) में Processes टैब में भी, डीबग करने लायक प्रोसेस की सूची होती है. यहां से किसी प्रोसेस को चुना जा सकता है और उसे बंद किया जा सकता है , ज़बरदस्ती रोका जा सकता है , या डीबगर को किसी प्रोसेस से अटैच किया जा सकता है .

डीबग विंडो

दूसरी इमेज.डीबग विंडो.

डीबग विंडो को इन सेक्शन में बांटा गया है

  1. एक्ज़ीक्यूशन और नेविगेशन टूलबार ब्रेकपॉइंट के साथ काम करना देखें
  2. थ्रेड सिलेक्टर
  3. आकलन और वॉच एक्सप्रेशन एंट्री. वैरिएबल की जांच करें देखें.
  4. स्टैक डिसप्ले
  5. वैरिएबल पैनल. वैरिएबल की जांच करना देखें.

ध्यान दें: Android Studio का डिबगर और गार्बेज कलेक्टर, एक-दूसरे से पूरी तरह से इंटिग्रेट नहीं होते. Android वर्चुअल मशीन यह पक्का करती है कि डीबगर को जिस ऑब्जेक्ट की जानकारी है उसे तब तक गार्बेज कलेक्शन में न डाला जाए, जब तक डीबगर डिसकनेक्ट न हो जाए. इससे डीबगर के कनेक्ट होने पर, ऑब्जेक्ट इकट्ठा हो सकते हैं. उदाहरण के लिए, अगर डीबगर को कोई थ्रेड चलता हुआ दिखता है, तो उससे जुड़ा Thread ऑब्जेक्ट तब तक गार्बेज कलेक्शन में नहीं जाता, जब तक डीबगर डिसकनेक्ट नहीं हो जाता. भले ही, थ्रेड खत्म हो गया हो.

डीबगर का टाइप बदलना

Java/Kotlin कोड और C/C++ कोड को डीबग करने के लिए, अलग-अलग डीबगर टूल की ज़रूरत होती है. इसलिए, Android Studio डीबगर आपको यह चुनने की सुविधा देता है कि किस तरह का डीबगर इस्तेमाल करना है. डिफ़ॉल्ट रूप से, Android Studio यह तय करता है कि किस डिबगर का इस्तेमाल करना है. इसके लिए, वह अपने-आप पता लगाएं डिबगर टाइप का इस्तेमाल करके, आपके प्रोजेक्ट में मौजूद भाषाओं का पता लगाता है.

डीबग कॉन्फ़िगरेशन में डीबगर को मैन्युअल तरीके से चुनने के लिए, Run > Edit Configurations पर क्लिक करें. Run > Attach debugger to Android process पर क्लिक करने पर दिखने वाले डायलॉग में भी डीबगर को चुना जा सकता है.

डीबग करने के लिए ये टाइप उपलब्ध हैं:

अपने-आप पता लगाने की सुविधा
अगर आपको Android Studio से, डीबग किए जा रहे कोड के लिए सबसे सही विकल्प अपने-आप चुनने की सुविधा चाहिए, तो डीबग करने का यह टाइप चुनें. उदाहरण के लिए, अगर आपके प्रोजेक्ट में कोई C या C++ कोड है, तो Android Studio अपने-आप ड्यूअल डीबग टाइप का इस्तेमाल करता है. ऐसा न करने पर, Android Studio सिर्फ़ Java डीबग टाइप का इस्तेमाल करता है.
सिर्फ़ Java
अगर आपको सिर्फ़ Java या Kotlin में लिखे गए कोड को डीबग करना है, तो डीबग करने का यह टाइप चुनें. सिर्फ़ Java के लिए उपलब्ध डीबगर, आपके नेटिव कोड में सेट किए गए किसी भी ब्रेकपॉइंट या वॉच को अनदेखा कर देता है.
सिर्फ़ नेटिव (सिर्फ़ C/C++ कोड के साथ उपलब्ध)
अगर आपको अपने कोड को डीबग करने के लिए सिर्फ़ LLDB का इस्तेमाल करना है, तो डीबग करने का यह टाइप चुनें. डीबग करने के इस तरीके का इस्तेमाल करने पर, Java डीबगर सेशन व्यू उपलब्ध नहीं होता. डिफ़ॉल्ट रूप से, LLDB सिर्फ़ आपके नेटिव कोड की जांच करता है और आपके Java कोड में मौजूद ब्रेकपॉइंट को अनदेखा करता है. अगर आपको अपने Java कोड को भी डीबग करना है, तो अपने-आप पता लगाने वाले या ड्यूअल डीबग टाइप पर स्विच करें.

नेटिव डीबगिंग सिर्फ़ उन डिवाइसों पर काम करती है जो इन ज़रूरी शर्तों को पूरा करते हैं:

  • डिवाइस पर run-as का इस्तेमाल किया जा सकता है.

    यह देखने के लिए कि डिवाइस में run-as काम करता है या नहीं, अपने डिवाइस से कनेक्ट किए गए ADB शेल पर यह कमांड चलाएं:

    run-as your-package-name pwd
    

    your-package-name को अपने ऐप्लिकेशन के पैकेज के नाम से बदलें. अगर डिवाइस में run-as की सुविधा है, तो कमांड बिना किसी गड़बड़ी के काम करना चाहिए.

  • डिवाइस में ptrace चालू हो.

    ptrace चालू है या नहीं, यह देखने के लिए अपने डिवाइस से कनेक्ट किए गए ADB शेल पर यह कमांड चलाएं:

    sysctl kernel.yama.ptrace_scope
    

    अगर ptrace चालू है, तो कमांड 0 वैल्यू या unknown key गड़बड़ी को प्रिंट करेगा. अगर ptrace चालू नहीं है, तो यह 0 के अलावा कोई अन्य वैल्यू प्रिंट करेगा.

Dual (Java + Native) - यह सिर्फ़ C/C++ कोड के साथ उपलब्ध है
अगर आपको Java और नेटिव कोड, दोनों को डीबग करने के बीच स्विच करना है, तो डीबग करने का यह टाइप चुनें. Android Studio, आपके ऐप्लिकेशन की प्रोसेस में Java डीबगर और LLDB, दोनों को अटैच करता है. इससे, ऐप्लिकेशन को रीस्टार्ट किए बिना या डीबग कॉन्फ़िगरेशन में बदलाव किए बिना, Java और नेटिव कोड, दोनों में ब्रेकपॉइंट की जांच की जा सकती है.

इमेज 2 में, डीबग विंडो के टाइटल की दाईं ओर मौजूद दो टैब देखें. ऐप्लिकेशन में Java और C++, दोनों कोड हैं. इसलिए, एक टैब नेटिव कोड को डीबग करने के लिए है और दूसरा Java कोड को डीबग करने के लिए है. इसे -java से दिखाया गया है.

तीसरी इमेज. नेटिव कोड को डीबग करने के लिए टैब और Java कोड को डीबग करने के लिए टैब.

ध्यान दें: कंपाइलर से ऑप्टिमाइज़ किए गए नेटिव कोड को डीबग करते समय, आपको यह चेतावनी वाला मैसेज मिल सकता है:
This function was compiled with optimizations enabled. Some debugger features may not be available. ऑप्टिमाइज़ेशन फ़्लैग का इस्तेमाल करने पर, कंपाइलर आपके कंपाइल किए गए कोड में बदलाव करता है, ताकि वह ज़्यादा बेहतर तरीके से काम कर सके. इसकी वजह से, डीबगर अनचाही या गलत जानकारी दे सकता है. ऐसा इसलिए होता है, क्योंकि डीबगर के लिए, ऑप्टिमाइज़ किए गए कंपाइल किए गए कोड को वापस ओरिजनल सोर्स कोड पर मैप करना मुश्किल होता है. इस वजह से, आपको अपने नेटिव कोड को डीबग करते समय, कंपाइलर ऑप्टिमाइज़ेशन की सुविधा बंद कर देनी चाहिए.

सिस्टम लॉग का इस्तेमाल करना

सिस्टम लॉग में, ऐप्लिकेशन को डीबग करते समय सिस्टम मैसेज दिखते हैं. इन मैसेज में, डिवाइस पर चल रहे ऐप्लिकेशन की जानकारी शामिल होती है. अगर आपको अपने ऐप्लिकेशन को डीबग करने के लिए सिस्टम लॉग का इस्तेमाल करना है, तो पक्का करें कि आपका कोड, लॉग मैसेज लिखता हो और अपवादों के लिए स्टैक ट्रेस को प्रिंट करता हो. ऐसा तब होना चाहिए, जब आपका ऐप्लिकेशन डेवलपमेंट फ़ेज़ में हो.

अपने कोड में लॉग मैसेज लिखना

अपने कोड में लॉग मैसेज लिखने के लिए, Log क्लास का इस्तेमाल करें. लॉग मैसेज से आपको एक्ज़ीक्यूशन फ़्लो को समझने में मदद मिलती है. इसके लिए, ऐप्लिकेशन के साथ इंटरैक्ट करने के दौरान, सिस्टम डीबग आउटपुट को इकट्ठा किया जाता है. लॉग मैसेज से आपको यह भी पता चल सकता है कि आपके ऐप्लिकेशन का कौनसा हिस्सा काम नहीं कर रहा है. लॉग इन करने के बारे में ज़्यादा जानने के लिए, Logcat की मदद से लॉग लिखना और देखना लेख पढ़ें.

यहां दिए गए उदाहरण में, लॉग मैसेज जोड़ने का तरीका बताया गया है. इससे यह पता चलता है कि गतिविधि शुरू होने पर, पिछली स्थिति की जानकारी उपलब्ध है या नहीं:

Kotlin

import android.util.Log
...
class MyActivity : Activity() {
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        if (savedInstanceState != null) {
            Log.d(TAG, "onCreate() Restoring previous state")
            /* restore state */
        } else {
            Log.d(TAG, "onCreate() No saved state available")
            /* initialize app */
        }
        ...
    }
  ...
  companion object {
    private val TAG: String = MyActivity::class.java.simpleName
    ...
  }
}

Java

import android.util.Log;
...
public class MyActivity extends Activity {
    private static final String TAG = MyActivity.class.getSimpleName();
    ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
       ...
       if (savedInstanceState != null) {
            Log.d(TAG, "onCreate() Restoring previous state");
            /* restore state */
        } else {
            Log.d(TAG, "onCreate() No saved state available");
            /* initialize app */
        }
        ...
    }
}

डेवलपमेंट के दौरान, आपका कोड अपवादों को भी पकड़ सकता है और सिस्टम लॉग में स्टैक ट्रेस लिख सकता है:

Kotlin

fun someOtherMethod() {
    try {
        ...
    } catch (e : SomeException) {
        Log.d(TAG, "someOtherMethod()", e)
    }
}

Java

void someOtherMethod() {
    try {
        ...
    } catch (SomeException e) {
        Log.d(TAG, "someOtherMethod()", e);
    }
}

ध्यान दें: जब आप अपना ऐप्लिकेशन पब्लिश करने के लिए तैयार हों, तो अपने कोड से डीबग लॉग मैसेज और स्टैक ट्रेस प्रिंट कॉल हटा दें. ऐसा करने के लिए, DEBUG फ़्लैग सेट करें और डीबग लॉग मैसेज को कंडिशनल स्टेटमेंट में रखें.

सिस्टम लॉग देखना

Logcat विंडो में, डीबग और अन्य सिस्टम मैसेज देखे और फ़िल्टर किए जा सकते हैं. जैसा कि इमेज 4 में दिखाया गया है. उदाहरण के लिए, आपको ऐसे मैसेज दिख सकते हैं जो गार्बेज कलेक्शन होने पर दिखते हैं या ऐसे मैसेज जो Log क्लास की मदद से, आपके ऐप्लिकेशन में जोड़े जाते हैं.

Logcat का इस्तेमाल करने के लिए, डीबग करना शुरू करें और Logcat टैब को चुनें.

चौथी इमेज. फ़िल्टर सेटिंग वाली Logcat विंडो.

Logcat और इसके फ़िल्टर करने के विकल्पों के बारे में जानने के लिए, Logcat की मदद से लॉग लिखना और देखना लेख पढ़ें.

ब्रेकपॉइंट के साथ काम करना

Android Studio में ब्रेकपॉइंट की सुविधा काम करती है. इससे डीबग करने की अलग-अलग कार्रवाइयां ट्रिगर होती हैं. ब्रेकपॉइंट कई तरह के होते हैं:

लाइन ब्रेकपॉइंट
सबसे आम टाइप, लाइन ब्रेकपॉइंट है. यह कोड की किसी तय लाइन पर, आपके ऐप्लिकेशन के एक्ज़ीक्यूशन को रोक देता है. स्क्रिप्ट के रुकने पर, वैरिएबल की जांच की जा सकती है और एक्सप्रेशन का आकलन किया जा सकता है. इसके बाद, रनटाइम से जुड़ी गड़बड़ियों की वजहों का पता लगाने के लिए, स्क्रिप्ट को लाइन-दर-लाइन लागू करना जारी रखा जा सकता है.
मेथड ब्रेकपॉइंट
मेथड ब्रेकपॉइंट, आपके ऐप्लिकेशन के कोड को किसी खास मेथड में जाने या उससे बाहर निकलने पर रोक देता है. स्क्रिप्ट को रोकने के बाद, वैरिएबल की जांच की जा सकती है और एक्सप्रेशन का आकलन किया जा सकता है. इसके बाद, रनटाइम से जुड़ी गड़बड़ियों की वजहों का पता लगाने के लिए, स्क्रिप्ट को लाइन-बाय-लाइन लागू करना जारी रखा जा सकता है. किसी कंपोज़ेबल फ़ंक्शन पर ब्रेकपॉइंट सेट करने पर, डीबगर कंपोज़ेबल के पैरामीटर और उनकी स्थिति की सूची दिखाता है. इससे यह पता लगाने में मदद मिलती है कि किन बदलावों की वजह से, फिर से कंपोज़िशन हुआ होगा.
फ़ील्ड ब्रेकपॉइंट
फ़ील्ड ब्रेकपॉइंट, आपके ऐप्लिकेशन के कोड को तब रोक देता है, जब वह किसी खास फ़ील्ड से डेटा पढ़ता है या उसमें डेटा लिखता है.
अपवाद ब्रेकपॉइंट
अपवाद ब्रेकपॉइंट, अपवाद मिलने पर आपके ऐप्लिकेशन के एक्ज़ीक्यूशन को रोक देता है.

शर्तों के साथ ब्रेकपॉइंट सेट किए जा सकते हैं. ये ब्रेकपॉइंट, कोड को सिर्फ़ तब रोकेंगे, जब कुछ खास शर्तें पूरी होंगी. लॉगिंग ब्रेकपॉइंट भी सेट किए जा सकते हैं. ये ब्रेकपॉइंट, प्रोग्राम को रोके बिना Logcat में लॉग लिखते हैं. इससे आपके कोड में लॉग स्टेटमेंट की भरमार होने से बचा जा सकता है.

लाइन ब्रेकपॉइंट जोड़ने के लिए, यह तरीका अपनाएं:

  1. कोड की वह लाइन ढूंढें जहां आपको कोड को एक्ज़ीक्यूट होने से रोकना है.
  2. कोड की उस लाइन के साथ बाईं ओर मौजूद गटर पर क्लिक करें या लाइन पर कैरेट रखें और Control+F8 (macOS पर, Command+F8) दबाएं.
  3. अगर आपका ऐप्लिकेशन पहले से चल रहा है, तो Android प्रोसेस में डीबगर अटैच करें पर क्लिक करें. अगर आपको डीबग करना है, तो डीबग करें पर क्लिक करें.

ब्रेकपॉइंट सेट करने पर, लाइन के बगल में एक लाल बिंदु दिखता है. जैसा कि पांचवीं इमेज में दिखाया गया है.

पांचवीं इमेज. ब्रेकपॉइंट सेट करने पर, लाइन के बगल में लाल रंग का बिंदु दिखता है.

जब आपका कोड एक्ज़ीक्यूशन ब्रेकपॉइंट पर पहुंचता है, तो Android Studio आपके ऐप्लिकेशन का एक्ज़ीक्यूशन रोक देता है.

ऐप्लिकेशन की स्थिति की पहचान करने के लिए, डीबगर टैब में मौजूद टूल का इस्तेमाल करें:

  • किसी वैरिएबल के ऑब्जेक्ट ट्री की जांच करने के लिए, वैरिएबल व्यू में जाकर उसे बड़ा करें. अगर वैरिएबल व्यू नहीं दिख रहा है, तो लेआउट सेटिंग पर क्लिक करें और पक्का करें कि वैरिएबल को चुना गया हो.

  • किसी तरीके को डाले बिना कोड की अगली लाइन पर जाने के लिए, स्टेप ओवर पर क्लिक करें.

  • किसी मेथड कॉल में पहली लाइन पर जाने के लिए, स्टेप इन पर क्लिक करें.

  • मौजूदा तरीके से बाहर अगली लाइन पर जाने के लिए, स्टेप आउट पर क्लिक करें.

  • ऐप्लिकेशन को सामान्य रूप से चलाना जारी रखने के लिए, प्रोग्राम फिर से शुरू करें पर क्लिक करें.

अगर आपका प्रोजेक्ट किसी नेटिव कोड का इस्तेमाल करता है, तो डिफ़ॉल्ट रूप से, अपने-आप पता लगाने वाला डीबग टाइप, Java डीबगर और LLDB, दोनों को आपके ऐप्लिकेशन से दो अलग-अलग प्रोसेस के तौर पर अटैच करता है. अपने ऐप्लिकेशन को रीस्टार्ट किए बिना या सेटिंग बदले बिना, Java और C/C++ ब्रेकपॉइंट की जांच करने के बीच स्विच किया जा सकता है.

ध्यान दें: Android Studio आपके C या C++ कोड में ब्रेकपॉइंट का पता लगा सके, इसके लिए आपको डीबग करने के ऐसे टाइप का इस्तेमाल करना होगा जो LLDB के साथ काम करता हो. जैसे, अपने-आप पता लगाने की सुविधा, नेटिव या ड्यूअल. डीबग कॉन्फ़िगरेशन में बदलाव करके, Android Studio में इस्तेमाल किए जाने वाले डीबग टाइप को बदला जा सकता है. डीबग करने के अलग-अलग टाइप के बारे में ज़्यादा जानने के लिए, डीबग करने के अन्य टाइप इस्तेमाल करने के बारे में सेक्शन पढ़ें.

जब Android Studio आपके ऐप्लिकेशन को टारगेट डिवाइस पर डिप्लॉय करता है, तो डीबग विंडो खुलती है. इसमें हर डीबगर प्रोसेस के लिए एक टैब या डीबग सेशन व्यू होता है. इसे इमेज 6 में दिखाया गया है.

छठी इमेज. LLDB का इस्तेमाल करके नेटिव कोड को डीबग करना.
  1. जब एलएलडीबी डिबगर को आपके C/C++ कोड में कोई ब्रेकपॉइंट मिलता है, तो Android Studio <your-module> टैब पर स्विच हो जाता है. फ़्रेम, वैरिएबल, और वॉच पैनल भी उपलब्ध हैं. ये ठीक उसी तरह काम करते हैं जैसे Java कोड को डीबग करते समय करते हैं.

    हालांकि, LLDB सेशन व्यू में थ्रेड पैनल उपलब्ध नहीं है, लेकिन फ़्रेम पैनल में मौजूद सूची का इस्तेमाल करके, अपने ऐप्लिकेशन की प्रोसेस को ऐक्सेस किया जा सकता है. विंडो फ़्रेम को डीबग करने और वैरिएबल की जांच करने के तरीके के बारे में जानकारी देने वाले सेक्शन में, इन पैनल के बारे में ज़्यादा जानें.

    ध्यान दें: नेटिव कोड में ब्रेकपॉइंट की जांच करते समय, Android सिस्टम उस वर्चुअल मशीन को निलंबित कर देता है जो आपके ऐप्लिकेशन के Java बाइट कोड को चलाती है. इसका मतलब है कि नेटिव कोड में ब्रेकपॉइंट की जांच करते समय, Java डीबगर के साथ इंटरैक्ट नहीं किया जा सकता या Java डीबगर सेशन से कोई भी जानकारी वापस नहीं पाई जा सकती.

  2. जब Java डीबगर को आपके Java या Kotlin कोड में कोई ब्रेकपॉइंट मिलता है, तो Android Studio, <your-module>-java टैब पर स्विच कर जाता है.
  3. LLDB की मदद से डीबग करते समय, LLDB सेशन व्यू में LLDB टर्मिनल का इस्तेमाल करके, LLDB को कमांड-लाइन के विकल्प पास किए जा सकते हैं. अगर आपके पास कुछ ऐसे निर्देश हैं जिन्हें आपको LLDB से हर बार अपने ऐप्लिकेशन को डीबग करना शुरू करने पर लागू कराना है, तो उन निर्देशों को अपने डीबग कॉन्फ़िगरेशन में जोड़ें. ऐसा डीबगर के आपके ऐप्लिकेशन की प्रोसेस से जुड़ने से ठीक पहले या ठीक बाद किया जा सकता है.

C/C++ कोड को डीबग करते समय, खास तरह के ब्रेकपॉइंट भी सेट किए जा सकते हैं. इन्हें वॉचपॉइंट कहा जाता है. जब आपका ऐप्लिकेशन, मेमोरी के किसी खास ब्लॉक के साथ इंटरैक्ट करता है, तो ये वॉचपॉइंट आपके ऐप्लिकेशन की प्रोसेस को रोक सकते हैं. ज़्यादा जानने के लिए, वॉचपॉइंट जोड़ने के तरीके के बारे में सेक्शन पढ़ें.

ब्रेकपॉइंट देखना और कॉन्फ़िगर करना

सभी ब्रेकपॉइंट देखने और ब्रेकपॉइंट की सेटिंग कॉन्फ़िगर करने के लिए, डीबग विंडो में ब्रेकपॉइंट देखें पर क्लिक करें. इसके बाद, आपको ब्रेकपॉइंट विंडो दिखेगी, जैसा कि इमेज 7 में दिखाया गया है.

सातवीं इमेज. ब्रेकपॉइंट विंडो में, सभी मौजूदा ब्रेकपॉइंट की सूची होती है. साथ ही, इसमें हर ब्रेकपॉइंट के लिए व्यवहार की सेटिंग शामिल होती हैं.

ब्रेकपॉइंट विंडो की मदद से, पैनल में मौजूद सूची से हर ब्रेकपॉइंट को चालू या बंद किया जा सकता है. अगर कोई ब्रेकपॉइंट बंद है, तो Android Studio उस ब्रेकपॉइंट पर पहुंचने पर आपके ऐप्लिकेशन को नहीं रोकता.

सूची से कोई ब्रेकपॉइंट चुनें और उसकी सेटिंग कॉन्फ़िगर करें. किसी ब्रेकपॉइंट को शुरुआत में बंद रखने के लिए कॉन्फ़िगर किया जा सकता है. साथ ही, सिस्टम को इस तरह से सेट किया जा सकता है कि वह किसी दूसरे ब्रेकपॉइंट के हिट होने के बाद, पहले वाले ब्रेकपॉइंट को चालू कर दे. यह भी कॉन्फ़िगर किया जा सकता है कि ब्रेकपॉइंट के हिट होने के बाद, उसे बंद किया जाना चाहिए या नहीं. किसी अपवाद के लिए ब्रेकपॉइंट सेट करने के लिए, ब्रेकपॉइंट की सूची में अपवाद ब्रेकपॉइंट चुनें.

सभी ब्रेकपॉइंट को कुछ समय के लिए बंद करने के लिए, डीबग विंडो में ब्रेकपॉइंट म्यूट करें पर क्लिक करें. फिर से चालू करने के लिए, दोबारा क्लिक करें.

डीबग विंडो फ़्रेम

डीबगर विंडो में, फ़्रेम पैनल की मदद से उस स्टैक फ़्रेम की जांच की जा सकती है जिसकी वजह से मौजूदा ब्रेकपॉइंट हिट हुआ. इससे आपको स्टैक फ़्रेम को नेविगेट करने और उसकी जांच करने में मदद मिलती है. साथ ही, अपने Android ऐप्लिकेशन में थ्रेड की सूची की जांच करने में भी मदद मिलती है.

कोई थ्रेड चुनने के लिए, थ्रेड सिलेक्टर मेन्यू का इस्तेमाल करें और उसका स्टैक फ़्रेम देखें. एडिटर में सोर्स खोलने के लिए, फ़्रेम में मौजूद एलिमेंट पर क्लिक करें. फ़्रेम की जांच करने से जुड़ी गाइड में बताए गए तरीके से, थ्रेड प्रज़ेंटेशन को भी पसंद के मुताबिक बनाया जा सकता है. साथ ही, स्टैक फ़्रेम को एक्सपोर्ट किया जा सकता है.

वैरिएबल की जांच करना

डीबगर विंडो में, वैरिएबल पैनल की मदद से वैरिएबल की जांच की जा सकती है. ऐसा तब किया जा सकता है, जब सिस्टम आपके ऐप्लिकेशन को किसी ब्रेकपॉइंट पर रोकता है और फ़्रेम पैनल से कोई फ़्रेम चुना जाता है. वैरिएबल पैनल की मदद से, चुने गए फ़्रेम में उपलब्ध स्टैटिक तरीकों और/या वैरिएबल का इस्तेमाल करके, ऐड हॉक एक्सप्रेशन का आकलन भी किया जा सकता है.

ऑब्जेक्ट ट्री में कोई एक्सप्रेशन जोड़ने के लिए (ऐप्लिकेशन को डीबग करते समय):

आठवीं इमेज. डीबग विंडो में ऑब्जेक्ट ट्री और एक्सप्रेशन एंट्री बॉक्स.
  1. देखने या दिखाने के लिए एक्सप्रेशन डालें
  2. एक्सप्रेशन का एक बार आकलन करने के लिए, वॉच में जोड़ें पर क्लिक करें या Enter दबाएं.

इसके अलावा, अगर ऑब्जेक्ट ट्री में वह एक्सप्रेशन मौजूद है जिसे आपको देखना है, तो उसे ट्री के सबसे ऊपर खींचें और छोड़ें. इससे वह एक्सप्रेशन, देखे गए एक्सप्रेशन के तौर पर जुड़ जाएगा.

ब्रेकपॉइंट हिट होने या कोड को स्टेप-बाय-स्टेप चलाने पर, वॉच एक्सप्रेशन अपडेट हो जाएंगे.

आकलन किए गए एक्सप्रेशन, ऑब्जेक्ट ट्री में सबसे ऊपर तब तक दिखते रहेंगे, जब तक कि मैन्युअल तरीके से किसी दूसरे एक्सप्रेशन का आकलन न किया जाए या कोड को स्टेप-बाय-स्टेप न चलाया जाए.

ऑब्जेक्ट ट्री से किसी वॉच किए गए एक्सप्रेशन को हटाने के लिए, उस एक्सप्रेशन पर राइट क्लिक करें. इसके बाद, वॉच हटाएं पर क्लिक करें.

वॉचपॉइंट जोड़ना

C/C++ कोड को डीबग करते समय, खास तरह के ब्रेकपॉइंट सेट किए जा सकते हैं. इन्हें वॉचपॉइंट कहा जाता है. जब आपका ऐप्लिकेशन मेमोरी के किसी खास ब्लॉक के साथ इंटरैक्ट करता है, तो ये वॉचपॉइंट आपके ऐप्लिकेशन की प्रोसेस को रोक सकते हैं. उदाहरण के लिए, अगर आपने मेमोरी के किसी ब्लॉक पर दो पॉइंटर सेट किए हैं और उसे एक वॉचपॉइंट असाइन किया है, तो मेमोरी के उस ब्लॉक को ऐक्सेस करने के लिए किसी भी पॉइंटर का इस्तेमाल करने पर, वॉचपॉइंट ट्रिगर हो जाता है.

Android Studio में, रनटाइम के दौरान वॉचपॉइंट बनाया जा सकता है. इसके लिए, कोई वैरिएबल चुनें. हालांकि, LLDB वॉचपॉइंट को सिर्फ़ मेमोरी के उस ब्लॉक को असाइन करता है जिसे सिस्टम उस वैरिएबल के लिए तय करता है, न कि खुद वैरिएबल को. यह Watches पैनल में वैरिएबल जोड़ने से अलग है. Watches पैनल में वैरिएबल जोड़ने पर, आपको वैरिएबल की वैल्यू देखने की सुविधा मिलती है. हालांकि, जब सिस्टम मेमोरी में इसकी वैल्यू को पढ़ता है या बदलता है, तब ऐप्लिकेशन की प्रोसेस को निलंबित नहीं किया जा सकता.

ध्यान दें: जब आपके ऐप्लिकेशन की प्रोसेस किसी फ़ंक्शन से बाहर निकलती है और सिस्टम, मेमोरी से उसके लोकल वैरिएबल हटा देता है, तो आपको उन वैरिएबल के लिए बनाए गए किसी भी वॉचपॉइंट को फिर से असाइन करना होगा.

वॉचपॉइंट सेट करने के लिए, आपको ये ज़रूरी शर्तें पूरी करनी होंगी:

  • आपका टारगेट फ़िज़िकल डिवाइस या एम्युलेटर, x86 या x86_64 सीपीयू का इस्तेमाल करता हो. अगर आपका डिवाइस ARM सीपीयू का इस्तेमाल करता है, तो आपको मेमोरी में अपने वैरिएबल के पते की सीमा को 32-बिट प्रोसेसर के लिए 4 बाइट या 64-बिट प्रोसेसर के लिए 8 बाइट के साथ अलाइन करना होगा. अपने नेटिव कोड में किसी वैरिएबल को अलाइन करने के लिए, वैरिएबल डिक्लेरेशन में __attribute__((aligned(num_bytes))) डालें, जैसा कि यहां दिखाया गया है:
    // For a 64-bit ARM processor
    int my_counter __attribute__((aligned(8)));
  • आपने पहले ही तीन या उससे कम वॉचपॉइंट असाइन किए हैं. Android Studio, x86 या x86_64 टारगेट डिवाइसों पर सिर्फ़ चार वॉचपॉइंट के साथ काम करता है. अन्य डिवाइसों पर, कम वॉचपॉइंट इस्तेमाल किए जा सकते हैं.

ध्यान दें: 32-बिट ARM ABI की मदद से अपने ऐप्लिकेशन को डीबग करते समय, वॉचपॉइंट जोड़ने या कोड के अंदर वैरिएबल पर कर्सर घुमाकर उनकी वैल्यू की जांच करने से, ऐप्लिकेशन क्रैश हो सकता है. इस समस्या को हल करने के लिए, 64-बिट ARM, x86 या x86_64 बाइनरी का इस्तेमाल करके डीबग करें. इस समस्या को Android Studio की आने वाली रिलीज़ में ठीक कर दिया जाएगा.

ज़रूरी शर्तें पूरी करने पर, वॉचपॉइंट जोड़ने के लिए यह तरीका अपनाएं:

  1. जब आपका ऐप्लिकेशन किसी ब्रेकपॉइंट पर निलंबित हो, तो अपने एलएलडीबी सेशन व्यू में वैरिएबल पैनल पर जाएं.
  2. उस वैरिएबल पर राइट क्लिक करें जो मेमोरी के उस ब्लॉक में मौजूद है जिसे आपको ट्रैक करना है. इसके बाद, वॉचपॉइंट जोड़ें को चुनें.

    नौवीं इमेज. मेमोरी में किसी वैरिएबल में वॉचपॉइंट जोड़ें.
  3. वॉचपॉइंट को कॉन्फ़िगर करने के लिए एक डायलॉग बॉक्स दिखेगा, जैसा कि इमेज 9 में दिखाया गया है.

    इन विकल्पों की मदद से, वॉचपॉइंट को कॉन्फ़िगर करें:

    • चालू है: अगर आपको Android Studio को यह बताना है कि सेटिंग बदलने तक वॉचपॉइंट को अनदेखा किया जाए, तो इस विकल्प से चुने हुए का निशान हटाएं. Android Studio आपके वॉचपॉइंट को सेव करता है, ताकि आप उसे बाद में ऐक्सेस कर सकें.
    • सस्पेंड करना: डिफ़ॉल्ट रूप से, Android सिस्टम आपके ऐप्लिकेशन की प्रोसेस को तब सस्पेंड कर देता है, जब वह मेमोरी के उस ब्लॉक को ऐक्सेस करता है जिसे आपने वॉचपॉइंट को असाइन किया है. अगर आपको यह सुविधा नहीं चाहिए, तो इस विकल्प से चुने हुए का निशान हटाएं. इससे आपको अतिरिक्त विकल्प दिखते हैं. इनका इस्तेमाल करके, सिस्टम के आपके वॉचपॉइंट के साथ इंटरैक्ट करने पर, उसके व्यवहार को पसंद के मुताबिक बनाया जा सकता है: कंसोल में मैसेज लॉग करें और हिट होने पर हटाएं.
    • ऐक्सेस टाइप: चुनें कि जब आपका ऐप्लिकेशन, सिस्टम की ओर से वैरिएबल को असाइन किए गए मेमोरी ब्लॉक को पढ़ने या उसमें लिखने की कोशिश करे, तो वॉचपॉइंट ट्रिगर होना चाहिए या नहीं. रीड या राइट, दोनों में से किसी भी कार्रवाई पर वॉचपॉइंट को ट्रिगर करने के लिए, कोई भी चुनें.
  4. हो गया पर क्लिक करें.

अपने सभी वॉचपॉइंट देखने और उनकी सेटिंग कॉन्फ़िगर करने के लिए, डीबग विंडो में ब्रेकपॉइंट देखें पर क्लिक करें. इसके बाद, आपको ब्रेकपॉइंट डायलॉग दिखेगा, जैसा कि इमेज 10 में दिखाया गया है.

इमेज 10. ब्रेकपॉइंट डायलॉग में, आपके मौजूदा वॉचपॉइंट की सूची होती है. साथ ही, इसमें हर वॉचपॉइंट के लिए व्यवहार की सेटिंग शामिल होती हैं.

वॉचपॉइंट जोड़ने के बाद, डीबग विंडो में Resume Program पर क्लिक करें, ताकि आपके ऐप्लिकेशन की प्रोसेस फिर से शुरू हो सके. डिफ़ॉल्ट रूप से, अगर आपका ऐप्लिकेशन मेमोरी के उस ब्लॉक को ऐक्सेस करने की कोशिश करता है जिसके लिए आपने वॉचपॉइंट सेट किया है, तो Android सिस्टम आपके ऐप्लिकेशन की प्रोसेस को निलंबित कर देता है. साथ ही, आपके ऐप्लिकेशन के आखिरी बार चलाए गए कोड की लाइन के बगल में वॉचपॉइंट आइकॉन दिखता है. जैसा कि इमेज 11 में दिखाया गया है.

इमेज 11. Android Studio, कोड की उस लाइन को दिखाता है जिसे आपका ऐप्लिकेशन, वॉचपॉइंट ट्रिगर करने से ठीक पहले लागू करता है.

संसाधन की वैल्यू के डिसप्ले फ़ॉर्मैट को देखना और उसमें बदलाव करना

डीबग मोड में, रिसॉर्स की वैल्यू देखी जा सकती हैं. साथ ही, अपने Java या Kotlin कोड में वैरिएबल के लिए, अलग डिसप्ले फ़ॉर्मैट चुना जा सकता है. 'वैरिएबल' टैब दिखने और फ़्रेम चुनने के बाद, ये काम करें:

  1. वैरिएबल की सूची में, किसी संसाधन लाइन पर कहीं भी राइट क्लिक करके सूची दिखाएं.
  2. सूची में, इस तौर पर देखें को चुनें. इसके बाद, वह फ़ॉर्मैट चुनें जिसका आपको इस्तेमाल करना है.

    उपलब्ध फ़ॉर्मैट, आपके चुने गए संसाधन के डेटा टाइप पर निर्भर करते हैं. आपको इनमें से एक या उससे ज़्यादा विकल्प दिख सकते हैं:

    • क्लास: क्लास की परिभाषा दिखाएं.
    • toString: स्ट्रिंग फ़ॉर्मैट दिखाएं.
    • ऑब्जेक्ट: ऑब्जेक्ट (किसी क्लास का इंस्टेंस) की परिभाषा दिखाएं.
    • ऐरे: ऐरे फ़ॉर्मैट में दिखाएं.
    • टाइमस्टैंप: तारीख और समय को इस तरह दिखाएं: yyyy-mm-dd hh:mm:ss.
    • अपने-आप: Android Studio, डेटा टाइप के आधार पर सबसे सही फ़ॉर्मैट चुनता है.
    • बाइनरी: शून्य और एक का इस्तेमाल करके बाइनरी वैल्यू दिखाएं.
    • MeasureSpec: पैरंट से चुने गए चाइल्ड को पास की गई वैल्यू. MeasureSpec देखें.
    • Hex: हेक्साडेसिमल वैल्यू के तौर पर दिखाएं.
    • प्रिमिटिव: प्रिमिटिव डेटा टाइप का इस्तेमाल करके, संख्या वाली वैल्यू के तौर पर दिखाएं.
    • इंटीजर: Integer टाइप की संख्या वाली वैल्यू के तौर पर दिखाएं.

पसंद के मुताबिक फ़ॉर्मैट बनाने के लिए, यह तरीका अपनाएं:

  1. संसाधन की वैल्यू पर राइट क्लिक करें.
  2. इस तौर पर देखें को चुनें.
  3. बनाएं को चुनें.
  4. Java Data Type Renderers डायलॉग बॉक्स दिखता है. Java डेटा टाइप रेंडरर पर दिए गए निर्देशों का पालन करें.