Strace מאפשרת לך לראות את שיחות המערכת שתהליך עושה ומה שיחות המערכת הללו חוזרות.
בניית strace
כדי לבנות strace, הפעל את הפעולות הבאות:
mmma -j6 external/strace
חיבור לתהליך רץ
מקרה השימוש הפשוט והנפוץ ביותר ל-strace הוא לצרף אותו לתהליך רץ, שתוכל לעשות עם:
adb shell strace -f -p PID
הדגל -f
אומר ל-strace להצמד לכל השרשורים בתהליך, בתוספת כל אשכולות חדשים שנוצרו מאוחר יותר.
תהליך טיפוסי מבצע הרבה שיחות מערכת, אז תרצה לעיין בדף האיש של 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"'
- הפעל את התהליך כרגיל.
שימוש על הזיגוטה
כדי להשתמש ב-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
, ייתכן שהשירות הנתון לא יפעל עקב החסר של SELinuxfile_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
לאחר ביצוע השינוי, בנה והבזק את תמונת האתחול והמכשיר יאתחל במצב מתירני.