Usando Strace

O Strace permite que você veja as chamadas de sistema que um processo faz e o que essas chamadas de sistema retornam.

Pista de construção

Para construir strace, execute o seguinte:

mmma -j6 external/strace

Anexando a um processo em execução

O caso de uso mais simples e comum para strace é anexá-lo a um processo em execução, o que você pode fazer com:

adb shell strace -f -p PID

O sinalizador -f diz ao strace para anexar a todos os encadeamentos no processo, além de quaisquer novos encadeamentos gerados posteriormente.

Um processo típico faz muitas chamadas de sistema, então você vai querer revisar a página de manual do strace para aprender como coletar apenas os dados nos quais você está realmente interessado.

Usando em um aplicativo

Para usar strace em um aplicativo:

  1. Configure o dispositivo para que você possa executar o strace. Você precisa ser root, desabilitar o SELinux e reiniciar o tempo de execução para remover o filtro seccomp que impedirá a execução do strace:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. Configure um diretório gravável mundialmente para logs de strace, porque o strace será executado sob o uid do aplicativo:
    adb shell mkdir -m 777 /data/local/tmp/strace
    
  3. Escolha o processo para rastrear e iniciá-lo:
    adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
    
  4. Inicie o processo normalmente.

Usando no zigoto

Para usar strace no zigoto, corrija a linha zygote init.rc relevante (requer 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

Obtendo logs de rastreamento durante a inicialização do Android

Para obter logs de rastreamento durante a inicialização do Android, faça as seguintes alterações:

  • Como o nome do processo muda de zygote para strace , o serviço fornecido pode falhar ao iniciar devido à falta do SELinux file_context para strace . A solução é adicionar uma nova linha para strace em system/sepolicy/private/file_contexts e copiar o contexto do arquivo original. Exemplo:
    /dev/socket/zygote      u:object_r:zygote_socket:s0
    + /system/bin/strace u:object_r:zygote_socket:s0
    
  • Adicione o parâmetro kernel ou bootconfig e inicialize o dispositivo no modo permissivo do SELinux. Você pode fazer isso adicionando androidboot.selinux=permissive a BOARD_KERNEL_CMDLINE ou a BOARD_BOOTCONFIG no Android 12 com kernel versão 5.10 ou superior. (Esta variável se torna somente leitura em build/core/Makefile , mas está sempre disponível em /device/*/BoardConfig .)

    Exemplo para o dispositivo Pixel (sailfish) em /device/google/marlin/sailfish/BoardConfig.mk :
    - BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...
    +BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...  androidboot.selinux=permissive
    
    Depois de fazer a alteração, compile e atualize a imagem de inicialização e o dispositivo inicializará no modo permissivo.