Utiliser strace

Strace vous permet de voir que le système appelle et ce que ces appels système 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 ce que vous pouvez faire avec:

adb shell strace -f -p PID

L'option -f indique à strace de s'associer à tous les threads du plus les nouveaux threads générés ultérieurement.

Un processus typique effectue de nombreux appels système. Nous vous conseillons donc de consulter la page de manuel de strace pour apprendre à ne collecter que les données qui vous intéressent.

Utiliser dans une appli

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 empêcherait strace de s'exécuter autrement:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. Configurez un répertoire accessible en écriture à l'échelle mondiale pour les journaux strace, car strace s'exécute 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 une strace sur le zygote, corrigez le zygote init.rc approprié ligne (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 au démarrage d'Android

Pour obtenir les 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 est de Ajoutez une ligne pour strace dans system/sepolicy/private/file_contexts et de 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. Vous pouvez le faire en ajoutant androidboot.selinux=permissive à BOARD_KERNEL_CMDLINE, ou BOARD_BOOTCONFIG sur Android 12 avec la version de noyau 5.10 ou une version 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.