Как выполнить трассировку пользовательского модуля ядра Linux с помощью трассировки-cmd?Linux

Ответить
Anonymous
 Как выполнить трассировку пользовательского модуля ядра Linux с помощью трассировки-cmd?

Сообщение Anonymous »

Я написал модуль ядра, назовем его my_mod.ko. Теперь я хочу проанализировать производительность моего модуля.
Для этого мне хотелось бы знать, сколько времени занимает каждый вызов функции. Из этой статьи я понял, что трассировка function_graph должна достичь моей цели.
При непосредственном использовании sysfs синтаксис из документации работает:

Код: Выделить всё

cd /sys/kernel/tracing
echo '*:mod:my_mod' > set_ftrace_filter
cat tracing_on
echo function_graph > current_tracer
echo 1 > tracing_on
# some command that triggers my kernel driver
echo 0 > tracing_on
cat trace > /tmp/my_mod.trace

Код: Выделить всё

my_mod.trace
содержит список вызовов функций внутри моего модуля с заголовком, какая программа пользовательского пространства или irq вызвала код.
Но выходные данные из буфера /sys/kernel/tracing/trace не являются файлом трассировки.dat. С ним труднее работать, так как его невозможно прочитать с помощью KernelShark или отчета трассировки-cmd.

Вопрос

Как я могу отслеживать вызовы функций моего модуля с выводом, который легко анализировать?
Под «простым» подразумевается инструмент для формата, который позволяет фильтровать, отображать или агрегировать данные, аналогично упомянутым инструментам. выше.

Что я пробовал

Следующие команды приводили к различным ошибкам:

Код: Выделить всё

# trace-cmd record -f '*:mod:my_mod' -p function_graph cat /dev/my_mod
filter must come after event
# trace-cmd record -e '*:mod:my_mod' -p function_graph cat /dev/my_mod
trace-cmd: No such file or directory
No events enabled with *:mod:my_mod

# trace-cmd record -e sched -p function_graph -f '*mod:my_mod' cat /dev/my_mod
[13187.458282] event filter parse error: error: Error
Command: (*mod:my_mod)
^
Failed filter of /sys/kernel/tracing/events/sched/sched_switch/filter
[13187.473989] event filter parse error: error: Error
Command: (*mod:my_mod)
Этот фильтр работает, но отображает все IRQ (там много несвязанного вывода, я предполагаю, что фильтр работает не так, как я ожидал):

Код: Выделить всё

# trace-cmd record -e irq -p function_graph -f '*:mod:my_mod' cat /dev/my_mod
Возможно, я неправильно понимаю, как взаимодействуют файлы в sysfs (например, set_ftrace_filter) и различные параметры трассировки-cmd, поэтому буду очень признателен за более подробное изучение этих терминов при предоставлении решения.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -trace-cmd
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»