ndk-gdb

NDK شامل یک اسکریپت پوسته به نام ndk-gdb برای شروع یک جلسه اشکال زدایی بومی خط فرمان است. کاربرانی که ترجیح می دهند از رابط کاربری گرافیکی استفاده کنند، باید به جای آن، مستندات مربوط به اشکال زدایی را در Android Studio مطالعه کنند.

الزامات

برای اینکه اشکال زدایی بومی خط فرمان کار کند، این الزامات باید برآورده شوند:

  • برنامه خود را با استفاده از اسکریپت ndk-build بسازید. اسکریپت ndk-gdb از استفاده از روش قدیمی make APP=<name> برای ساخت پشتیبانی نمی کند.
  • اشکال زدایی برنامه را در فایل AndroidManifest.xml خود با اضافه کردن عنصر <application> که ویژگی android:debuggable روی true تنظیم می کند، فعال کنید.
  • برنامه خود را طوری بسازید که روی Android 2.2 (Android API سطح 8) یا بالاتر اجرا شود.
  • اشکال زدایی در دستگاه یا شبیه ساز دارای Android نسخه 2.2 یا بالاتر. برای اهداف اشکال‌زدایی، سطح API هدفی که در فایل AndroidManifest.xml خود اعلام می‌کنید اهمیتی ندارد.
  • برنامه خود را در پوسته یونیکس توسعه دهید. در ویندوز، از Cygwin یا پیاده سازی آزمایشی Python 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 Debugger استفاده کنید، هنگام فراخوانی اسکریپت 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>

این گزینه ابزار اجرایی adb را مشخص می کند. تنها زمانی لازم است که مسیر خود را برای گنجاندن آن فایل اجرایی تنظیم نکرده باشید.

  • -d
  • -e
  • -s <serial>
  • این پرچم ها مشابه دستورات adb با نام های مشابه هستند. اگر چندین دستگاه یا شبیه ساز به دستگاه میزبان خود متصل هستید، این پرچم ها را تنظیم کنید. معانی آنها به شرح زیر است:

    -d
    به یک دستگاه فیزیکی متصل شوید.
    -e
    به یک دستگاه شبیه ساز متصل شوید.
    -s <serial>
    به یک دستگاه یا شبیه ساز خاص متصل شوید. در اینجا، <serial> نام دستگاه است که توسط دستور adb devices فهرست شده است.

    همچنین، می‌توانید متغیر محیطی ADB_SERIAL را برای فهرست کردن یک دستگاه خاص، بدون نیاز به گزینه خاصی تعریف کنید.

  • --exec=<file>
  • -x <file>
  • این گزینه به ndk-gdb می گوید که پس از اتصال به فرآیندی که در حال رفع اشکال است، دستورات اولیه سازی GDB موجود در <file> را اجرا کند. اگر می خواهید کاری را به طور مکرر انجام دهید، مانند تنظیم لیستی از نقاط شکست، و سپس از سرگیری اجرای خودکار، این یک ویژگی مفید است.

    --nowait

    توقف موقت کد جاوا را تا زمان اتصال GDB غیرفعال کنید. عبور از این گزینه ممکن است باعث شود که دیباگر نقاط شکست اولیه را از دست بدهد.

    --tui -t

    اگر رابط کاربری متنی موجود است، آن را فعال کنید.

    --gnumake-flag=<flag>

    این گزینه یک پرچم (یا پرچم) اضافی برای ارسال به سیستم ndk-build هنگام جستجو برای اطلاعات پروژه است. می توانید از چندین نمونه از این گزینه در همان دستور استفاده کنید.

    توجه: سه گزینه نهایی در این جدول فقط برای نسخه پایتون ndk-gdb است.

    پشتیبانی از موضوع

    اگر برنامه شما روی پلتفرمی قدیمی‌تر از Android 2.3 (سطح API 9) اجرا می‌شود، ndk-gdb نمی‌تواند رشته‌های بومی را به درستی اشکال‌زدایی کند. دیباگر فقط می تواند رشته اصلی را اشکال زدایی کند و اجرای رشته های دیگر را کاملا نادیده می گیرد.

    اگر نقطه انفصال را روی یک تابع اجرا شده در یک رشته غیر اصلی قرار دهید، برنامه خارج می شود و GDB پیام زیر را نمایش می دهد:

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