Strace ti consente di vedere le chiamate di sistema effettuate da un processo e cosa restituiscono tali chiamate di sistema.
Strade edilizio
Per creare strace, esegui quanto segue:
mmma -j6 external/strace
Collegamento a un processo in esecuzione
Il caso d'uso più semplice e più comune per strace è collegarlo a un processo in esecuzione, cosa che puoi fare con:
adb shell strace -f -p PID
Il flag -f
dice a strace di collegarsi a tutti i thread nel processo, più eventuali nuovi thread generati successivamente.
Un processo tipico effettua molte chiamate di sistema, quindi ti consigliamo di rivedere la pagina man di strace per imparare come raccogliere solo i dati che ti interessano effettivamente.
Utilizzo su un'applicazione
Per utilizzare strace su un'applicazione:
- Configura il dispositivo in modo da poter eseguire strace. È necessario essere root, disabilitare SELinux e riavviare il runtime per rimuovere il filtro seccomp che altrimenti impedirebbe l'esecuzione di strace:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- Configura una directory scrivibile da tutti 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 il processo normalmente.
Utilizzo sullo zigote
Per utilizzare strace sullo zigote, correggi la riga zygote init.rc
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 di strace durante l'avvio di Android
Per ottenere i log strace durante l'avvio di Android, apportare le seguenti modifiche:
- Poiché il nome del processo cambia da
zygote
astrace
, il servizio specificato potrebbe non avviarsi a causa della mancanzafile_context
di SELinux perstrace
. La soluzione è aggiungere una nuova riga per strace insystem/sepolicy/private/file_contexts
e 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=permissive
aBOARD_KERNEL_CMDLINE
o aBOARD_BOOTCONFIG
in Android 12 con versione kernel 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
:- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive
Dopo aver apportato la modifica, crea e esegui il flashing dell'immagine di avvio e il dispositivo si avvierà in modalità permissiva.