Использовать трассировку

Strace позволяет отслеживать системные вызовы, которые выполняет процесс, и то, что эти вызовы возвращают.

Создать трассировку

Для сборки команды strace выполните следующее:

mmma -j6 external/strace

Прикрепить к запущенному процессу

Самый простой и распространенный вариант использования strace — это привязка его к запущенному процессу, что можно сделать с помощью:

adb shell strace -f -p PID

Флаг -f указывает strace подключаться ко всем потокам в процессе, а также ко всем новым потокам, созданным позже.

Типичный процесс выполняет множество системных вызовов, поэтому вам следует ознакомиться со страницей руководства strace, чтобы узнать, как собирать только те данные, которые вас действительно интересуют.

Использовать в приложении

Чтобы использовать strace в приложении:

  1. Настройте устройство так, чтобы можно было запустить strace. Для этого необходимы права root, необходимо отключить SELinux и перезапустить среду выполнения, чтобы удалить фильтр seccomp, который в противном случае помешает запуску strace:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. Создайте директорию с правами записи для всех пользователей, поскольку strace будет работать под пользовательским идентификатором приложения:
    adb shell mkdir -m 777 /data/local/tmp/strace
    
  3. Выберите процесс для отслеживания и запустите его:
    adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
    
  4. Запустите процесс обычным способом.

Использовать на зиготе

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