يمكّنك Strace من رؤية استدعاءات النظام التي تجريها العملية وما الذي تعرضه تلك الطلبات للنظام.
إنشاء strace
لإنشاء strace، شغِّل ما يلي:
mmma -j6 external/strace
الربط بعملية جارية
إنّ أبسط حالات استخدام أداة strace وأكثرها شيوعًا هي إرفاقها بأحد العمليات الجارية، وذلك من خلال:
adb shell strace -f -p PID
تُطلب من العلامة -f
أداة strace إرفاق جميع سلاسل المهام في العملية، بالإضافة إلى أي سلاسل مهام جديدة يتم إنشاؤها لاحقًا.
تُجري العملية العادية الكثير من طلبات النظام، لذا عليك مراجعة صفحة man الخاصة بـ strace لتعلم كيفية جمع البيانات التي تهمّك فقط.
الاستخدام مع تطبيق
لاستخدام ميزة Strace في أحد التطبيقات، اتّبِع الخطوات التالية:
- إعداد الجهاز لكي تتمكّن من تشغيل strace يجب أن تكون لديك أذونات الجذر، وأوقِف SELinux، ثم أعِد تشغيل
وقت التشغيل لإزالة فلتر seccomp الذي سيمنع تشغيل strace:
adb root
adb shell setenforce 0
adb shell stop
adb 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
- أضِف مَعلمة kernel أو bootconfig، ثم شغِّل الجهاز في وضع SELinux المرخّص. يمكنك
إجراء ذلك عن طريق إضافة
androidboot.selinux=permissive
إلىBOARD_KERNEL_CMDLINE
أو إلىBOARD_BOOTCONFIG
في Android 12 مع إصدار kernel 5.10 أو إصدار أحدث. (يصبح هذا المتغيّر للقراءة فقط فيbuild/core/Makefile
ولكنها متوفِّرة دائمًا ضمن/device/*/BoardConfig
.)
مثال على جهاز Pixel (سمك شراع) في/device/google/marlin/sailfish/BoardConfig.mk
: بعد إجراء التغيير، يمكنك إنشاء صورة التمهيد وفلاشها، وسيتم تشغيل الجهاز في الوضع المرخّص.- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive