2013-03-07 20 views
12

Chcę śledzić funkcję podczas procesu uruchamiania jądra z ftrace function_graph, aby zrozumieć, co robi, ale nie jest dostępna w available_filter_functions.Jak udostępnić funkcję jądra Linuxa do ftrace function_graph tracer?

Próbowałem wyeksportować go za pomocą EXPORT_SYMBOL(), zgadując, że go udostępni, ale tak nie jest.

Masz rozwiązanie?

Aby uzyskać informacje, funkcje, które chcę śledzić, to persistent_ram_init_ringbuffer i persistent_ram_early_init w jądrze systemu Android 3.4.

Czytam poprzez dokumentację ale nic nie znalazłem na ten temat i grep nie pomogło więcej ...

Dzięki

+0

Z mojego rozumienia Ftrace dynamiczne śledzenie funkcji polega na wywołaniu funkcji mcount na początku każdej funkcji jądra. Jeśli funkcja, którą Cię interesuje, nie ma możliwości, że dostępny filtr może się nie pojawić. Czy uważasz, że nie używasz dynamicznego śledzenia? Może przynieść lepsze wyniki. –

+1

Wydaje się, że EXPORT_SYMBOL ma więcej wspólnego z ładowaniem modułu jądra rozwiązującego problemy licencyjne GPL/non-GPL, a nie Ftrace. – bazza

+1

Kiedy wyświetlasz available_filter_functions, czy coś się w ogóle wyświetla? Z tego, co mogę powiedzieć, kiedy kompilujesz jądro za pomocą CONFIG_FUNCTION_TRACER (i wszystkich innych gqbtr frac) włączonych funkcję śledzenia wejścia/wyjścia jądra zaimplementowano poprzez ustawienie opcji w wierszu poleceń gcc. Te opcje powodują, że gcc emituje określone wywołanie funkcji dla każdej kompilowanej przez siebie funkcji. Jeśli dobrze to rozumiem, oznacza to, że każda funkcja jądra Linuksa powinna być automatycznie przechwytywana przez ftrace. To skłoniło mnie do zastanowienia się, czy cokolwiek w ogóle było możliwe do prześledzenia w twoim jądrze. – bazza

Odpowiedz

8

Problem polega na tym, że funkcje te są opatrzone adnotacjami za pomocą __init i __devinit, które są czarne na liście funkcji śledzenia funkcji ftrace.

Dlaczego? Ponieważ jako funkcje init modułów (lub funkcje init jądra) są one ładowane podczas inicjalizacji i usuwane po zakończeniu inicjalizacji. Każda funkcja śledzenia śladu jest przechowywana w specjalnym kompaktowym stole. Obecnie nie ma sposobu, aby powiedzieć ftrace, że te funkcje zostały usunięte (zwolnione) i że ftrace powinien usunąć je ze swojej tabeli. Gdybyśmy po prostu to zignorowali, to po włączeniu śledzenia funkcji, ftrace spróbuje zmodyfikować lokalizacje, które już nie istnieją i mogą powodować różnego rodzaju problemy (pamiętacie błąd e1000e?).

Jeśli naprawdę chcesz je prześledzić, usuń te adnotacje. Następnie powinny pojawić się na liście funkcji do śledzenia.

+0

Dziękuję za odpowiedź. Byłem świadomy 'notrace', ale nie zakresu' __init' i '__devinit'. –

+1

Wow .... miło cię widzieć tutaj Steven Rostedt. Z pewnością jesteś jednym z oryginalnych autorów API ftrace w jądrze Linux. –

+0

Nie można również prześledzić * sched_wakeup *, nawet jeśli oczywiście nie zawiera flagi __init lub __devinit. – Claudio