שימוש במעקב

בעזרת Strace אפשר לראות את קריאות המערכת שפועל מבצע, ואת הערכים שמוחזרים מהן.

פיתוח strace

כדי ליצור את strace, מריצים את הפקודה הבאה:

mmma -j6 external/strace

צירוף לתהליך פעיל

התרחיש לדוגמה הפשוט והנפוץ ביותר לשימוש ב-strace הוא לצרף אותו לתהליך שפועל, ואפשר לעשות זאת באמצעות:

adb shell strace -f -p PID

הדגל -f מנחה את מחרוזות חיבור לכל השרשורים בתהליך, וגם לכל השרשורים החדשים שנובעים מאוחר יותר.

תהליך רגיל מבצע הרבה קריאות למערכת, לכן מומלץ לעיין בדף העזרה של strace כדי ללמוד איך לאסוף רק את הנתונים שבאמת מעניינים אתכם.

שימוש באפליקציה

כדי להשתמש ב-strace באפליקציה:

  1. מגדירים את המכשיר כך שתוכלו להריץ את strace. צריך להיות לכם הרשאת root, להשבית את 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. מפעילים את התהליך כרגיל.

שימוש ב-zygote

כדי להשתמש ב-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. הפתרון הוא להוסיף שורה חדשה לרצף ב-system/sepolicy/private/file_contexts ולהעתיק את ההקשר של הקובץ המקורי. דוגמה:
    /dev/socket/zygote      u:object_r:zygote_socket:s0
    + /system/bin/strace u:object_r:zygote_socket:s0
    
  • מוסיפים פרמטר של ליבה או bootconfig, ואז מפעילים את המכשיר במצב SELinux permissive. כדי לעשות זאת, מוסיפים את 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
    
    אחרי ביצוע השינוי, יוצרים את קובץ האימג' של האתחול ומעבירים אותו למכשיר באמצעות הפלאש, והמכשיר יופעל במצב הרשאות מלא.