Я написал скрипт, который будет отслеживать все команды ядра, выполняемые определенной командой, используя ftrace :
#!/bin/bash
# Mount the tracefs
mount -t tracefs nodev /sys/kernel/tracing
# Disable tracing
echo "0" > /sys/kernel/tracing/tracing_on
# set the current tracer to nop
echo "nop" > /sys/kernel/tracing/current_tracer
# set the current shell PID as a filter
echo $$ > /sys/kernel/tracing/set_ftrace_pid
# set the current tracer to function_graph
echo "function_graph" > /sys/kernel/tracing/current_tracer
# Enable tracing
echo "1" > /sys/kernel/tracing/tracing_on
# Execute the command
ls
# Disable tracing
echo "0" > /sys/kernel/tracing/tracing_on
# Cat the trace file into temporary file
cat /sys/kernel/tracing/trace > /tmp/mycommand_trace
Я получаю только несколько записей, когда запускаю этот скрипт с использованием function_graph
tracer, тогда как множество записей с function
tracer.
С function
трассер:
$ cat /tmp/mycommand_trace | head -n 20
# tracer: function
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
kernel_function-31784 [003] .... 5769.020705: mutex_unlock <-rb_simple_write
kernel_function-31784 [003] .... 5769.020706: __fsnotify_parent <-vfs_write
kernel_function-31784 [003] .... 5769.020706: fsnotify <-vfs_write
kernel_function-31784 [003] .... 5769.020707: __sb_end_write <-vfs_write
kernel_function-31784 [003] d... 5769.020730: do_syscall_64 <-entry_SYSCALL_64_after_hwframe
kernel_function-31784 [003] .... 5769.020730: __x64_sys_dup2 <-do_syscall_64
kernel_function-31784 [003] .... 5769.020730: ksys_dup3 <-__x64_sys_dup2
kernel_function-31784 [003] .... 5769.020730: _raw_spin_lock <-ksys_dup3
kernel_function-31784 [003] .... 5769.020731: expand_files <-ksys_dup3
kernel_function-31784 [003] .... 5769.020731: do_dup2 <-__x64_sys_dup2
kernel_function-31784 [003] .... 5769.020732: filp_close <-do_dup2
С function_graph
трассер:
$ cat /tmp/mycommand_trace
# tracer: function_graph
#
# CPU DURATION FUNCTION CALLS
# | | | | | | |
3) # 1485.764 us | } /* schedule */
3) # 1494.689 us | } /* do_wait */
3) # 1495.325 us | } /* kernel_wait4 */
3) # 1495.565 us | } /* __x64_sys_wait4 */
3) # 1495.848 us | } /* do_syscall_64 */
Но, насколько мне известно, ftrace , function_graph
трассировщик должен отслеживать как выход, так и вход вызова функции ядра, но я не могу увидеть его в приведенном выше выводе .
Есть ли проблема в моем скрипте?