استخدام strace

يتيح لك Strace الاطّلاع على طلبات النظام التي تطلبها العملية والنتائج التي تُظهرها هذه الطلبات.

إنشاء strace

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

mmma -j6 external/strace

إرفاق عملية جارية

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

adb shell strace -f -p PID

تشير علامة -f إلى دالة السلك لإرفاقها بجميع سلاسل المحادثات في بالإضافة إلى أي سلاسل محادثات جديدة ستنتج لاحقًا.

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

الاستخدام في أحد التطبيقات

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

  1. إعداد الجهاز حتى تتمكّن من تنفيذ تقنية Strace يجب أن تكون لديك أذونات الجذر، وأوقِف SELinux، ثم أعِد تشغيل وقت التشغيل لإزالة فلتر seccomp الذي سيمنع تشغيل strace:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. يمكنك إعداد دليل قابل للكتابة على مستوى العالم لسجلّات التتبع، حيث يتم تنفيذ strace ضمن المعرف الفريد للتطبيق:
    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. ابدأ العملية كالمعتاد.

الاستخدام على الخلايا الجذعية

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