ftrace è uno strumento di debug che consente di capire cosa succede all'interno del kernel Linux. Le seguenti sezioni descrivono nel dettaglio le funzionalità di base ftrace, ftrace utilizzo con atrace (che acquisisce gli eventi del kernel) e ftrace dinamica.
Per dettagli sulla funzionalità ftrace avanzata non disponibile da
systrace, consulta la documentazione relativa a ftrace all'indirizzo
<kernel
tree>/Documentation/trace/ftrace.txt
Acquisire eventi kernel con atrace
atrace (frameworks/native/cmds/atrace
) utilizza ftrace per acquisire
eventi kernel. A sua volta, systrace.py (o run_systrace.py nelle versioni successive di
Catapult) utilizza ADB
per eseguire l'atrace sul dispositivo. atrace esegue le seguenti operazioni:
- Configura il tracciamento della modalità utente impostando una proprietà
(
debug.atrace.tags.enableflags
) - Abilita la funzionalità ftrace desiderata scrivendo nell'istanza appropriata ftrace sysfs node. Tuttavia, poiché ftrace supporta più funzionalità, puoi impostare alcuni nodi sysfs e poi utilizza atrace.
Con l'eccezione del tracciamento del tempo di avvio, utilizza l'atrace per impostare con il valore appropriato. La proprietà è una maschera di bit e non c'è niente di meglio un modo per determinare i valori corretti, senza limitarsi a esaminare l'intestazione appropriata (che potrebbe variare tra una release di Android e l'altra).
Attiva eventi ftrace
I nodi ftrace sysfs si trovano in /sys/kernel/tracing
e tracciano
eventi sono suddivisi in categorie in /sys/kernel/tracing/events
.
Per abilitare gli eventi in base alla categoria, utilizza:
echo 1 > /sys/kernel/tracing/events/irq/enable
Per attivare gli eventi per singolo evento, utilizza:
echo 1 > /sys/kernel/tracing/events/sched/sched_wakeup/enable
Se sono stati abilitati eventi aggiuntivi tramite la scrittura sui nodi sysfs,
non essere reimpostati da atrace. Un modello comune
per la generazione di dispositivi Qualcomm è l'attivazione di kgsl
(GPU) e
mdss
(tracciamento della pipeline) e poi usa l'atrace o
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
Puoi anche usare ftrace senza atrace o systrace, che utile quando vuoi tracce solo kernel (o se hai dedicato tempo a scrivere manualmente la proprietà di tracciamento in modalità utente). Per correre solo con ftrace:
- Imposta la dimensione del buffer su un valore abbastanza grande per la traccia:
echo 96000 > /sys/kernel/tracing/buffer_size_kb
- Attiva il tracciamento:
echo 1 > /sys/kernel/tracing/tracing_on
- Esegui il test, quindi disabilita il tracciamento:
echo 0 > /sys/kernel/tracing/tracing_on
- Esegui il dump della traccia:
cat /sys/kernel/tracing/trace > /data/local/tmp/trace_output
trace_output fornisce la traccia in formato testo. Per visualizzarla usando Catapulta, prendi Catapulta repository Git da GitHub ed esegui trace2html:
catapult/tracing/bin/trace2html ~/path/to/trace_file
Per impostazione predefinita, viene scritto trace_file.html
nello stesso
.
Correla eventi
Spesso è utile osservare la visualizzazione Catapulta e la ftrace. registrare simultaneamente; Ad esempio, alcuni eventi ftrace (soprattutto le specifiche del quelli) non vengono visualizzati da Catapult. Tuttavia, i timestamp di Catapult sono in relazione al primo evento nella traccia o a un timestamp specifico dumping da atrace, mentre i timestamp ftrace non elaborati si basano su un valore con orologio assoluto nel kernel Linux.
Per trovare un determinato evento ftrace da un evento Catapult:
- Apri il log ftrace non elaborato. Le tracce nelle versioni recenti di systrace sono
sono compresse per impostazione predefinita:
- Se hai acquisito la tua traccia di sistema con
--no-compress
, è in il file html nella sezione che inizia con BEGIN TRACE. - In caso contrario, esegui html2trace dal
Catapulta
struttura (
tracing/bin/html2trace
) per decomprimere la traccia.
- Se hai acquisito la tua traccia di sistema con
- Trova il timestamp relativo nella visualizzazione Catapult.
- Trova una riga all'inizio della traccia contenente
tracing_mark_sync
. Dovrebbe avere il seguente aspetto:<5134>-5134 (-----) [003] ...1 68.104349: tracing_mark_write: trace_event_clock_sync: parent_ts=68.104286
Se questa linea non esiste (o se hai utilizzato ftrace senza atrace), i tempi saranno relativi al primo evento nel log ftrace.- Somma il timestamp relativo (in millisecondi) al valore in
parent_ts
(in secondi). - Cerca il nuovo timestamp.
- Somma il timestamp relativo (in millisecondi) al valore in
Questi passaggi dovrebbero farti avvicinare (o almeno molto vicino) all'evento.
Usa ftrace dinamico
Quando systrace e ftrace standard sono insufficienti, ce n'è un'ultima ricorso disponibile: Dynamic ftrace. L'ftrace dinamico prevede la riscrittura di codice kernel dopo l'avvio e di conseguenza non è disponibile in produzione per motivi di sicurezza. Tuttavia, ogni singolo bug difficile Il 2015 e il 2016 sono stati la causa principale dell'utilizzo di ftrace dinamici. In particolare molto utile per eseguire il debug di periodi di sospensione senza interruzioni perché consente di ottenere un'analisi dello stack nel kernel ogni volta che premi la funzione che attiva un sonno senza interruzioni. Puoi anche eseguire il debug di sezioni in cui gli interrupt e i prerilasci disabilitati, molto utile per provare i problemi.
Per attivare ftrace dinamica, modifica la defconfig del kernel:
- Rimuovi CONFIG_STRICT_MEMORY_RWX (se presente). Se hai la versione 3.18 o e arm64, non c'è.
- Aggiungi quanto segue: CONFIG_DYNAMIC_FTRACE=y, CONFIG_FUNCTION_TRACER=y, CONFIG_IRQSOFF_TRACER=y, CONFIG_FUNCTION_PROFILER=y e CONFIG_PREEMPT_TRACER=y
- Ricrea e avvia il nuovo kernel.
- Esegui il comando seguente per verificare la presenza di utilità di traccia disponibili:
cat /sys/kernel/tracing/available_tracers
- Conferma che il comando restituisce
function
,irqsoff
,preemptoff
epreemptirqsoff
. - Esegui il comando seguente per assicurarti che ftrace dinamico funzioni:
cat /sys/kernel/tracing/available_filter_functions | grep <a function you care about>
Dopo aver completato questi passaggi, avrai ftrace dinamico, il profiler di funzione, il profiler irqsoff e il profiler prerilascio disponibile. Abbiamo fortemente consigliamo di leggere la documentazione di ftrace su questi argomenti prima di usare perché sono potenti ma complesse. irqsoff e preemptoff sono principalmente è utile per verificare se i conducenti possono lasciare interruzioni o prerilascio spento troppo a lungo.
Il profiler di funzioni è l'opzione migliore per i problemi di prestazioni ed è spesso usato per scoprire dove viene chiamata una funzione.
Se i dati del profiler di funzione non sono abbastanza specifici, puoi combinare
tracepoint ftrace con il profiler di funzione. gli eventi ftrace possono essere abilitati
esattamente come al solito e saranno interlacciati con la tua traccia.
Questa opzione è ideale se di tanto in tanto c'è un sonno lungo e ininterrotto in un determinato
funzione di cui si desidera eseguire il debug: imposta il filtro ftrace sulla funzione desiderata,
attivare i tracepoint, creare una traccia. Puoi analizzare la traccia risultante con
trace2html
, trova l'evento che ti interessa, poi recupera analisi dello stack nelle vicinanze
nella traccia non elaborata.
Usa Lockstat
A volte, ftrace non è sufficiente e devi davvero eseguire il debug di ciò che sembra
conflittuale del blocco kernel. C'è un'altra opzione kernel che vale la pena provare:
CONFIG_LOCK_STAT
. Questa è l'ultima risorsa perché è estremamente
è difficile lavorare sui dispositivi Android perché aumenta le dimensioni
oltre quello che è in grado di gestire la maggior parte dei dispositivi.
Lockstat utilizza invece il debug
di blocco dell'infrastruttura, utile per molte altre app. Per tutti
lavorare sulla visualizzazione del dispositivo dovrebbe trovare un modo per far funzionare quell'opzione
su tutti i dispositivi perché ci sarà un momento in cui
"Se solo potessi attivare LOCK_STAT
, potrei confermare o confutare la richiesta
come problema in cinque minuti invece che in cinque giorni".
Se riesci ad avviare un kernel con l'opzione di configurazione, il tracciamento del blocco è simile ftrace:
- Attiva il tracciamento:
echo 1 > /proc/sys/kernel/lock_stat
- Esegui il test.
- Disattiva il tracciamento:
echo 0 > /proc/sys/kernel/lock_stat
- Esegui il dump della traccia:
cat /proc/lock_stat > /data/local/tmp/lock_stat
Per informazioni sull'interpretazione dell'output risultante, consulta la documentazione di lockstat
alle ore <kernel>/Documentation/locking/lockstat.txt
.
Utilizza i punti di traccia dei fornitori
Utilizza prima i tracepoint upstream, ma a volte dovrai usare quelli del fornitore:
{ "gfx", "Graphics", ATRACE_TAG_GRAPHICS, { { OPT, "events/mdss/enable" }, { OPT, "events/sde/enable" }, { OPT, "events/mali_systrace/enable" }, } },
I tracepoint sono estendibili dal servizio HAL che ti consente di aggiungere tracce specifiche del dispositivo punti/categorie. I tracepoint sono integrati con perfetto, atrace/systrace e con il sistema on-device app di tracciamento.
Le API per l'implementazione di tracepoint/categorie sono:
- listCategories()genera (vec<TrackingCategory> categorie);
- EnableCategories(vec<string>categories) genera (Status status);
- disattivaAllCategories() genera (stato di stato);