Utiliser strace

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

Compiler 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 la commande suivante :

adb shell strace -f -p PID

L'option -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 effectue de nombreux appels système. Vous devez donc consulter la page de manuel strace pour découvrir comment collecter uniquement les données qui vous intéressent réellement.

Utiliser sur une application

Pour utiliser strace sur une application :

  1. Configurez l'appareil pour pouvoir exécuter strace. Vous devez être root, désactiver SELinux et redémarrer l'environnement d'exécution pour supprimer le filtre seccomp qui, sinon, empêchera l'exécution de strace :
    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 strace sur le zygote, corrigez la ligne zygote init.rc appropriée (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 les journaux strace lors du démarrage d'Android

Pour obtenir les journaux strace lors du démarrage d'Android, apportez les modifications suivantes :

  • Étant donné que le nom du processus passe de zygote à strace, le service donné peut ne pas démarrer en raison de l'absence de file_context SELinux pour strace. La solution consiste à ajouter une nouvelle ligne pour strace dans system/sepolicy/private/file_contexts et à copier le contexte de fichier d'origine. Exemple :
    /dev/socket/zygote      u:object_r:zygote_socket:s0
    + /system/bin/strace u:object_r:zygote_socket:s0
    
  • Ajoutez un paramètre de noyau ou de configuration de démarrage, puis démarrez l'appareil en mode permissif SELinux. Pour ce faire, ajoutez androidboot.selinux=permissive à BOARD_KERNEL_CMDLINE ou à BOARD_BOOTCONFIG dans Android 12 avec la version 5.10 ou ultérieure du noyau. (Cette variable devient en lecture seule dans build/core/Makefile, mais elle 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
    
    Après avoir apporté la modification, compilez et flashez l'image de démarrage. L'appareil démarrera en mode permissif.