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