ndk-gdb

একটি কমান্ড-লাইন নেটিভ ডিবাগিং সেশন শুরু করতে NDK-এ ndk-gdb নামে একটি শেল স্ক্রিপ্ট অন্তর্ভুক্ত রয়েছে। যে ব্যবহারকারীরা একটি GUI ব্যবহার করতে পছন্দ করেন তাদের পরিবর্তে Android স্টুডিওতে ডিবাগ করার জন্য ডকুমেন্টেশন পড়া উচিত।

প্রয়োজনীয়তা

কমান্ড-লাইন নেটিভ ডিবাগিং কাজ করার জন্য, এই প্রয়োজনীয়তাগুলি অবশ্যই পূরণ করতে হবে:

  • ndk-build স্ক্রিপ্ট ব্যবহার করে আপনার অ্যাপ তৈরি করুন। ndk-gdb স্ক্রিপ্ট তৈরি করতে লিগ্যাসি make APP=<name> পদ্ধতি ব্যবহার করে সমর্থন করে না।
  • আপনার AndroidManifest.xml ফাইলে একটি <application> উপাদান অন্তর্ভুক্ত করে অ্যাপ ডিবাগিং সক্ষম করুন যা android:debuggable বৈশিষ্ট্যটিকে true এ সেট করে।
  • Android 2.2 (Android API লেভেল 8) বা তার উপরে চালানোর জন্য আপনার অ্যাপ তৈরি করুন।
  • Android 2.2 বা উচ্চতর সংস্করণে চলমান একটি ডিভাইস বা এমুলেটরে ডিবাগ করুন৷ ডিবাগিং উদ্দেশ্যে, আপনি আপনার AndroidManifest.xml ফাইলে যে টার্গেট API লেভেল ঘোষণা করেন তা কোন ব্যাপার না।
  • একটি ইউনিক্স শেলে আপনার অ্যাপ ডেভেলপ করুন। Windows এ, Cygwin বা পরীক্ষামূলক ndk-gdb-py পাইথন বাস্তবায়ন ব্যবহার করুন।
  • GNU Make 3.81 বা উচ্চতর ব্যবহার করুন।

ব্যবহার

ndk-gdb স্ক্রিপ্ট চালু করতে, অ্যাপ্লিকেশন ডিরেক্টরি বা এটির অধীনে যেকোন ডিরেক্টরিতে পরিবর্তন করুন। উদাহরণ স্বরূপ:

cd $PROJECT
$NDK/ndk-gdb

এখানে, $PROJECT আপনার প্রোজেক্টের রুট ডিরেক্টরির দিকে নির্দেশ করে এবং $NDK আপনার NDK ইনস্টলেশন পাথকে নির্দেশ করে।

আপনি যখন ndk-gdb চালু করেন, তখন এটি আপনার উৎস ফাইল এবং আপনার জেনারেট করা নেটিভ লাইব্রেরির প্রতীক/ডিবাগ সংস্করণগুলি দেখার জন্য সেশনটিকে কনফিগার করে। আপনার আবেদন প্রক্রিয়ার সাথে সফলভাবে সংযুক্ত হওয়ার পরে, ndk-gdb ত্রুটি বার্তার একটি দীর্ঘ সিরিজ আউটপুট করে, উল্লেখ্য যে এটি বিভিন্ন সিস্টেম লাইব্রেরি খুঁজে পায় না। এটি স্বাভাবিক, কারণ আপনার হোস্ট মেশিনে আপনার লক্ষ্য ডিভাইসে এই লাইব্রেরির প্রতীক/ডিবাগ সংস্করণ নেই। আপনি নিরাপদে এই বার্তা উপেক্ষা করতে পারেন.

পরবর্তীতে, ndk-gdb একটি সাধারণ GDB প্রম্পট প্রদর্শন করে।

আপনি ndk-gdb এর সাথে একইভাবে ইন্টারঅ্যাক্ট করেন যেভাবে আপনি GNU GDB এর সাথে করবেন। উদাহরণস্বরূপ, আপনি ব্রেকপয়েন্ট সেট করতে b <location> ব্যবহার করতে পারেন, এবং c ("চালিয়ে যান" এর জন্য) এক্সিকিউশন পুনরায় শুরু করতে। কমান্ডের একটি বিস্তৃত তালিকার জন্য, GDB ম্যানুয়াল দেখুন। আপনি যদি LLDB ডিবাগার ব্যবহার করতে পছন্দ করেন, ndk-gdb স্ক্রিপ্ট ব্যবহার করার সময় --lldb বিকল্পটি ব্যবহার করুন।

মনে রাখবেন যে আপনি যখন GDB প্রম্পট থেকে প্রস্থান করেন, আপনি যে আবেদন প্রক্রিয়াটি ডিবাগ করছেন তা বন্ধ হয়ে যায়। এই আচরণ একটি gdb সীমাবদ্ধতা.

