ftrace to narzędzie do debugowania, które pozwala zrozumieć, co dzieje się Jądro systemu Linux. W poniższych sekcjach opisano podstawową funkcję stóp (ftrace) użycie z atrace (które przechwytuje zdarzenia jądra) i dynamicznym ftrace.
Szczegółowe informacje o zaawansowanych funkcjach śledzenia, które nie są dostępne na
systrace, zapoznaj się z dokumentacją ftrace pod adresem
<kernel
tree>/Documentation/trace/ftrace.txt
Przechwytywanie zdarzeń jądra za pomocą atrace
atrace (frameworks/native/cmds/atrace
) używa ftrace do przechwytywania
zdarzenia jądra systemu operacyjnego. Z kolei plik systrace.py (lub run_systrace.py w nowszych wersjach
Catapult) używa narzędzia adb
aby biegać na urządzeniu. atrace wykonuje te działania:
- Konfiguruje śledzenie w trybie użytkownika przez ustawienie usługi
(
debug.atrace.tags.enableflags
). - Włącza żądaną funkcję śledzenia, zapisując w odpowiednim węzłów ftrace sysfs. Ftrace obsługuje jednak więcej funkcji, więc możesz ustawić samodzielnie używasz niektórych węzłów sysfs, a następnie używaj atrace.
Z wyjątkiem śledzenia czasu uruchamiania korzystaj z atrybutu atrace, aby ustawić do odpowiedniej wartości. Właściwość to maska bitowa i nie ma dobrej określania prawidłowych wartości poza sprawdzaniem odpowiedniego nagłówka. (co może się zmieniać w zależności od wersji Androida).
Włącz zdarzenia ftrace
Węzły ftrace sysfs są w /sys/kernel/tracing
i logu czasu
wydarzenia są podzielone na kategorie w kategorii /sys/kernel/tracing/events
.
Aby włączyć zdarzenia dla poszczególnych kategorii, użyj:
echo 1 > /sys/kernel/tracing/events/irq/enable
Aby włączyć zdarzenia dla poszczególnych zdarzeń, użyj:
echo 1 > /sys/kernel/tracing/events/sched/sched_wakeup/enable
Jeśli dodatkowe zdarzenia zostały włączone przez zapis w węzłach sysfs, zostaną
nie może być resetowany przez atrace. Wspólny wzorzec
dla wyświetlenia urządzenia Qualcomm jest włączenie kgsl
(GPU) i
mdss
(potok wyświetlania), a następnie użyj parametru atrace lub
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
Możesz też użyć ftrace bez atrace i systrace, które jest przydatne, gdy chcesz korzystać z logów czasu tylko dla jądra (lub jeśli poświęcisz czas na ręcznie korzystając z właściwości śledzenia w trybie użytkownika). Aby biegać prosto:
- Ustaw rozmiar bufora na wartość wystarczająco dużą dla logu czasu:
echo 96000 > /sys/kernel/tracing/buffer_size_kb
- Włącz śledzenie:
echo 1 > /sys/kernel/tracing/tracing_on
- Przeprowadź test, a następnie wyłącz śledzenie:
echo 0 > /sys/kernel/tracing/tracing_on
- Zrzuć ślad:
cat /sys/kernel/tracing/trace > /data/local/tmp/trace_output
Parametr Tras_output daje ślad tekstowy w postaci tekstowej. Aby zwizualizować to za pomocą Katapulta, zdobądź Katapulta z GitHub i uruchom tag track2html:
catapult/tracing/bin/trace2html ~/path/to/trace_file
Domyślnie zapisuje trace_file.html
w tym samym
katalogu.
Skoreluj zdarzenia
Często warto spojrzeć na wizualizację Katapulta i ft zapisywać jednocześnie; np. niektóre zdarzenia statystyczne (zwłaszcza związane z danym dostawcą, tych) nie są wizualizowane przez Catapult. Sygnatury czasowe Catapulta są jednak względem pierwszego zdarzenia w logu czasu lub konkretnej sygnatury czasowej są dodawane przez parametr atrace, a nieprzetworzone sygnatury czasowe stopy są oparte na konkretnym z zegarem bezwzględnym w jądrze Linuksa.
Aby znaleźć dane zdarzenie ftrace z wydarzenia Catapult:
- Otwórz dziennik nieprzetworzonych danych Firebase. Ślady w ostatnich wersjach systrace to
domyślnie skompresowane:
- Jeśli zapisałaś systrace za pomocą
--no-compress
, jest to w: pliku html w sekcji rozpoczynającej się od tagu „POCZĄTEK TRACE”. - Jeśli tak nie jest, uruchom narzędzie html2trace ze źródła
Katapulta
drzewo (
tracing/bin/html2trace
), by zdekompresować log czasu.
- Jeśli zapisałaś systrace za pomocą
- Znajdź względną sygnaturę czasową w wizualizacji Catapult.
- Znajdź wiersz na początku logu czasu zawierającego
tracing_mark_sync
Powinien wyglądać mniej więcej tak:<5134>-5134 (-----) [003] ...1 68.104349: tracing_mark_write: trace_event_clock_sync: parent_ts=68.104286
Jeśli ta linia nie istnieje (lub jeśli użyto parametru ftrace bez atrybutu atrace), czasy będą względne względem pierwszego zdarzenia w logu testowym.- Dodaj względną sygnaturę czasową (w milisekundach) do wartości w
parent_ts
(w sekundach). - Wyszukaj nową sygnaturę czasową.
- Dodaj względną sygnaturę czasową (w milisekundach) do wartości w
Te czynności powinny sprawić, że znajdziesz się w wydarzeniu (lub przynajmniej w jego pobliżu).
Używanie dynamicznych stoperów
Gdy systrace i stopnie standardowe są niewystarczające, istnieje jeszcze dostępne odwołanie: dynamic ftrace. Dynamiczny ruch obejmuje przepisywanie kodu jądra po uruchomieniu, przez co nie jest on dostępny w środowisku produkcyjnym przez jądra systemu operacyjnego. Każdy trudny błąd w działaniu Rok 2015 i 2016 został ostatecznie zakłócony przy użyciu dynamicznych ścieżek. Szczególnie ważne jest, bardzo przydatne do debugowania uśpień niewyrażonych, ponieważ możesz uzyskać zrzut stosu w jądrze po każdym uruchomieniu funkcji aktywującej nieprzerwany sen. Możesz też debugować sekcje z wyłączonymi przerwami i wywłaszczeniem, co może może być bardzo przydatna przy weryfikowaniu problemów.
Aby włączyć dynamiczne ftrace, zmodyfikuj plik defconfig jądra:
- Usuń plik CONFIG_STRICT_MEMORY_RWX (jeśli jest dostępny). Jeśli używasz 3.18 lub nowszego i arm64, tego nie ma.
- Dodaj następujące elementy: CONFIG_DYNAMIC_FTRACE=y, CONFIG_FUNCTION_TRACER=y, CONFIG_IRQSOFF_TRACER=y, CONFIG_FUNCTION_PROFILER=y i CONFIG_PREEMPT_TRACER=y
- Odbuduj i uruchom nowe jądro.
- Uruchom to polecenie, aby sprawdzić dostępne trackery:
cat /sys/kernel/tracing/available_tracers
- Potwierdź, że polecenie zwraca
function
,irqsoff
,preemptoff
ipreemptirqsoff
. - Uruchom to polecenie, aby upewnić się, że ścieżka dynamiczna działa:
cat /sys/kernel/tracing/available_filter_functions | grep <a function you care about>
Po wykonaniu tych czynności uzyskasz dynamiczne ftrace, program profilujący funkcji, oraz narzędzie do profilowania irqsoff i profilowanie z wyprzedzeniem. Zdecydowanie zdecydowanie zalecamy zapoznanie się z dokumentacją dotyczącą tych tematów ponieważ są zaawansowane, ale złożone. irqsoff i zapobiegawcze przydatne do potwierdzenia, że kierowcy mogą przerywać pracę Wyłączona zbyt długo.
Narzędzie do profilowania funkcji to najlepsza opcja w przypadku problemów z wydajnością. służy do ustalenia miejsca wywołania funkcji.
Jeśli dane z narzędzia do profilowania funkcji nie są wystarczająco szczegółowe, możesz połączyć
ftrace logpoints za pomocą narzędzia do profilowania funkcji. zdarzenia ftrace można włączyć w:
dokładnie tak samo jak zwykle i zostaną przeplatane z Twoim logiem czasu.
To świetne rozwiązanie, jeśli o danej porze sen sporadycznie się zdarza.
funkcja, którą chcesz debugować: ustaw filtr ftrace na wybraną funkcję,
włącz śledzenie punktów, rozpocznij ślad. Otrzymany log czasu możesz przeanalizować za pomocą
trace2html
, znajdź interesujące Cię zdarzenie i uzyskaj zrzuty stosu w pobliżu
w nieprzetworzonym logu czasu.
Użyj metody Lockstat
Czasami parametr Ftrace nie wystarcza i koniecznie trzeba debugować,
rywalizację o blokadę jądra systemu operacyjnego. Jest jeszcze jedna opcja jądra, którą warto wypróbować:
CONFIG_LOCK_STAT
To ostateczna sytuacja, ponieważ
praca na urządzeniach z Androidem powoduje zwiększenie rozmiaru ekranu.
jądra systemu operacyjnego wykracza poza to, co obsługuje większość urządzeń.
Parametr Lockstat korzysta jednak z funkcji debugowania
infrastrukturą blokującą, co przydaje się w wielu innych aplikacjach. Wszyscy
podczas otwierania urządzenia powinno znaleźć sposób na uruchomienie tej opcji
na każdym urządzeniu, ponieważ przyejdzie czas, gdy zaczniesz się zastanawiać,
„Gdybym tylko mogła włączyć usługę LOCK_STAT
, mogłabym to potwierdzić lub odrzucić
jako źródło problemu w 5 minut, a nie w 5 dni”.
Jeśli możesz uruchomić jądro z opcją konfiguracji, śledzenie blokady jest podobne do ftrace:
- Włącz śledzenie:
echo 1 > /proc/sys/kernel/lock_stat
- Przeprowadź test.
- Wyłącz śledzenie:
echo 0 > /proc/sys/kernel/lock_stat
- Zrzut logu czasu:
cat /proc/lock_stat > /data/local/tmp/lock_stat
Pomoc w interpretacji wynikowych danych wyjściowych znajdziesz w dokumentacji narzędzia Lockstat.
na stronie <kernel>/Documentation/locking/lockstat.txt
.
Użyj punktów śledzenia dostawcy
Najpierw użyj punktów śledzenia z góry, ale czasami trzeba też użyć punktów śledzenia dostawcy:
{ "gfx", "Graphics", ATRACE_TAG_GRAPHICS, { { OPT, "events/mdss/enable" }, { OPT, "events/sde/enable" }, { OPT, "events/mali_systrace/enable" }, } },
Punkty śledzenia można rozszerzać przez usługę HAL, co pozwala dodawać log czasu dla konkretnego urządzenia punktów/kategorii. Punkty śledzenia są zintegrowane z systemami perfetto, atrace/systrace i systemem na urządzeniu. do śledzenia aktywności.
Interfejsy API do implementacji punktów śledzenia/kategorii:
- listCategory()generates (vec<TrackingCategory> );
- enabledKategorie(vec<string> categories) generate (Status status);
- offAllCategory() generuje (Stan).