एनडीके-जीडीबी

NDK में ndk-gdb नाम की एक शेल स्क्रिप्ट शामिल होती है, ताकि कमांड-लाइन नेटिव डीबगिंग सेशन शुरू किया जा सके. पहले, इस स्क्रिप्ट का नाम gdb था, लेकिन अब इसे lldb कहा जाता है. जीयूआई का इस्तेमाल करने वाले लोगों को, Android Studio में डिबग करने के लिए दस्तावेज़ पढ़ना चाहिए.

ज़रूरी शर्तें

कमांड-लाइन नेटिव डीबगिंग की सुविधा काम करे, इसके लिए ये ज़रूरी शर्तें पूरी करनी होंगी:

  • ndk-build स्क्रिप्ट का इस्तेमाल करके अपना ऐप्लिकेशन बनाएं. ndk-gdb स्क्रिप्ट, बिल्ड करने के लिए लेगसी make APP=<name> तरीके का इस्तेमाल नहीं करती.
  • अपनी AndroidManifest.xml फ़ाइल में ऐप्लिकेशन डीबग करने की सुविधा चालू करने के लिए, ऐसा <application> एलिमेंट शामिल करें जो android:debuggable एट्रिब्यूट को true पर सेट करता हो.
  • अपने ऐप्लिकेशन को Android 2.2 (Android API लेवल 8) या उसके बाद के वर्शन पर चलने के लिए बनाएं.
  • Android 2.2 या इसके बाद के वर्शन पर चलने वाले डिवाइस या एमुलेटर पर डीबग करना. डीबग करने के लिए, AndroidManifest.xml फ़ाइल में बताए गए टारगेट एपीआई लेवल से कोई फ़र्क़ नहीं पड़ता.
  • Unix शेल में अपना ऐप्लिकेशन डेवलप करें. Windows पर, Cygwin या एक्सपेरिमेंट के तौर पर उपलब्ध ndk-gdb-py Python का इस्तेमाल करें.
  • GNU Make 3.81 या इसके बाद के वर्शन का इस्तेमाल करें.

इस्तेमाल

ndk-gdb स्क्रिप्ट को शुरू करने के लिए, ऐप्लिकेशन डायरेक्ट्री या उसके नीचे मौजूद किसी डायरेक्ट्री पर जाएं. उदाहरण के लिए:

cd $PROJECT
$NDK/ndk-gdb

यहां, $PROJECT आपके प्रोजेक्ट की रूट डायरेक्ट्री पर ले जाता है और $NDK आपके NDK इंस्टॉलेशन पाथ पर ले जाता है.

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

इसके बाद, ndk-gdb सामान्य lldb प्रॉम्प्ट दिखाता है.

