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

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 एमुलेटर का इस्तेमाल करने के लिए, एवीडी बनाना होगा. इसके अलावा, डिवाइस को यूएसबी के ज़रिए कनेक्ट करने या वाई-फ़ाई के ज़रिए कनेक्ट करने का विकल्प भी है.

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

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

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

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

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

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

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

    डीबग विंडो दिखेगी.

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

डीबग विंडो

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

डीबग विंडो को

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

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

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

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

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

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

अपने-आप पता लगाना
अगर आपको इस डीबग टाइप को चुनना है, तो जिस कोड को डीबग किया जा रहा है उसके लिए 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 के बजाय कोई दूसरी वैल्यू प्रिंट करेगा.

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

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

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

ध्यान दें: कंपाइलर से ऑप्टिमाइज़ किए गए नेटिव कोड को डीबग करते समय, आपको चेतावनी वाला यह मैसेज दिख सकता है:
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फ़्लैग सेट करें और डीबग लॉग मैसेज को शर्तों वाले स्टेटमेंट में डालें.

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

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

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

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

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

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

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

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

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

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

  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 आपके ऐप्लिकेशन को टारगेट डिवाइस पर डिप्लॉय करता है, तो हर डीबगर प्रोसेस के लिए, डीबग विंडो एक टैब या डीबग सेशन व्यू के साथ खुलती है, जैसा कि छठे चित्र में दिखाया गया है.

छठी इमेज. 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 को तब चलाना है जब डीबगर आपकी ऐप्लिकेशन प्रोसेस से जुड़ने से ठीक पहले या ठीक बाद, तो उन निर्देशों को अपने डीबग कॉन्फ़िगरेशन में जोड़ा जा सकता है.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ब्रेकपॉइंट हिट होने या कोड में आगे बढ़ने पर, निगरानी में रखे गए एक्सप्रेशन अपडेट हो जाएंगे.

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

ऑब्जेक्ट ट्री से, निगरानी में रखे गए एक्सप्रेशन को हटाने के लिए, एक्सप्रेशन पर दायां क्लिक करें. इसके बाद, निगरानी हटाएं पर क्लिक करें.

वॉचपॉइंट जोड़ें

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

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

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

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

  • आपका टारगेट किया गया फ़िज़िकल डिवाइस या एम्युलेटर, 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 ABIs का इस्तेमाल करके अपने ऐप्लिकेशन को डीबग करते समय, वॉचपॉइंट जोड़ने या कोड में वैरिएबल पर कर्सर घुमाकर उनकी वैल्यू की जांच करने पर, ऐप्लिकेशन क्रैश हो सकता है. समस्या को हल करने के लिए, 64-बिट ARM, x86 या x86_64 बाइनरी का इस्तेमाल करके डीबग करें. इस समस्या को Android Studio के आने वाले वर्शन में ठीक कर दिया जाएगा.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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