استفاده از Debuggers

جزئیات این صفحه با استفاده از LLDB برای توسعه سیستم عامل. برای توسعه برنامه، به جای آن به Debug app خود مراجعه کنید، که نحوه استفاده از رابط کاربری گرافیکی Android Studio (بر اساس LLDB) را توضیح می دهد.

GDB دیگر پشتیبانی یا ارائه نمی شود. اگر در حال تغییر از GDB به LLDB هستید، احتمالاً باید با خواندن آموزش LLDB شروع کنید. اگر کاربر متخصص GDB هستید، نقشه فرمان GDB به LLDB هنگام انتقال بسیار مفید است.

پیش نیازها

برای استفاده از دیباگر:

  • محیط ساخت را با دستور envsetup.sh معمولی تنظیم کنید.
  • همان دستور lunch را که هنگام ساختن استفاده کردید اجرا کنید. توجه داشته باشید که مورد ناهار باید دقیقاً با دستگاهی که در حال رفع اشکال هستید مطابقت داشته باشد. اگر مورد ناهار با دستگاه پیوست شده مطابقت نداشته باشد، با فرم خطایی مواجه می‌شوید: You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
  • دستگاه خود را به دستگاه وصل کنید

برای راهنمایی بیشتر در مورد تنظیم محیط خود، به تنظیم محیط مراجعه کنید.

اشکال زدایی یک باینری

برای اشکال زدایی باینری که روی دستگاه خود ساخته اید، ابتدا باید باینری را در دستگاه کپی کنید و سپس دیباگر را راه اندازی کنید. مثلا:

adb push test.exe /data/local/tmp/test.exe
lldbclient.py --port 5038 -r /data/local/tmp/test.exe

اشکال زدایی برنامه ها یا فرآیندهای در حال اجرا

برای اتصال به یک برنامه در حال اجرا یا دیمون بومی، از lldbclient.py با PID استفاده کنید. به عنوان مثال، برای اشکال زدایی فرآیند با PID 1234، این را در هاست اجرا کنید:

lldbclient.py -p 1234

اسکریپت ارسال پورت را راه‌اندازی می‌کند، خرد اشکال‌زدایی از راه دور مناسب را روی دستگاه راه‌اندازی می‌کند، دیباگر را روی میزبان راه‌اندازی می‌کند، آن را برای یافتن نمادها پیکربندی می‌کند، و آن را به خرد اشکال‌زدایی راه دور متصل می‌کند.

اشکال زدایی راه اندازی فرآیند بومی

برای اشکال زدایی یک فرآیند هنگام شروع، از lldbclient.py با گزینه -r استفاده کنید. به عنوان مثال، برای اشکال زدایی ls /bin ، این را در هاست اجرا کنید:

lldbclient.py -r /system/bin/ls /bin

سپس، در اعلان اشکال زدا continue وارد کنید.

اشکال زدایی راه اندازی برنامه

گاهی اوقات می‌خواهید برنامه‌ای را که شروع به کار می‌کند، اشکال‌زدایی کنید، مانند زمانی که خرابی وجود دارد و می‌خواهید کد را مرور کنید تا ببینید قبل از خرابی چه اتفاقی افتاده است. پیوست کردن در برخی موارد کار می کند، اما در موارد دیگر غیرممکن است زیرا برنامه قبل از اینکه بتوانید پیوست کنید از کار می افتد. رویکرد logwrapper (که برای strace استفاده می شود) همیشه کار نمی کند زیرا ممکن است برنامه مجوز باز کردن پورت را نداشته باشد و lldbserver این محدودیت را به ارث می برد.

برای اشکال‌زدایی راه‌اندازی برنامه، از گزینه‌های توسعه‌دهنده در تنظیمات استفاده کنید تا به برنامه دستور دهید منتظر بماند تا اشکال‌زدای جاوا پیوست شود:

  1. به تنظیمات > گزینه های برنامه نویس > برنامه اشکال زدایی را انتخاب کنید و برنامه خود را از لیست انتخاب کنید، سپس روی Wait for debugger کلیک کنید.
  2. برنامه را از لانچر یا با استفاده از خط فرمان برای اجرا اجرا کنید:
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. منتظر بمانید تا برنامه بارگیری شود و یک گفتگو ظاهر شود که به شما می گوید برنامه منتظر اشکال زدایی است.
  4. lldbserver / lldbclient را به طور معمول وصل کنید، نقاط شکست را تنظیم کنید، سپس روند را ادامه دهید.

برای اینکه برنامه اجرا شود، یک دیباگر Java Debug Wire Protocol (JDWP) مانند Java Debugger (jdb) را ضمیمه کنید:

adb forward tcp:12345 jdwp:XXX  # (Where XXX is the PID
of the debugged process.)
jdb -attach localhost:12345

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

اگر می‌خواهید debuggerd فرآیندهای خراب را به حالت تعلیق درآورد تا بتوانید یک دیباگر را ضمیمه کنید، ویژگی مناسب را تنظیم کنید:

  • بعد از اندروید 11
    adb shell setprop debug.debuggerd.wait_for_debugger true
    
  • اندروید 11 و پایین تر
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • اندروید 6.0 مارشمالو و
    adb shell setprop debug.db.uid 999999
    

در پایان خروجی خرابی معمول، debuggerd دستورالعمل‌های کپی و چسباندن را در logcat ارائه می‌کند که نحوه اتصال اشکال‌زدا را به فرآیند خراب شده نشان می‌دهد.

اشکال زدایی با VS Code

LLDB از کدهای پلتفرم اشکال زدایی در کد ویژوال استودیو پشتیبانی می کند. برای کنترل و اشکال‌زدایی کدهای بومی در حال اجرا در دستگاه‌ها، می‌توانید به جای رابط LLDB CLI از جلوی دیباگر VS Code استفاده کنید.

قبل از استفاده از VS Code برای اشکال زدایی، پسوند CodeLLDB را نصب کنید.

برای اشکال زدایی کد با استفاده از VS Code:

  1. اطمینان حاصل کنید که تمام مصنوعات ساخت (مانند نمادها) مورد نیاز برای اجرای lldbclient.py یا lldbclient.py وجود دارند.
  2. در VS Code، Ctrl+Shift+P را فشار دهید تا دستوری اجرا شود، Debug: Add Configuration... را جستجو کنید، سپس LLDB را انتخاب کنید. این یک فایل launch.json را باز می کند و یک شی JSON جدید به لیست اضافه می کند.
  3. پیکربندی دیباگر جدید اضافه شده را با دو خط نظر جایگزین کنید - // #lldbclient-generated-begin و // #lldbclient-generated-end ، به طوری که لیست پیکربندی شما به این شکل باشد:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

    lldbclient.py از این نظرات برای تشخیص محل نوشتن پیکربندی استفاده می کند. اگر موارد دیگری در لیست وجود دارد، پس از تنظیمات دیگر، خطوط نظر را به آخر اضافه کنید.

  4. دستور زیر را در ترمینالی که envsetup.sh و lunch اجرا کرده اید اجرا کنید:
    lldbclient.py --setup-forwarding vscode-lldb \
          --vscode-launch-file LAUNCH_JSON_PATH \
          ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    lldbclient.py پیکربندی ایجاد شده را در launch.json می نویسد و به اجرا ادامه می دهد. این انتظار می رود؛ برنامه lldbclient.py را نکشید. اگر --vscode-launch-file حذف کنید، اسکریپت قطعه JSON را چاپ می کند که باید آن را به صورت دستی در launch.json کپی و جایگذاری کنید.

    اگر پرچم -r به دلیل نحوه تجزیه پرچم‌ها توسط ابزار وجود دارد، باید آخرین پرچم باشد.

  5. نوار کناری Run and Debug را باز کنید - پیکربندی جدید باید در لیست دیباگر ظاهر شود. Start Debugging (F5) را فشار دهید. دیباگر باید بعد از 10 تا 30 ثانیه وصل شود.

    اگر پیکربندی جدید در نمای Run and Debug ظاهر نشد، پنجره را مجدداً بارگیری کنید تا لیست اشکال زدا تازه شود - Ctrl+Shift+P را فشار دهید و reload window تایپ کنید.

  6. پس از اتمام اشکال زدایی، به ترمینالی که lldbclient.py اجرا می کند بروید و Enter را فشار دهید تا برنامه lldbclient.py پایان یابد. اجراهای بعدی اسکریپت پیکربندی بین نظرات #lldbclient-generated ایجاد می‌کند و محتوای قدیمی را جایگزین می‌کند، شما نیازی به حذف دستی آنها ندارید.

برای افزودن ویژگی های سفارشی به پیکربندی راه اندازی ایجاد شده، می توانید از پرچم --vscode-launch-props استفاده کنید. برای مثال:

lldbclient.py --setup-forwarding vscode-lldb \
    --vscode-launch-props \
    '{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
    ...
ویژگی‌های مثال باعث می‌شود VS Code قبل از اشکال‌زدایی، وظیفه‌ای به نام Build اجرا کند و یک مرحله اولیه‌سازی اشکال‌زدایی جدید را به مراحل تولید شده توسط اسکریپت اضافه کند. می‌توانید یک نمای کلی از ویژگی‌های موجود را در اسناد VS Code و در کتابچه راهنمای کاربر افزونه CodeLLDB بیابید.