בעזרת Strace אפשר לראות את קריאות המערכת שפועל מבצע, ואת הערכים שמוחזרים מהן.
פיתוח strace
כדי ליצור את strace, מריצים את הפקודה הבאה:
mmma -j6 external/strace
צירוף לתהליך פעיל
התרחיש לדוגמה הפשוט והנפוץ ביותר לשימוש ב-strace הוא לצרף אותו לתהליך שפועל, ואפשר לעשות זאת באמצעות:
adb shell strace -f -p PID
הדגל -f
מנחה את מחרוזות חיבור לכל השרשורים בתהליך, וגם לכל השרשורים החדשים שנובעים מאוחר יותר.
תהליך רגיל מבצע הרבה קריאות למערכת, לכן מומלץ לעיין בדף העזרה של strace כדי ללמוד איך לאסוף רק את הנתונים שבאמת מעניינים אתכם.
שימוש באפליקציה
כדי להשתמש ב-strace באפליקציה:
- מגדירים את המכשיר כך שתוכלו להריץ את strace. צריך להיות לכם הרשאת root, להשבית את SELinux ולהפעיל מחדש את סביבת זמן הריצה כדי להסיר את מסנן seccomp, אחרת strace לא יפעל:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- מגדירים ספרייה שכל המשתמשים יכולים לכתוב בה ליומני strace, כי strace יפעל באמצעות מזהה המשתמש (uid) של האפליקציה:
adb shell mkdir -m 777 /data/local/tmp/strace
- בוחרים את התהליך שרוצים לעקוב אחריו ומפעילים אותו:
adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
- מפעילים את התהליך כרגיל.
שימוש ב-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
, יכול להיות שהשירות לא יופעל בגלל ש-SELinuxfile_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