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