ndk-gdb অনেক ত্রুটি অবস্থা পরিচালনা করে, এবং যদি এটি একটি সমস্যা খুঁজে পায় তবে একটি তথ্যপূর্ণ ত্রুটি বার্তা প্রদর্শন করে। এই চেকগুলির মধ্যে নিম্নলিখিত শর্তগুলি সন্তুষ্ট হয়েছে তা নিশ্চিত করা অন্তর্ভুক্ত:

  • ADB আপনার পথে আছে কিনা তা পরীক্ষা করে।
  • আপনার অ্যাপ্লিকেশনটি এর ম্যানিফেস্টে ডিবাগযোগ্য ঘোষণা করা হয়েছে কিনা তা পরীক্ষা করে।
  • চেক করে যে, ডিভাইসে, একই প্যাকেজের নামের সাথে ইনস্টল করা অ্যাপ্লিকেশনটিও ডিবাগযোগ্য।

ডিফল্টরূপে, ndk-gdb একটি ইতিমধ্যে চলমান অ্যাপ্লিকেশন প্রক্রিয়ার জন্য অনুসন্ধান করে, এবং এটি একটি খুঁজে না পেলে একটি ত্রুটি প্রদর্শন করে৷ তবে, আপনি ডিবাগিং সেশনের আগে স্বয়ংক্রিয়ভাবে আপনার কার্যকলাপ শুরু করতে --start বা --launch=<name> বিকল্পটি ব্যবহার করতে পারেন। আরও তথ্যের জন্য, বিকল্পগুলি দেখুন।

অপশন

বিকল্পগুলির একটি সম্পূর্ণ তালিকা দেখতে, কমান্ড লাইনে ndk-gdb --help টাইপ করুন। সারণী 1 সংক্ষিপ্ত বিবরণ সহ আরও সাধারণভাবে ব্যবহৃত অনেকগুলি দেখায়।

সারণি 1. সাধারণ ndk-gdb বিকল্প এবং তাদের বিবরণ।

নির্দিষ্ট করা এই বিকল্পটি দিয়ে ndk-gdb শুরু করা আপনার অ্যাপ্লিকেশন ম্যানিফেস্টে তালিকাভুক্ত প্রথম লঞ্চযোগ্য কার্যকলাপ চালু করে। পরবর্তী লঞ্চযোগ্য কার্যকলাপ শুরু করতে --launch=<name> ব্যবহার করুন। লঞ্চযোগ্য কার্যকলাপের তালিকা ডাম্প করতে, কমান্ড লাইন থেকে --launch-list চালান।

অপশন বর্ণনা>
--lldb

সেট করা থাকলে, স্ক্রিপ্টটি সেশনের জন্য Gdb-এর পরিবর্তে LLDB ডিবাগার ব্যবহার করবে।

--verbose

এই বিকল্পটি বিল্ড সিস্টেমকে নেটিভ-ডিবাগিং সেশন সেটআপ সম্পর্কে ভার্বোস তথ্য মুদ্রণ করতে বলে। এটি শুধুমাত্র ডিবাগিং সমস্যার জন্য প্রয়োজনীয় যখন ডিবাগার অ্যাপের সাথে সংযোগ করতে পারে না এবং ndk-gdb যে ত্রুটি বার্তাগুলি প্রদর্শন করে তা যথেষ্ট নয়।

--force ডিফল্টরূপে, ndk-gdb বাতিল করে যদি এটি দেখতে পায় যে একই ডিভাইসে ইতিমধ্যেই অন্য একটি নেটিভ ডিবাগিং সেশন চলছে। এই বিকল্পটি অন্য অধিবেশনকে মেরে ফেলে এবং এটিকে একটি নতুন দিয়ে প্রতিস্থাপন করে। মনে রাখবেন যে এই বিকল্পটি ডিবাগ করা প্রকৃত অ্যাপটিকে মেরে ফেলবে না, যা আপনাকে অবশ্যই আলাদাভাবে হত্যা করতে হবে।
--start

আপনি যখন ndk-gdb শুরু করেন, তখন এটি লক্ষ্য ডিভাইসে আপনার অ্যাপের একটি বিদ্যমান চলমান উদাহরণে সংযুক্ত করার জন্য ডিফল্টভাবে চেষ্টা করে। আপনি ডিবাগিং সেশনের আগে টার্গেট ডিভাইসে অ্যাপ্লিকেশনটি স্পষ্টভাবে চালু করতে --start ব্যবহার করে এই ডিফল্ট আচরণটি ওভাররাইড করতে পারেন।

--launch=<name>

এই বিকল্পটি --start এর মতই, ব্যতীত এটি আপনাকে আপনার অ্যাপ্লিকেশন থেকে একটি নির্দিষ্ট কার্যকলাপ শুরু করতে দেয়। এই বৈশিষ্ট্যটি শুধুমাত্র উপযোগী যদি আপনার ম্যানিফেস্ট একাধিক লঞ্চযোগ্য কার্যকলাপ সংজ্ঞায়িত করে।

--launch-list

এই সুবিধার বিকল্পটি আপনার অ্যাপ ম্যানিফেস্টে পাওয়া সমস্ত লঞ্চযোগ্য কার্যকলাপের নামের তালিকা প্রিন্ট করে। --start প্রথম কার্যকলাপের নাম ব্যবহার করে।

