Utiliser strace

Strace vous permet de voir les appels système effectués par un processus et ce qu'ils renvoient.

Créer strace

Pour compiler strace, exécutez la commande suivante:

mmma -j6 external/strace

Associer à un processus en cours d'exécution

Le cas d'utilisation le plus simple et le plus courant de strace consiste à l'associer à un processus en cours d'exécution, ce que vous pouvez faire avec:

adb shell strace -f -p PID

L'indicateur -f indique à strace de s'associer à tous les threads du processus, ainsi qu'à tous les nouveaux threads générés ultérieurement.

Un processus typique génère de nombreux appels système. Nous vous invitons donc à consulter la page de manuel relative à strace pour savoir comment collecter uniquement les données qui vous intéressent.

Utiliser dans une application

Pour utiliser strace sur une application:

  1. Configurez l'appareil pour pouvoir exécuter strace. Vous devez être en mode root, désactiver SELinux et redémarrer l'environnement d'exécution pour supprimer le filtre seccomp qui empêcherait strace de s'exécuter:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. Configurez un répertoire accessible en écriture pour les journaux strace, car strace s'exécutera sous l'UID de l'application:
    adb shell mkdir -m 777 /data/local/tmp/strace
    
  3. Choisissez le processus à tracer et lancez-le:
    adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
    
  4. Lancez le processus normalement.

Utiliser sur le zygote

Pour utiliser un strace sur le zygote, corrigez la ligne de zygote init.rc pertinente (nécessite 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

Obtenir des journaux strace au démarrage d'Android

Pour obtenir des journaux strace au démarrage d'Android, apportez les modifications suivantes:

  • Étant donné que le nom du processus passe de zygote à strace, le service donné risque de ne pas démarrer en raison de l'absence de file_context SELinux pour strace. La solution consiste à ajouter une ligne pour strace dans system/sepolicy/private/file_contexts et à copier le contexte du fichier d'origine. Exemple :
    /dev/socket/zygote      u:object_r:zygote_socket:s0
    + /system/bin/strace u:object_r:zygote_socket:s0
    
  • Ajoutez le paramètre kernel ou bootconfig, puis démarrez l'appareil en mode SELinux permissif. Pour ce faire, ajoutez androidboot.selinux=permissive à BOARD_KERNEL_CMDLINE ou à BOARD_BOOTCONFIG dans Android 12 avec la version de kernel 5.10 ou ultérieure. (Cette variable passe en lecture seule dans build/core/Makefile, mais est toujours disponible sous /device/*/BoardConfig.)

    Exemple pour l'appareil Pixel (sailfish) dans /device/google/marlin/sailfish/BoardConfig.mk:
    - BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...
    +BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...  androidboot.selinux=permissive
    
    Une fois la modification effectuée, créez et flashez l'image de démarrage. L'appareil démarrera en mode permissif.