استخدام التكديس

يمكّنك Strace من رؤية استدعاءات النظام التي تجريها العملية وما الذي تعرضه تلك الطلبات للنظام.

إنشاء strace

لإنشاء strace، شغِّل ما يلي:

mmma -j6 external/strace

الربط بعملية جارية

إنّ أبسط حالات استخدام أداة strace وأكثرها شيوعًا هي إرفاقها بأحد العمليات الجارية، وذلك من خلال:

adb shell strace -f -p PID

تُطلب من العلامة -f أداة strace إرفاق جميع سلاسل المهام في العملية، بالإضافة إلى أي سلاسل مهام جديدة يتم إنشاؤها لاحقًا.

تُجري العملية العادية الكثير من طلبات النظام، لذا عليك مراجعة صفحة man الخاصة بـ strace لتعلم كيفية جمع البيانات التي تهمّك فقط.

الاستخدام مع تطبيق

لاستخدام ميزة Strace في أحد التطبيقات، اتّبِع الخطوات التالية:

  1. إعداد الجهاز لكي تتمكّن من تشغيل strace يجب أن تكون لديك أذونات الجذر، وأوقِف SELinux، ثم أعِد تشغيل وقت التشغيل لإزالة فلتر seccomp الذي سيمنع تشغيل strace:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. يمكنك إعداد دليل يمكن للجميع كتابته لسجلات strace، لأنّ strace سيتم تشغيله باستخدام uid للتطبيق:
    adb shell mkdir -m 777 /data/local/tmp/strace
    
  3. اختر العملية التي تريد تتبعها وشغّلها:
    adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
    
  4. ابدأ العملية كالمعتاد.

الاستخدام على الزيجوت

لاستخدام 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، قد يتعذّر بدء الخدمة المحدّدة بسبب عدم توفّر SELinux file_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
    
    بعد إجراء التغيير، يمكنك إنشاء صورة التمهيد وفلاشها، وسيتم تشغيل الجهاز في الوضع المرخّص.