باستخدام ستراس

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

بناء ستريس

لإنشاء strace، قم بتشغيل ما يلي:

mmma -j6 external/strace

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

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

adb shell strace -f -p PID

تخبر العلامة -f 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. إطلاق العملية بشكل طبيعي.

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

لاستخدام strace على الزيجوت، قم بإصلاح سطر 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

الحصول على سجلات التتبع أثناء تشغيل Android

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