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