Strace consente di visualizzare le chiamate di sistema effettuate da un processo e i relativi valori restituiti.
Build strace
Per creare strace, esegui questo comando:
mmma -j6 external/strace
Collegare a un processo in esecuzione
Il caso d'uso più semplice e comune per strace è collegarlo a un processo in esecuzione, cosa che puoi fare con:
adb shell strace -f -p PID
Il flag -f indica a strace di collegarsi a tutti i thread del processo, oltre a tutti i nuovi thread generati in un secondo momento.
Un processo tipico effettua molte chiamate di sistema, quindi ti consigliamo di consultare la pagina man di strace per scoprire come raccogliere solo i dati che ti interessano.
Utilizzo in un'app
Per utilizzare strace su un'app:
- Configura il dispositivo in modo da poter eseguire strace. Devi essere root, disattivare SELinux e riavviare
il runtime per rimuovere il filtro seccomp che altrimenti impedirebbe l'esecuzione di strace:
adb rootadb shell setenforce 0adb shell stopadb shell start - Configura una directory scrivibile a livello globale per i log strace, perché strace verrà eseguito con l'UID dell'app:
adb shell mkdir -m 777 /data/local/tmp/strace - Scegli il processo da tracciare e avvialo:
adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
- Avvia la procedura normalmente.
Utilizzo sullo zygote
Per utilizzare strace su zygote, correggi la riga init.rc zygote
pertinente (richiede 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
Ottenere i log strace durante l'avvio di Android
Per ottenere i log strace durante l'avvio di Android, apporta le seguenti modifiche:
- Poiché il nome del processo cambia da
zygoteastrace, l'avvio del servizio specificato potrebbe non riuscire a causa della mancanza di SELinuxfile_contextperstrace. La soluzione è aggiungere una nuova riga per strace insystem/sepolicy/private/file_contextse copiare il contesto del file originale. Esempio:/dev/socket/zygote u:object_r:zygote_socket:s0 + /system/bin/strace u:object_r:zygote_socket:s0
- Aggiungi il parametro kernel o bootconfig, quindi avvia il dispositivo in modalità permissiva SELinux. Puoi
farlo aggiungendo
androidboot.selinux=permissiveaBOARD_KERNEL_CMDLINEo aBOARD_BOOTCONFIGin Android 12 con versione del kernel 5.10 o successive. (Questa variabile diventa di sola lettura inbuild/core/Makefile, ma è sempre disponibile in/device/*/BoardConfig.)
Esempio per il dispositivo Pixel (sailfish) in/device/google/marlin/sailfish/BoardConfig.mk: Dopo aver apportato la modifica, crea e carica l'immagine di avvio e il dispositivo si avvierà in modalità permissiva.- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive