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:
- 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
- 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
- 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 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 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 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 dansbuild/core/Makefile
, mais est toujours disponible sous/device/*/BoardConfig
.)
Exemple pour l'appareil Pixel (sailfish) dans/device/google/marlin/sailfish/BoardConfig.mk
: Une fois la modification effectuée, 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