Strace le permite ver las llamadas al sistema que realiza un proceso y lo que devuelven esas llamadas al sistema.
rastro de construcción
Para construir 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 de strace es adjuntarlo a un proceso en ejecución, lo que puede hacer con:
adb shell strace -f -p PID
El indicador -f
le indica a strace que se adjunte a todos los subprocesos del proceso, además de cualquier subproceso nuevo que se genere más adelante.
Un proceso típico realiza muchas llamadas al sistema, por lo que querrás revisar la página de manual de strace para aprender cómo recopilar solo los datos que realmente te interesan.
Usando en una aplicación
Para usar strace en una aplicación:
- Configura el dispositivo para que puedas ejecutar strace. Debe ser root, deshabilitar SELinux y reiniciar el tiempo de ejecución para eliminar el filtro seccomp que, de otro modo, impedirá que strace se ejecute:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- Configure un directorio en el que se pueda escribir todo el mundo 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 para rastrearlo y ejecutarlo:
adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
- Inicie el proceso normalmente.
Usando en el cigoto
Para usar strace en el cigoto, corrija la línea de cigoto init.rc
correspondiente (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 inicio 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 faltafile_context
de SELinux parastrace
. 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 modo permisivo SELinux. Puede hacer esto agregando
androidboot.selinux=permissive
aBOARD_KERNEL_CMDLINE
o aBOARD_BOOTCONFIG
en Android 12 con la versión del kernel 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.