جزئیات این صفحه با استفاده از 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
این محدودیت را به ارث می برد.
برای اشکالزدایی راهاندازی برنامه، از گزینههای توسعهدهنده در تنظیمات استفاده کنید تا به برنامه دستور دهید منتظر بماند تا اشکالزدای جاوا پیوست شود:
- به تنظیمات > گزینه های برنامه نویس > برنامه اشکال زدایی را انتخاب کنید و برنامه خود را از لیست انتخاب کنید، سپس روی Wait for debugger کلیک کنید.
- برنامه را از لانچر یا با استفاده از خط فرمان برای اجرا شروع کنید:
adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
- منتظر بمانید تا برنامه بارگیری شود و یک گفتگو ظاهر شود که به شما می گوید برنامه منتظر اشکال زدایی است.
-
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:
- اطمینان حاصل کنید که تمام مصنوعات ساخت (مانند نمادها) مورد نیاز برای اجرای
lldbclient.py
یاlldbclient.py
وجود دارند. - در VS Code، Ctrl+Shift+P را فشار دهید تا دستوری اجرا شود، Debug: Add Configuration... را جستجو کنید، سپس LLDB را انتخاب کنید. این یک فایل
launch.json
را باز می کند و یک شی JSON جدید به لیست اضافه می کند. - پیکربندی دیباگر جدید اضافه شده را با دو خط نظر جایگزین کنید -
// #lldbclient-generated-begin
و// #lldbclient-generated-end
، به طوری که لیست پیکربندی شما به این شکل باشد:"configurations": [ // #lldbclient-generated-begin // #lldbclient-generated-end ]
lldbclient.py
از این نظرات برای تشخیص محل نوشتن پیکربندی استفاده می کند. اگر موارد دیگری در لیست وجود دارد، پس از تنظیمات دیگر، خطوط نظر را به آخر اضافه کنید. - دستور زیر را در ترمینالی که
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
به دلیل نحوه تجزیه پرچمها توسط ابزار وجود دارد، باید آخرین پرچم باشد. - نوار کناری Run and Debug را باز کنید - پیکربندی جدید باید در لیست دیباگر ظاهر شود. Start Debugging (F5) را فشار دهید. دیباگر باید بعد از 10 تا 30 ثانیه وصل شود.
اگر پیکربندی جدید در نمای Run and Debug ظاهر نشد، پنجره را مجدداً بارگیری کنید تا لیست اشکال زدا تازه شود - Ctrl+Shift+P را فشار دهید و
reload window
را تایپ کنید. - پس از اتمام اشکال زدایی، به ترمینالی که
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"}' \
...
Build
را قبل از اشکالزدایی اجرا کند و یک مرحله اولیه اشکالزدایی جدید را به مراحل تولید شده توسط اسکریپت اضافه کند. میتوانید یک نمای کلی از ویژگیهای موجود را در اسناد VS Code و در کتابچه راهنمای کاربر افزونه CodeLLDB بیابید.