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

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, поскольку strace будет работать под uid приложения:
    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 , данная служба может не запуститься из-за отсутствия file_context SELinux для strace . Решение — добавить новую строку для strace в system/sepolicy/private/file_contexts и скопировать туда исходный file context. Пример:
    /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
    
    После внесения изменений соберите и прошейте загрузочный образ, и устройство загрузится в разрешающем режиме.