يمكّنك Strace من رؤية استدعاءات النظام التي تجريها العملية وما ترجعه استدعاءات النظام هذه.
بناء ستريس
لإنشاء strace، قم بتشغيل ما يلي:
mmma -j6 external/strace
إرفاق عملية قيد التشغيل
إن أبسط حالات الاستخدام وأكثرها شيوعًا لـ strace هي إرفاقها بعملية قيد التشغيل، وهو ما يمكنك القيام به باستخدام:
adb shell strace -f -p PID
تخبر العلامة -f
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"'
- إطلاق العملية بشكل طبيعي.
استخدام على الزيجوت
لاستخدام strace على الزيجوت، قم بإصلاح سطر 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
الحصول على سجلات التتبع أثناء تشغيل Android
للحصول على سجلات التتبع أثناء تشغيل 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
بعد إجراء التغيير، قم بإنشاء صورة التمهيد ووميضها وسيقوم الجهاز بالتمهيد في الوضع المسموح به.