Utilizzando Strace

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:

  1. 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
    
  2. 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
    
  3. 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"'
    
  4. 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 a strace , il servizio specificato potrebbe non avviarsi a causa della mancanza file_context di SELinux per strace . La soluzione è aggiungere una nuova riga per strace in system/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 a BOARD_KERNEL_CMDLINE o a BOARD_BOOTCONFIG in Android 12 con versione kernel 5.10 o successiva. (Questa variabile diventa di sola lettura in build/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.