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
Получить журналы трассировки во время загрузки Android
Чтобы получить журналы трассировки во время загрузки Android, внесите следующие изменения:
- Поскольку имя процесса меняется с
zygote
наstrace
, данная служба может не запуститься из-за отсутствияfile_context
SELinux для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