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 на 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