Strace te permite ver las llamadas al sistema que realiza un proceso y lo que devuelven esas llamadas.
Compila strace
Para compilar strace, ejecuta lo siguiente:
mmma -j6 external/strace
Adjunta a un proceso en ejecución
El caso de uso más simple y común para strace es adjuntarlo a un proceso en ejecución, lo que puedes hacer con lo siguiente:
adb shell strace -f -p PID
La marca -f le indica a strace que se adjunte a todos los subprocesos del proceso, además de los subprocesos nuevos que se generen más adelante.
Un proceso típico realiza muchas llamadas al sistema, por lo que te recomendamos que revises la página del manual de strace para aprender a recopilar solo los datos que te interesan.
Usa en una app
Para usar strace en una app, haz lo siguiente:
- Configura el dispositivo para que puedas ejecutar strace. Debes ser administrador, inhabilitar SELinux y reiniciar el entorno de ejecución para quitar el filtro seccomp que, de lo contrario, impedirá que se ejecute strace:
adb rootadb shell setenforce 0adb shell stopadb shell start - Configura un directorio de escritura mundial para los registros de strace, ya que strace se ejecutará con el uid de la app:
adb shell mkdir -m 777 /data/local/tmp/strace - Elige el proceso que deseas rastrear y ejecútalo:
adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
- Inicia el proceso de forma normal.
Usa en el zygote
Para usar strace en el zygote, corrige la línea zygote init.rc pertinente (requiere 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
Obtén registros de strace durante el arranque de Android
Para obtener registros de strace durante el arranque de Android, realiza los siguientes cambios:
- Dado que el nombre del proceso cambia de
zygoteastrace, es posible que el servicio determinado no se inicie debido a la falta defile_contextde SELinux parastrace. La solución es agregar una línea nueva para strace ensystem/sepolicy/private/file_contextsy copiar el contexto de archivo original. Ejemplo:/dev/socket/zygote u:object_r:zygote_socket:s0 + /system/bin/strace u:object_r:zygote_socket:s0
- Agrega el parámetro del kernel o bootconfig y, luego, inicia el dispositivo en modo permisivo de SELinux. Para ello, agrega
androidboot.selinux=permissiveaBOARD_KERNEL_CMDLINEo aBOARD_BOOTCONFIGen Android 12 con la versión de kernel 5.10 o posterior. (Esta variable se vuelve de solo lectura enbuild/core/Makefile, pero siempre está disponible en/device/*/BoardConfig).
Ejemplo para el dispositivo Pixel (sailfish) en/device/google/marlin/sailfish/BoardConfig.mk: Después de realizar el cambio, compila y escribe la imagen de arranque en la memoria flash, y el dispositivo se iniciará en modo permisivo.- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive