Как использовать strace

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

Как создать strace

Чтобы создать strace, выполните следующие действия:

mmma -j6 external/strace

Подключение к запущенному процессу

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

adb shell strace -f -p PID

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

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

Купите приложение

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

  1. Настройте устройство, чтобы можно было запустить strace. Чтобы удалить фильтр seccomp, который не позволяет запустить strace, вам нужно получить права root, отключить SELinux и перезапустить среду выполнения:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. Настройте каталог с правами на запись для всех пользователей для журналов strace, поскольку 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
    
    После внесения изменений соберите и прошейте загрузочный образ, и устройство загрузится в разрешающем режиме.