Strace به شما امکان میدهد تماسهای سیستمی را که یک فرایند برقرار میکند و آنچه این تماسهای سیستمی برمیگردانند را ببینید.
ساختن strace
برای ساختن strace، دستور زیر را اجرا کنید:
mmma -j6 external/strace
پیوست کردن به فرایند درحال اجرا
سادهترین و رایجترین مورد استفاده برای strace این است که آن را به یک فرایند درحال اجرا متصل کنید، که میتوانید با این کار انجام دهید:
adb shell strace -f -p PID
پرچم -f به strace میگوید که به همه رشتههای موجود در
فرایند، بهعلاوه هر رشته جدیدی که بعداً ایجاد میشود، متصل شود.
فرایند معمولی تماسهای سیستمی زیادی برقرار میکند، بنابراین بهتر است صفحه راهنمای strace را بررسی کنید تا یاد بگیرید چگونه فقط دادههایی را که واقعاً به آنها علاقهمندید جمعآوری کنید.
استفاده در برنامه
برای استفاده از strace در برنامه:
- دستگاه را طوری راهاندازی کنید که بتوانید strace را اجرا کنید. برای برداشتن فیلتر seccomp که درغیراینصورت مانع اجرای strace میشود، باید کاربر ریشه باشید، SELinux را غیرفعال کنید، و زمان اجرا را بازراهاندازی کنید:
adb rootadb shell setenforce 0adb shell stopadb shell start - یک دایرکتوری با قابلیت نوشتن جهانی برای گزارشهای strace راهاندازی کنید، زیرا 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 درطول راهاندازی Android
برای دریافت گزارشهای strace درطول راهاندازی Android، تغییرات زیر را اعمال کنید:
- ازآنجاییکه نام فرایند از
zygoteبهstraceتغییر میکند، ممکن است سرویس ارائهشده بهدلیل وجود نداشتن SELinuxfile_contextبرایstraceشروع نشود. راهحل این است که خط جدیدی برای strace درsystem/sepolicy/private/file_contextsاضافه کنید و بافت فایل اصلی را در آن کپی کنید. مثال:/dev/socket/zygote u:object_r:zygote_socket:s0 + /system/bin/strace u:object_r:zygote_socket:s0
- پارامتر هسته یا bootconfig را اضافه کنید، سپس دستگاه را در حالت مجاز SELinux راهاندازی کنید. میتوانید این کار را با افزودن
androidboot.selinux=permissiveبهBOARD_KERNEL_CMDLINE، یا بهBOARD_BOOTCONFIGدر Android 12 با نسخه هسته ۵.۱۰ یا بالاتر انجام دهید. (این متغیر در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