جزئیات این صفحه با استفاده از LLDB یا GDB برای توسعه سیستم عامل. برای توسعه برنامه، به جای آن به Debug app خود مراجعه کنید، که نحوه استفاده از رابط کاربری گرافیکی Android Studio (بر اساس LLDB) را توضیح می دهد.
GDB منسوخ شده است و به زودی حذف خواهد شد. اگر در حال تغییر از GDB به LLDB هستید، احتمالاً باید با خواندن آموزش LLDB شروع کنید. اگر کاربر متخصص GDB هستید، نقشه فرمان GDB به LLDB هنگام انتقال بسیار مفید است.
پیش نیازها
برای استفاده از دیباگر:
- محیط ساخت را با دستور
envsetup.sh
معمولی تنظیم کنید. - همان دستور
lunch
را که هنگام ساختن استفاده کردید اجرا کنید.
برای راهنمایی بیشتر در مورد تنظیم محیط خود، به تنظیم محیط مراجعه کنید.
اشکال زدایی برنامه ها یا فرآیندهای در حال اجرا
برای اتصال به یک برنامه در حال اجرا یا دیمون بومی، از gdbclient.py
با PID استفاده کنید. به عنوان مثال، برای اشکال زدایی فرآیند با PID 1234، این را در هاست اجرا کنید:
gdbclient.py -p 1234
اسکریپت ارسال پورت را راهاندازی میکند، خرد اشکالزدایی از راه دور مناسب را روی دستگاه راهاندازی میکند، دیباگر را روی میزبان راهاندازی میکند، آن را برای یافتن نمادها پیکربندی میکند، و آن را به خرد اشکالزدایی راه دور متصل میکند.
اشکال زدایی راه اندازی فرآیند بومی
برای اشکال زدایی یک فرآیند هنگام شروع، از gdbclient.py
با گزینه -r
استفاده کنید. به عنوان مثال، برای اشکال زدایی ls /bin
، این را در هاست اجرا کنید:
gdbclient.py -r /system/bin/ls /bin
سپس، در اعلان اشکال زدا، continue
را وارد کنید.
اشکال زدایی راه اندازی برنامه
گاهی اوقات میخواهید برنامهای را که شروع به کار میکند، اشکالزدایی کنید، مانند زمانی که خرابی وجود دارد و میخواهید کد را مرور کنید تا ببینید قبل از خرابی چه اتفاقی افتاده است. پیوست کردن در برخی موارد کار می کند، اما در موارد دیگر غیرممکن است زیرا برنامه قبل از اینکه بتوانید پیوست کنید از کار می افتد. رویکرد logwrapper
(که برای strace
استفاده می شود) همیشه کار نمی کند زیرا ممکن است برنامه مجوز باز کردن یک پورت را نداشته باشد و gdbserver
این محدودیت را به ارث می برد.
برای اشکالزدایی راهاندازی برنامه، از گزینههای توسعهدهنده در تنظیمات استفاده کنید تا به برنامه دستور دهید منتظر بماند تا اشکالزدای جاوا پیوست شود:
- به تنظیمات > گزینه های برنامه نویس > برنامه اشکال زدایی را انتخاب کنید و برنامه خود را از لیست انتخاب کنید، سپس روی Wait for debugger کلیک کنید.
- برنامه را از لانچر یا با استفاده از خط فرمان برای اجرا اجرا کنید:
adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
- منتظر بمانید تا برنامه بارگیری شود و یک گفتگو ظاهر شود که به شما می گوید برنامه منتظر اشکال زدایی است.
-
gdbserver
/gdbclient
به طور معمول وصل کنید، نقاط شکست را تنظیم کنید، سپس روند را ادامه دهید.
برای اینکه برنامه اجرا شود، یک دیباگر 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 ارائه میکند که نحوه اتصال اشکالزدا را به فرآیند خراب شده نشان میدهد.
اشکال زدایی بدون علامت
برای ARM 32 بیتی، اگر نمادها ندارید، gdb
نمی تواند تعیین کند که کدام مجموعه دستورالعمل را جدا می کند (ARM یا Thumb). برای تعیین مجموعه دستورالعمل انتخاب شده به عنوان پیش فرض در مواقعی که اطلاعات نماد گم شده است، ویژگی زیر را تنظیم کنید:
set arm fallback-mode arm # or thumb
اشکال زدایی با VS Code
LLDB از کدهای پلتفرم اشکال زدایی در کد ویژوال استودیو پشتیبانی می کند. برای کنترل و اشکالزدایی کدهای بومی در حال اجرا در دستگاهها، میتوانید به جای رابط LLDB CLI از جلوی دیباگر VS Code استفاده کنید.
قبل از استفاده از VS Code برای اشکال زدایی، پسوند CodeLLDB را نصب کنید.
برای اشکال زدایی کد با استفاده از VS Code:
- اطمینان حاصل کنید که تمام مصنوعات ساخت (مانند نمادها) مورد نیاز برای اجرای
gdbclient.py
یاlldbclient.py
وجود دارند. - دستور زیر را اجرا کنید:
lldbclient.py --setup-forwarding vscode-lldb ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...
این یک شی JSON چاپ می کند و
lldbclient.py
به اجرا ادامه می دهد. این انتظار می رود؛ برنامهlldbclient.py
را نکشید.اگر پرچم
-r
به دلیل نحوه تجزیه پرچمها توسط ابزار وجود دارد، باید آخرین پرچم باشد. - در تب اشکال زدایی در VS Code، افزودن پیکربندی را انتخاب کنید، سپس LLDB: راه اندازی سفارشی را انتخاب کنید. این یک فایل
launch.json
را باز می کند و یک شی JSON جدید به لیست اضافه می کند. - پیکربندی دیباگر جدید اضافه شده را حذف کنید.
- شی JSON چاپ شده توسط
lldbclient.py
را کپی کنید و آن را در شیئی که به تازگی حذف کرده اید قرار دهید. تغییرات را ذخیره کنید. - برای بارگیری مجدد پنجره برای بازخوانی لیست اشکال زدا، Ctrl+Shift+P را فشار دهید و
reload window
را تایپ کنید. - پیکربندی جدید دیباگر را انتخاب کرده و run را فشار دهید. دیباگر باید بعد از 10 تا 30 ثانیه وصل شود.
- پس از اتمام اشکال زدایی، به ترمینالی که
lldbclient.py
را اجرا می کند بروید و Enter را فشار دهید تا برنامهlldbclient.py
پایان یابد.