Com o strace, é possível ver as chamadas do sistema que um processo faz e o que essas chamadas retornam.
Criar strace
Para criar o strace, execute o seguinte:
mmma -j6 external/strace
Anexar a um processo em execução
O caso de uso mais simples e comum do strace é anexá-lo a um processo em execução, o que pode ser feito com:
adb shell strace -f -p PID
A flag -f
informa ao strace para anexar a todos os threads no
processo, além de qualquer novo thread gerado posteriormente.
Um processo típico faz muitas chamadas de sistema. Portanto, revise a página de manual do strace para saber como coletar apenas os dados que realmente interessam.
Usar em um app
Para usar o strace em um app:
- Configure o dispositivo para executar o strace. Você precisa ser root, desativar o SELinux e reiniciar
o ambiente de execução para remover o filtro seccomp, que impede a execução do strace:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- Configure um diretório gravável globalmente para registros strace, porque o strace será executado com o uid do
app:
adb shell mkdir -m 777 /data/local/tmp/strace
- Escolha o processo a ser rastreado e inicie-o:
adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
- Inicie o processo normalmente.
Usar no zigoto
Para usar o strace no zygote, corrija a linha relevante do zygote init.rc
(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
Receber registros strace durante a inicialização do Android
Para receber registros strace durante a inicialização do Android, faça as seguintes mudanças:
- Como o nome do processo muda de
zygote
parastrace
, o serviço especificado pode não iniciar devido à falta de SELinuxfile_context
parastrace
. A solução é adicionar uma nova linha para strace emsystem/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. Para fazer isso, adicione
androidboot.selinux=permissive
aBOARD_KERNEL_CMDLINE
ou aBOARD_BOOTCONFIG
no Android 12 com a versão 5.10 ou mais recente do kernel. Essa variável se torna somente leitura embuild/core/Makefile
, mas está sempre disponível em/device/*/BoardConfig
.
Exemplo para o dispositivo Pixel (sailfish) em/device/google/marlin/sailfish/BoardConfig.mk
: Depois de fazer a mudança, crie e transfira a imagem de inicialização. O dispositivo será inicializado no modo permissivo.- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive