Как получить полный граф вызовов, начиная с определенной функции в ftrace в Linux?
Я хочу отследить конкретную функцию с помощью ftrace, но со всеми последующими вызовами из этой функции.
Мне удалось запустить ftrace с фильтром для моей желаемой функции, но теперь она показывает только эту конкретную вызванную функцию.
Поэтому мой вопрос: как распечатать все функции, вызываемые из определенной функции, функции, вызываемые этими функциями, и так далее?
2 ответа
Я был в состоянии решить проблему. Вот решение с kmalloc в качестве примера.
cd /sys/kernel/debug/tracing
echo kmalloc > set_graph_function
echo function_graph > current_tracer
cat trace
Обязательно сбросьте все фильтры (например, set_ftrace_filter) перед использованием function_graph.
Вы также можете установить max_graph_depth и получить большую глубину графика функции.
Следующие шаги помогут в создании графика функции выбранной функции Linux.
1. cd /sys/kernel/debug/tracing
2. cat /dev/null > trace
3. echo generic_make_request > set_graph_function
4. echo 10 > max_graph_depth
5. echo function_graph > current_tracer
6. echo 1 > tracing_on
7. dd if=/dev/sddk of=~/test bs=512 count=5
8. cp trace ~/dd_trace_depth10
9. echo 0 > tracing_on
10. echo > set_graph_function
11. echo 0 > max_graph_depth
12. cat /dev/null > trace
Включить трассировку: в этом примере я выбрал функцию фильтра как "generic_make_request". Таким образом, шаг 3 устанавливает графическую функцию на linux-функцию "generic_make_request". Затем на шаге 4 мы установили глубину графика равной 10. Шаг 5 устанавливает текущий трассер как "function_graph". После того, как все это установлено, мы включаем трассировку.
Действие: Теперь мы выполняем действие, для которого мы хотели трассировку Linux. В этом примере мы выполняем ввод-вывод с помощью команды dd. Эта команда попадет в функцию generic_make_request, и файл /sys/kernel/debug/tracing/trace будет заполнен графиком функции.
Отключить трассировку: шаги 9, 10, 11 отключат трассировку