--project=<path> এই বিকল্পটি অ্যাপ প্রকল্প ডিরেক্টরি নির্দিষ্ট করে। আপনি যদি প্রথমে প্রকল্প ডিরেক্টরিতে পরিবর্তন না করে স্ক্রিপ্টটি চালু করতে চান তবে এটি কার্যকর।
--port=<port>

ডিফল্টরূপে, ndk-gdb স্থানীয় TCP পোর্ট 5039 ব্যবহার করে যে অ্যাপটি লক্ষ্য ডিভাইসে ডিবাগ করছে তার সাথে যোগাযোগ করতে। একটি ভিন্ন পোর্ট ব্যবহার করে আপনি একই হোস্ট মেশিনের সাথে সংযুক্ত বিভিন্ন ডিভাইস বা এমুলেটরগুলিতে চলমান প্রোগ্রামগুলিকে স্থানীয়ভাবে ডিবাগ করতে পারবেন।

--adb=<file>

এই বিকল্পটি অ্যাডবি টুল এক্সিকিউটেবল নির্দিষ্ট করে। এটি শুধুমাত্র প্রয়োজনীয় যদি আপনি সেই এক্সিকিউটেবল অন্তর্ভুক্ত করার জন্য আপনার পথ সেট না করেন।

  • -d
  • -e
  • -s <serial>
  • এই পতাকাগুলি একই নামের সাথে adb কমান্ডের অনুরূপ। আপনার হোস্ট মেশিনের সাথে সংযুক্ত একাধিক ডিভাইস বা এমুলেটর থাকলে এই পতাকাগুলি সেট করুন৷ তাদের অর্থ নিম্নরূপ:

    -d
    একটি একক শারীরিক ডিভাইসের সাথে সংযোগ করুন।
    -e
    একটি একক এমুলেটর ডিভাইসের সাথে সংযোগ করুন।
    -s <serial>
    একটি নির্দিষ্ট ডিভাইস বা এমুলেটরের সাথে সংযোগ করুন। এখানে, <serial> ডিভাইসের নাম adb devices কমান্ড দ্বারা তালিকাভুক্ত।

    বিকল্পভাবে, আপনি একটি নির্দিষ্ট বিকল্পের প্রয়োজন ছাড়াই একটি নির্দিষ্ট ডিভাইস তালিকাভুক্ত করতে ADB_SERIAL পরিবেশ পরিবর্তনশীল সংজ্ঞায়িত করতে পারেন।

  • --exec=<file>
  • -x <file>
  • এই বিকল্পটি ndk-gdb ডিবাগিং প্রক্রিয়ার সাথে সংযোগ করার পরে <file> -এ পাওয়া GDB প্রারম্ভিক কমান্ডগুলি চালাতে বলে। এটি একটি দরকারী বৈশিষ্ট্য যদি আপনি বারবার কিছু করতে চান, যেমন ব্রেকপয়েন্টগুলির একটি তালিকা সেট আপ করা এবং তারপরে স্বয়ংক্রিয়ভাবে সম্পাদন পুনরায় শুরু করা।

    --nowait

    GDB সংযোগ না হওয়া পর্যন্ত জাভা কোড পজ করা অক্ষম করুন। এই বিকল্পটি পাস করার ফলে ডিবাগার প্রাথমিক ব্রেকপয়েন্ট মিস করতে পারে।

    --tui -t

    টেক্সট ইউজার ইন্টারফেস সক্ষম করুন যদি এটি উপলব্ধ থাকে।

    --gnumake-flag=<flag>

    এই বিকল্পটি একটি অতিরিক্ত পতাকা (বা পতাকা) যা ndk-build সিস্টেমে প্রেরণ করার জন্য যখন এটি প্রকল্পের তথ্যের জন্য অনুসন্ধান করা হয়। আপনি একই কমান্ডে এই বিকল্পের একাধিক উদাহরণ ব্যবহার করতে পারেন।

    দ্রষ্টব্য: এই টেবিলের চূড়ান্ত তিনটি বিকল্প শুধুমাত্র ndk-gdb এর পাইথন সংস্করণের জন্য।

    থ্রেড সমর্থন

    যদি আপনার অ্যাপটি Android 2.3 (API লেভেল 9) এর চেয়ে পুরানো প্ল্যাটফর্মে চলে তবে ndk-gdb নেটিভ থ্রেডগুলি সঠিকভাবে ডিবাগ করতে পারে না। ডিবাগার শুধুমাত্র প্রধান থ্রেড ডিবাগ করতে পারে, abd সম্পূর্ণরূপে অন্যান্য থ্রেডের সম্পাদন উপেক্ষা করে।

    আপনি যদি একটি নন-মেইন থ্রেডে কার্যকর করা একটি ফাংশনে একটি ব্রেকপয়েন্ট স্থাপন করেন, তাহলে প্রোগ্রামটি প্রস্থান করে এবং GDB নিম্নলিখিত বার্তাটি প্রদর্শন করে:

    Program terminated with signal SIGTRAP, Trace/breakpoint trap.
          The program no longer exists.