Strace позволяет отслеживать системные вызовы, которые делает процесс, и то, что возвращают эти вызовы.
Как создать strace
Чтобы создать strace, выполните следующие действия:
mmma -j6 external/strace
Подключение к запущенному процессу
Самый простой и распространенный способ использования strace – подключить его к запущенному процессу. Это можно сделать следующим образом:
adb shell strace -f -p PID
Флаг -f указывает strace, что нужно подключиться ко всем потокам в процессе, а также к новым потокам, которые будут созданы позже.
Типичный процесс выполняет множество системных вызовов, поэтому вам нужно будет изучить руководство по strace, чтобы узнать, как собирать только те данные, которые вам действительно нужны.
Купите приложение
Чтобы использовать strace в приложении:
- Настройте устройство, чтобы можно было запустить strace. Чтобы удалить фильтр seccomp, который не позволяет запустить strace, вам нужно получить права root, отключить SELinux и перезапустить среду выполнения:
adb rootadb shell setenforce 0adb shell stopadb shell start - Настройте каталог с правами на запись для всех пользователей для журналов strace, поскольку strace будет выполняться с идентификатором пользователя приложения:
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 в 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. Чтобы устранить проблему, добавьте новую строку для 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в 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