Strace le permite ver las llamadas al sistema que hace un proceso y lo que devuelven esas llamadas al sistema.
Traza del edificio
Para compilar strace, ejecute lo siguiente:
mmma -j6 external/strace
Adjuntar 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 puede hacer con:
adb shell strace -f -p PID
El indicador -f
le dice a strace que se adjunte a todos los subprocesos en el proceso, además de cualquier subproceso nuevo generado más adelante.
Un proceso típico realiza muchas llamadas al sistema, por lo que querrá revisar la página de manual de strace para aprender a recopilar solo los datos que realmente le interesan.
Usar en una aplicación
Para usar strace en una aplicación:
- Configure el dispositivo para que pueda ejecutar strace. Debe ser root, deshabilitar SELinux y reiniciar el tiempo de ejecución para eliminar el filtro seccomp que, de lo contrario, evitará que strace se ejecute:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- Configure un directorio de escritura mundial para los registros de strace, porque strace se ejecutará bajo el uid de la aplicación:
adb shell mkdir -m 777 /data/local/tmp/strace
- Elija el proceso a rastrear y ejecútelo:
adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
- Inicie el proceso normalmente.
Uso en el cigoto
Para usar strace en el cigoto, corrija la línea de cigoto init.rc
relevante (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
Obtener registros de seguimiento durante el arranque de Android
Para obtener registros de seguimiento durante el arranque de Android, realice los siguientes cambios:
- Dado que el nombre del proceso cambia de
zygote
astrace
, es posible que el servicio dado no se inicie debido a que falta elstrace
file_context
La solución es agregar una nueva línea 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
- Agregue el parámetro kernel o bootconfig, luego inicie el dispositivo en el modo permisivo de SELinux. Puede hacerlo agregando
androidboot.selinux=permissive
aBOARD_KERNEL_CMDLINE
o aBOARD_BOOTCONFIG
en Android 12 con kernel versión 5.10 o superior. (Esta variable pasa a ser de solo lectura enbuild/core/Makefile
pero siempre está disponible en/device/*/BoardConfig
).
Ejemplo para el dispositivo Pixel (pez vela) en/device/google/marlin/sailfish/BoardConfig.mk
:- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive
Después de realizar el cambio, cree y actualice la imagen de inicio y el dispositivo se iniciará en modo permisivo.