Strace te permite ver las llamadas al sistema que realiza un proceso y lo que devuelven esas llamadas.
Compila strace
Para compilar strace, ejecuta el siguiente comando:
mmma -j6 external/strace
Cómo adjuntar el depurador a un proceso en ejecución
El caso de uso más simple y común de strace es adjuntarlo a un proceso en ejecución, lo que puedes hacer con el siguiente comando:
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 de manual de strace para aprender a recopilar solo los datos que realmente te interesan.
Usar en una app
Para usar strace en una app, haz lo siguiente:
- Configura el dispositivo para que puedas ejecutar strace. Debes ser root, inhabilitar SELinux y reiniciar el entorno de ejecución para quitar el filtro de seccomp que, de lo contrario, impedirá que se ejecute strace:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- Configura un directorio que admita escritura pública 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 con normalidad.
Uso en el cigoto
Para usar strace en el zygote, corrige la línea de 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
Cómo obtener registros de strace durante el inicio de Android
Para obtener registros de strace durante el inicio de Android, realiza los siguientes cambios:
- Dado que el nombre del proceso cambia de
zygote
astrace
, es posible que el servicio determinado no se inicie debido a la falta defile_context
de SELinux parastrace
. La solución es agregar una línea nueva para strace ensystem/sepolicy/private/file_contexts
y copiar el contexto del 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 kernel o bootconfig y, luego, inicia el dispositivo en el modo permisivo de SELinux. Para ello, agrega
androidboot.selinux=permissive
aBOARD_KERNEL_CMDLINE
o aBOARD_BOOTCONFIG
en 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, y el dispositivo se iniciará en modo permisivo.- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive