استخدام strace

يتيح لك 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 (sailfish) في /device/google/marlin/sailfish/BoardConfig.mk:
    - BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...
    +BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...  androidboot.selinux=permissive
    
    بعد إجراء التغيير، يمكنك إنشاء صورة التمهيد وفلاشها، وسيتم تشغيل الجهاز في الوضع المرخّص.