באמצעות Strace

Strace מאפשרת לך לראות את שיחות המערכת שתהליך עושה ומה שיחות המערכת הללו חוזרות.

בניית strace

כדי לבנות strace, הפעל את הפעולות הבאות:

mmma -j6 external/strace

חיבור לתהליך רץ

מקרה השימוש הפשוט והנפוץ ביותר ל-strace הוא לצרף אותו לתהליך רץ, שתוכל לעשות עם:

adb shell strace -f -p PID

הדגל -f אומר ל-strace להצמד לכל השרשורים בתהליך, בתוספת כל אשכולות חדשים שנוצרו מאוחר יותר.

תהליך טיפוסי מבצע הרבה שיחות מערכת, אז תרצה לעיין בדף האיש של 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. הפעל את התהליך כרגיל.

שימוש על הזיגוטה

כדי להשתמש ב-strace על הזיגוטה, תקן את קו הזיגוטה הרלוונטי 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 במהלך אתחול אנדרואיד

כדי לקבל יומני strace במהלך אתחול אנדרואיד, בצע את השינויים הבאים:

  • מכיוון ששם התהליך משתנה 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
    
  • הוסף פרמטר ליבה או bootconfig, ולאחר מכן אתחל את המכשיר במצב מתיר SELinux. אתה יכול לעשות זאת על ידי הוספת androidboot.selinux=permissive ל- BOARD_KERNEL_CMDLINE , או ל- BOARD_BOOTCONFIG באנדרואיד 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
    
    לאחר ביצוע השינוי, בנה והבזק את תמונת האתחול והמכשיר יאתחל במצב מתירני.