ndk-gdb के साथ उसी तरह इंटरैक्ट किया जाता है जैसे lldb के साथ किया जाता है. अगर आपको lldb के बारे में नहीं पता है, लेकिन gdb के बारे में पता है, तो [GDB से LLDB के लिए कमांड मैप](https://lldb.llvm.org/use/map.html) देखें.

ndk-gdb, गड़बड़ी की कई स्थितियों को मैनेज करता है. साथ ही, अगर उसे कोई समस्या मिलती है, तो गड़बड़ी के बारे में जानकारी देने वाला मैसेज दिखाता है. इन जांचों में यह पक्का करना शामिल है कि ये शर्तें पूरी की गई हों:

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

डिफ़ॉल्ट रूप से, ndk-gdb पहले से चल रही आवेदन की प्रोसेस खोजता है. अगर उसे कोई प्रोसेस नहीं मिलती है, तो वह गड़बड़ी का मैसेज दिखाता है. हालांकि, डीबगिंग सेशन से पहले अपनी गतिविधि को अपने-आप शुरू करने के लिए, --start या --launch=<name> विकल्प का इस्तेमाल किया जा सकता है. ज़्यादा जानकारी के लिए, विकल्प देखें.

विकल्प

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

टेबल 1. ndk-gdb के सामान्य विकल्प और उनकी जानकारी.

इस विकल्प के साथ ndk-gdb शुरू करने पर, आपके ऐप्लिकेशन मेनिफ़ेस्ट में दी गई पहली लॉन्च की जा सकने वाली ऐक्टिविटी लॉन्च होती है. लॉन्च की जा सकने वाली अगली गतिविधि शुरू करने के लिए, --launch=<name> का इस्तेमाल करें. लॉन्च की जा सकने वाली गतिविधियों की सूची को डंप करने के लिए, कमांड लाइन से --launch-list चलाएं.

विकल्प ब्यौरा>
--verbose

यह विकल्प, बिल्ड सिस्टम को नेटिव-डीबगिंग सेशन के सेटअप के बारे में ज़्यादा जानकारी प्रिंट करने के लिए कहता है. यह सिर्फ़ समस्याओं को डीबग करने के लिए ज़रूरी है, जब डीबगर ऐप्लिकेशन से कनेक्ट नहीं हो पाता और ndk-gdb से दिखने वाले गड़बड़ी के मैसेज काफ़ी नहीं होते.

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

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

--launch=<name>

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

--launch-list

यह सुविधाजनक विकल्प, आपके ऐप्लिकेशन मेनिफ़ेस्ट में मौजूद, लॉन्च की जा सकने वाली सभी गतिविधियों के नामों की सूची को प्रिंट करता है. --start, पहली गतिविधि के नाम का इस्तेमाल करता है.

--project=<path> यह विकल्प, ऐप्लिकेशन प्रोजेक्ट डायरेक्ट्री के बारे में बताता है. यह तब काम आता है, जब आपको प्रोजेक्ट डायरेक्ट्री में बदलाव किए बिना स्क्रिप्ट को लॉन्च करना हो.
--port=<port>

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

--adb=<file>

यह विकल्प, adb टूल के लिए, 'कार्रवाई करने वाला' फ़ाइल टाइप तय करता है. यह सिर्फ़ तब ज़रूरी है, जब आपने उस एक्सीक्यूटेबल को शामिल करने के लिए अपना पाथ सेट न किया हो.

  • -d
  • -e
  • -s <serial>
  • ये फ़्लैग, एक ही नाम वाले adb निर्देशों से मिलते-जुलते हैं. अगर आपकी होस्ट मशीन से कई डिवाइस या एमुलेटर कनेक्ट हैं, तो ये फ़्लैग सेट करें. इनका मतलब इस तरह है:

    -d
    किसी एक डिवाइस से कनेक्ट करें.
    -e
    किसी एक एम्युलेटर डिवाइस से कनेक्ट करें.
    -s <serial>
    किसी डिवाइस या एम्युलेटर से कनेक्ट करें. यहां <serial>, डिवाइस का वह नाम है जो adb devices कमांड की सूची में दिया गया है.

    इसके अलावा, किसी खास डिवाइस की सूची बनाने के लिए, ADB_SERIAL एनवायरमेंट वैरिएबल तय किया जा सकता है. इसके लिए, किसी खास विकल्प की ज़रूरत नहीं होती.

  • --exec=<file>
  • -x <file>
  • यह विकल्प, ndk-gdb को डीबग की जा रही प्रोसेस से कनेक्ट करने के बाद, <file> में मौजूद डीबगर को शुरू करने के निर्देश चलाने के लिए कहता है. अगर आपको बार-बार कोई काम करना है, तो यह सुविधा काम की है. जैसे, ब्रेकपॉइंट की सूची सेट अप करना और फिर अपने-आप प्रोसेस फिर से शुरू करना.

    --nowait

    डीबगर के कनेक्ट होने तक, Java कोड को रोकने की सुविधा बंद करें. इस विकल्प को पास करने पर, डीबगर को शुरुआती ब्रेकपॉइंट नहीं मिल सकते.

    --tui -t

    अगर टेक्स्ट यूज़र इंटरफ़ेस उपलब्ध है, तो उसे चालू करें.

    --gnumake-flag=<flag>

    यह विकल्प, प्रोजेक्ट की जानकारी के लिए ndk-build सिस्टम से क्वेरी करते समय, उसे पास करने के लिए एक अतिरिक्त फ़्लैग (या फ़्लैग) है. एक ही निर्देश में, इस विकल्प के कई इंस्टेंस इस्तेमाल किए जा सकते हैं.

    ध्यान दें: इस टेबल में दिए गए आखिरी तीन विकल्प, सिर्फ़ ndk-gdb के Python वर्शन के लिए हैं.