O ftrace é uma ferramenta de depuração que ajuda a entender o que está acontecendo no Kernel do Linux As seções a seguir detalham a funcionalidade básica do ftrace, o ftrace com atrace (que captura eventos do kernel) e ftrace dinâmico.
Para detalhes sobre a funcionalidade avançada de ftrace que não está disponível no
systrace, consulte a documentação do ftrace em
<kernel
tree>/Documentation/trace/ftrace.txt
Capturar eventos do kernel com o atrace
o atrace (frameworks/native/cmds/atrace
) usa ftrace para capturar
eventos do kernel. Por sua vez, o systrace.py (ou run_systrace.py em versões posteriores do
Catapult) usa o adb.
para executar o atrace no dispositivo. O atrace faz o seguinte:
- Configura o rastreamento do modo de usuário definindo uma propriedade
(
debug.atrace.tags.enableflags
). - Ativa a funcionalidade desejada do ftrace gravando no nós do ftrace. No entanto, como o ftrace é compatível com mais recursos, você pode definir alguns nós do sysfs e, em seguida, use o atrace.
Com exceção do rastreamento do tempo de inicialização, use o atrace para definir o para o valor apropriado. A propriedade é uma bitmask e não há maneira de determinar os valores corretos sem olhar para o cabeçalho apropriado (o que pode mudar entre as versões do Android).
Ativar eventos ftrace
Os nós do ftrace sysfs estão em /sys/kernel/tracing
e trace
os eventos são divididos em categorias no /sys/kernel/tracing/events
.
Para ativar eventos por categoria, use:
echo 1 > /sys/kernel/tracing/events/irq/enable
Para ativar eventos por evento, use:
echo 1 > /sys/kernel/tracing/events/sched/sched_wakeup/enable
Se eventos extras tiverem sido ativados ao gravar nos nós sysfs, eles
não podem ser redefinidos pelo atrace. Um padrão comum
para a exibição do dispositivo Qualcomm é ativar kgsl
(GPU) e
mdss
(pipeline de exibição) e depois usar atrace ou
Systrace:
adb shell "echo 1 > /sys/kernel/tracing/events/mdss/enable"
adb shell "echo 1 > /sys/kernel/tracing/events/kgsl/enable"
./systrace.py sched freq idle am wm gfx view binder_driver irq workq ss sync -t 10 -b 96000 -o full_trace.html
Você também pode usar ftrace sem atrace ou systrace, que são útil quando você quer traces somente do kernel (ou se você se esforçou para escrever a propriedade de rastreamento do modo de usuário manualmente). Para executar apenas ftrace:
- Defina o tamanho do buffer com um valor grande o suficiente para o trace:
echo 96000 > /sys/kernel/tracing/buffer_size_kb
- Ative o rastreamento:
echo 1 > /sys/kernel/tracing/tracing_on
- Execute o teste e desative o rastreamento:
echo 0 > /sys/kernel/tracing/tracing_on
- Despeje o rastro:
cat /sys/kernel/tracing/trace > /data/local/tmp/trace_output
O trace_output fornece o trace em forma de texto. Para visualizá-lo usando Catapult, pegue a Catapult repositório (em inglês) do GitHub e execute trace2html:
catapult/tracing/bin/trace2html ~/path/to/trace_file
Por padrão, isso grava trace_file.html
na mesma
diretório.
Correlacionar eventos
A visualização da Catapult e do ftrace pode ser útil registrar simultaneamente; por exemplo, alguns eventos ftrace (especialmente específicos do fornecedor não são visualizados pela Catapult. No entanto, os carimbos de data/hora da Catapult são em relação ao primeiro evento no trace ou a um carimbo de data/hora específico despejados pelo atrace, enquanto os carimbos de data/hora de ftrace brutos são baseados em um determinado origem absoluta do relógio no kernel do Linux.
Para encontrar um determinado evento ftrace em um evento do Catapult:
- Abra o registro ftrace bruto. Os traces em versões recentes do Systrace são
compactado por padrão:
- Se você capturou o Systrace com
--no-compress
, ele está o arquivo html na seção que começa com BEGIN TRACE. - Caso contrário, execute o html2trace na
Catapult
árvore (
tracing/bin/html2trace
) para descompactar o rastro.
- Se você capturou o Systrace com
- Encontre o carimbo de data/hora relativo na visualização do Catapult.
- Encontrar uma linha no início do trace que contenha
tracing_mark_sync
: O código será semelhante a este:<5134>-5134 (-----) [003] ...1 68.104349: tracing_mark_write: trace_event_clock_sync: parent_ts=68.104286
Se essa linha não existir (ou se você tiver usado ftrace sem atrace), os tempos serão relativos a partir do primeiro evento no registro do ftrace.- Adicione o carimbo de data/hora relativo (em milissegundos) ao valor em
parent_ts
(em segundos). - Pesquise o novo carimbo de data/hora.
- Adicione o carimbo de data/hora relativo (em milissegundos) ao valor em
Essas etapas devem colocar você no evento (ou pelo menos muito próximo dele).
Usar ftrace dinâmico
Quando o Systrace e o ftrace padrão não são suficientes, há uma última recurso disponível: ftrace dinâmico O ftrace dinâmico envolve reescrever do código do kernel após a inicialização e, por isso, não fica disponível na produção os kernels por motivos de segurança. No entanto, todos os bugs de desempenho difíceis A causa raiz de 2015 e 2016 foi o uso de ftrace dinâmico. É especialmente eficiente para depurar períodos de inatividade ininterruptos porque você pode conseguir um stack trace no kernel toda vez que você clica na função que aciona a suspensão ininterrupta. Também é possível depurar seções com interrupções e preempções desativadas, o que pode ser muito úteis para comprovar problemas.
Para ativar o ftrace dinâmico, edite o defconfig do seu kernel:
- Remova CONFIG_STRICT_MEMORY_RWX (se estiver presente). Se você estiver usando a versão 3.18 ou mais recente e arm64, não estará lá.
- Adicione o seguinte: CONFIG_DYNAMIC_FTRACE=y, CONFIG_FUNCTION_TRACER=y, CONFIG_IRQSOFF_TRACER=y, CONFIG_FUNCTION_PROFILER=y e CONFIG_PREEMPT_TRACER=y
- Recrie e inicialize o novo kernel.
- Execute o seguinte comando para verificar os rastreadores disponíveis:
cat /sys/kernel/tracing/available_tracers
- Confirme se o comando retorna
function
,irqsoff
.preemptoff
epreemptirqsoff
. - Execute o seguinte comando para garantir o funcionamento do ftrace dinâmico:
cat /sys/kernel/tracing/available_filter_functions | grep <a function you care about>
Depois de concluir essas etapas, você terá o ftrace dinâmico, o criador de perfil de função, o Profiler irqsoff e o criador de perfil preemptoff estão disponíveis. Nós forçamos recomendamos a leitura da documentação do ftrace sobre esses tópicos antes de usar porque são poderosos, mas complexos. irqsoff e preemptoff são, principalmente, útil para confirmar se os motoristas estão deixando para trás desativada por muito tempo.
O criador de perfil de função é a melhor opção para problemas de desempenho e costuma ser usada para descobrir onde uma função está sendo chamada.
Se os dados do criador de perfil de função não forem específicos o suficiente, será possível combinar
tracepoints ftrace com o criador de perfil de função. Os eventos ftrace podem ser ativados
exatamente da mesma forma que de costume, e eles serão intercalados com seu rastro.
Isso é ótimo quando há um sono longo e ininterrupto ocasional em um horário específico
que você quer depurar: defina o filtro ftrace para a função desejada
ativar tracepoints, capturar trace. É possível analisar o rastro resultante com
trace2html
, encontre o evento que você quer e acesse stack traces próximos
no rastreamento bruto.
Usar bloqueio estatístico
Às vezes, o ftrace não é suficiente e é preciso depurar o que parece ser
pode ser contenção de bloqueio do kernel. Vale a pena testar mais uma opção de kernel:
CONFIG_LOCK_STAT
: Este é um último recurso, pois é extremamente
difícil de trabalhar em dispositivos Android porque infla o tamanho do
além do kernel que a maioria dos dispositivos consegue suportar.
No entanto, o lockstat usa o valor de
infraestrutura de bloqueio, o que é útil para muitos outros apps. Todos
ao trabalhar na exibição do dispositivo deve descobrir uma maneira de fazer essa opção funcionar.
em todos os dispositivos, porque haverá momento em que você pensará
"Se eu pudesse ativar o LOCK_STAT
, poderia confirmar ou refutar isso
como o problema em cinco minutos em vez de cinco dias".
Se for possível inicializar um kernel com a opção de configuração, o rastreamento de bloqueio será semelhante à ftrace:
- Ative o rastreamento:
echo 1 > /proc/sys/kernel/lock_stat
- Execute o teste.
- Desative o rastreamento:
echo 0 > /proc/sys/kernel/lock_stat
- Despeje seu rastro:
cat /proc/lock_stat > /data/local/tmp/lock_stat
Se precisar de ajuda para interpretar a saída resultante, consulte a documentação da lockstat
em <kernel>/Documentation/locking/lockstat.txt
.
Usar tracepoints do fornecedor
Use os tracepoints upstream primeiro, mas às vezes você vai precisar usar os tracepoints do fornecedor:
{ "gfx", "Graphics", ATRACE_TAG_GRAPHICS, { { OPT, "events/mdss/enable" }, { OPT, "events/sde/enable" }, { OPT, "events/mali_systrace/enable" }, } },
Os pontos de rastreamento são extensíveis pelo serviço HAL, permitindo adicionar rastros específicos do dispositivo pontos/categorias. Os pontos de rastreamento são integrados ao perfetto, atrace/systrace e sistemas no dispositivo app de rastreamento padrão.
As APIs para implementar pontos de rastreamento/categorias são:
- listCategories()generates (vec<TracingCategory>>);
- enableCategories(vec<string>>) gera (status de status);
- desativaAllCategories() gera (status de status);