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 во время загрузки 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
После внесения изменений создайте и прошейте загрузочный образ, и устройство загрузится в разрешительном режиме.