Usando Strace

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:

  1. 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
    
  2. 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
    
  3. 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"'
    
  4. 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 a strace , es posible que el servicio dado no se inicie debido a que falta file_context de SELinux para strace . La solución es agregar una nueva línea para strace en system/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 a BOARD_KERNEL_CMDLINE o a BOARD_BOOTCONFIG en Android 12 con la versión del kernel 5.10 o superior. (Esta variable pasa a ser de solo lectura en build/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.