Strace شما را قادر می سازد تا فراخوانی های سیستمی را که یک فرآیند ایجاد می کند و آنچه را که آن سیستم فراخوانی می کند برمی گرداند، مشاهده کنید.
ساخت strace
برای ساخت strace، موارد زیر را اجرا کنید:
mmma -j6 external/strace
به یک فرآیند در حال اجرا پیوست کنید
ساده ترین و رایج ترین مورد استفاده برای استریس، اتصال آن به یک فرآیند در حال اجرا است که می توانید با موارد زیر انجام دهید:
adb shell strace -f -p PID
پرچم -f
به strace میگوید که به تمام رشتههای موجود در فرآیند وصل شود، به علاوه هر رشته جدیدی که بعداً ایجاد میشود.
یک فرآیند معمولی تماسهای سیستمی زیادی برقرار میکند، بنابراین میخواهید صفحه strace man را مرور کنید تا یاد بگیرید چگونه فقط دادههایی را که واقعاً به آنها علاقه دارید جمعآوری کنید.
استفاده در یک برنامه
برای استفاده از strace در یک برنامه:
- دستگاه را طوری تنظیم کنید که بتوانید strace را اجرا کنید. شما باید root باشید، SELinux را غیرفعال کنید و زمان اجرا را مجددا راه اندازی کنید تا فیلتر seccomp را حذف کنید که در غیر این صورت از اجرای strace جلوگیری می کند:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- یک دایرکتوری قابل نوشتن جهانی برای گزارش های استریس تنظیم کنید، زیرا 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"'
- فرآیند را به طور معمول راه اندازی کنید.
روی زیگوت استفاده کنید
برای استفاده از استریس روی زیگوت، خط زیگوت مربوطه init.rc
را ثابت کنید (نیاز به 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 را دریافت کنید
برای دریافت strace log در هنگام بوت اندروید، تغییرات زیر را اعمال کنید:
- از آنجایی که نام فرآیند از
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 با هسته نسخه 5.10 یا بالاتر انجام دهید. (این متغیر درbuild/core/Makefile
فقط خواندنی می شود اما همیشه در/device/*/BoardConfig
در دسترس است.)
مثالی برای دستگاه Pixel (sailfish) در/device/google/marlin/sailfish/BoardConfig.mk
: پس از انجام تغییر، تصویر بوت را بسازید و فلش کنید و دستگاه در حالت permissive بوت می شود.- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive