Strace شما را قادر میسازد تا فراخوانیهای سیستمی که یک فرآیند انجام میدهد و آنچه را که این فراخوانیهای سیستمی برمیگردانند، مشاهده کنید.
ساخت مسیر
برای ساخت strace، دستور زیر را اجرا کنید:
mmma -j6 external/strace
به یک فرآیند در حال اجرا متصل شوید
سادهترین و رایجترین مورد استفاده از strace، اتصال آن به یک فرآیند در حال اجرا است که میتوانید با این کار انجام دهید:
adb shell strace -f -p PID
پرچم -f به strace میگوید که به تمام نخهای موجود در فرآیند، به علاوه هر نخ جدیدی که بعداً ایجاد میشود، متصل شود.
یک فرآیند معمولی فراخوانیهای سیستمی زیادی انجام میدهد، بنابراین بهتر است صفحه راهنمای strace را مرور کنید تا یاد بگیرید چگونه فقط دادههایی را که واقعاً به آنها علاقهمند هستید جمعآوری کنید.
استفاده در یک برنامه
برای استفاده از strace در یک برنامه:
- دستگاه را طوری تنظیم کنید که بتوانید strace را اجرا کنید. برای حذف فیلتر seccomp که در غیر این صورت از اجرای strace جلوگیری میکند، باید کاربر root باشید، SELinux را غیرفعال کنید و محیط اجرا را مجدداً راهاندازی کنید:
adb rootadb shell setenforce 0adb shell stopadb shell start - یک دایرکتوری قابل نوشتن برای همه افراد در strace logs تنظیم کنید، زیرا strace تحت uid برنامه اجرا خواهد شد:
adb shell mkdir -m 777 /data/local/tmp/strace - فرآیند مورد نظر برای ردیابی و راهاندازی را انتخاب کنید:
adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
- روند را به طور معمول شروع کنید.
استفاده روی زیگوت
برای استفاده از strace روی zygote، خط مربوط به init.rc zygote را اصلاح کنید ( adb shell setenforce 0 نیاز دارد):
cd system/core/patch -p1 <<EOF --- a/rootdir/init.zygote32.rc +++ b/rootdir/init.zygote32.rc @@ -1,4 +1,4 @@ -service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server +service zygote /system/bin/strace -o /data/local/tmp/zygote.strace /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server class main socket zygote stream 660 root system onrestart write /sys/android_power/request_state wake EOF
دریافت گزارشهای مسیر در طول بوت اندروید
برای دریافت گزارشهای مسیر (strace logs) در طول بوت اندروید، تغییرات زیر را اعمال کنید:
- از آنجایی که نام فرآیند از
zygoteبهstraceتغییر میکند، ممکن است سرویس مورد نظر به دلیل فقدانfile_contextدر SELinux برایstraceشروع به کار نکند. راه حل این است که یک خط جدید برای strace درsystem/sepolicy/private/file_contextsاضافه کنید و context فایل اصلی را روی آن کپی کنید. مثال:/dev/socket/zygote u:object_r:zygote_socket:s0 + /system/bin/strace u:object_r:zygote_socket:s0
- پارامتر kernel یا bootconfig را اضافه کنید، سپس دستگاه را در حالت SELinux permissive بوت کنید. میتوانید این کار را با اضافه کردن
androidboot.selinux=permissiveبهBOARD_KERNEL_CMDLINEیا بهBOARD_BOOTCONFIGدر اندروید ۱۲ با نسخه کرنل ۵.۱۰ یا بالاتر انجام دهید. (این متغیر درbuild/core/Makefileفقط خواندنی میشود اما همیشه در/device/*/BoardConfigدر دسترس است.)
مثال برای دستگاه Pixel (sailfish) در/device/google/marlin/sailfish/BoardConfig.mk: پس از ایجاد تغییر، فایل بوت را بسازید و فلش کنید تا دستگاه در حالت مجاز بوت شود.- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive