Strace ti consente di vedere che il sistema chiama una processo e ciò che tali chiamate di sistema restituiscono.
Crea strace
Per compilare strace, esegui il seguente comando:
mmma -j6 external/strace
Collega a un processo in esecuzione
Il caso d'uso più semplice e più comune per lo strace è associarlo a una che puoi svolgere con:
adb shell strace -f -p PID
Il flag -f
indica allo strace di attaccarsi a tutti i fili nella
ed eventuali nuovi thread generati in un secondo momento.
Un processo tipico effettua molte chiamate di sistema, quindi è consigliabile esaminare pagina Strace Man per scoprire come raccogliere solo i dati che ti interessano davvero.
Usa su un'app
Per utilizzare strace su un'app:
- Configura il dispositivo in modo da poter eseguire strace. Devi avere i privilegi di root, disattivare SELinux e riavviare il runtime per rimuovere il filtro seccomp che altrimenti impedirà l'esecuzione di strace:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- Configura una directory con accesso in scrittura per tutti per i log di 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 normalmente la procedura.
Usa sullo zigote
Per utilizzare lo strace sullo zigote, correggi lo zigote init.rc
pertinente
riga (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 di strace durante l'avvio di Android
Per ottenere i log di Strace durante l'avvio di Android, apporta le seguenti modifiche:
- Poiché il nome del processo cambia da
zygote
astrace
, il servizio specificato potrebbe non avviarsi a causa della mancanza difile_context
SELinux perstrace
. La soluzione è aggiungi una nuova riga per lo strace insystem/sepolicy/private/file_contexts
e copia 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
per farlo aggiungendo
androidboot.selinux=permissive
BOARD_KERNEL_CMDLINE
o aBOARD_BOOTCONFIG
in Android 12 con kernel versione 5.10 o successiva. 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, compila e esegui il flashing dell'immagine di avvio e il dispositivo verrà avviato in modalità permissiva.- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive