Strace permite que você veja as chamadas de sistema que um processo faz e o que essas chamadas de sistema retornam.
Caminho de construção
Para construir o strace, execute o seguinte:
mmma -j6 external/strace
Anexando 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 você pode fazer com:
adb shell strace -f -p PID
O sinalizador -f
diz ao strace para anexar a todos os threads no processo, além de quaisquer novos threads gerados posteriormente.
Um processo típico faz muitas chamadas de sistema, então você vai querer revisar a página man do strace para aprender como coletar apenas os dados nos quais você realmente está interessado.
Usando em um aplicativo
Para usar strace em um aplicativo:
- Configure o dispositivo para que você possa executar o strace. Você precisa ser root, desativar o SELinux e reiniciar o tempo de execução para remover o filtro seccomp que, de outra forma, impedirá a execução do strace:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- Configure um diretório gravável mundialmente para logs strace, porque o strace estará sendo executado no uid do aplicativo:
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.
Usando no zigoto
Para usar strace no zigoto, corrija a linha init.rc
zygote 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
parastrace
, o serviço fornecido pode falhar ao iniciar devido à falta do 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 SELinux. Você pode fazer isso adicionando
androidboot.selinux=permissive
aBOARD_KERNEL_CMDLINE
ou aBOARD_BOOTCONFIG
no Android 12 com kernel versão 5.10 ou superior. (Esta 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
:- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive
Depois de fazer a alteração, crie e atualize a imagem de inicialização e o dispositivo inicializará no modo permissivo.