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 pour 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'attacher à 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 savoir comment collecter uniquement les données qui vous intéressent réellement.
Utiliser dans une application
Pour utiliser strace sur une application :
- 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, autrement, empêcherait strace de s'exécuter :
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- Configurez un répertoire accessible en écriture à l'échelle mondiale pour les journaux strace, car strace s'exécutera sous l'UID de l'application :
adb shell mkdir -m 777 /data/local/tmp/strace
- 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"'
- Lancez le processus normalement.
Utiliser sur le zygote
Pour utiliser strace sur le zygote, corrigez la ligne zygote init.rc
correspondante (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
, il est possible que le service donné ne démarre pas en raison de l'absence defile_context
SELinux pourstrace
. La solution consiste à ajouter une ligne pour strace danssystem/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 un paramètre de noyau ou de bootconfig, puis démarrez l'appareil en mode permissif SELinux. Pour ce faire, vous pouvez ajouter
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 dansbuild/core/Makefile
, mais est toujours disponible sous/device/*/BoardConfig
.)
Exemple pour l'appareil Pixel (sailfish) dans/device/google/marlin/sailfish/BoardConfig.mk
: Après avoir effectué la modification, créez et flashez l'image de démarrage. L'appareil démarrera en mode permissif.- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive