استخدام strace

تتيح لك أداة Strace الاطّلاع على مكالمات النظام التي يجريها أحد العمليات وعلى ما تعرضه هذه المكالمات.

إنشاء strace

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

mmma -j6 external/strace

إرفاق عملية قيد التشغيل

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

adb shell strace -f -p PID

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

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