老白学编程Traceftrace
Ftrace 可以帮我们分析内核特定的事件,也能帮我们去追踪动态的内核函数,以及这些函数的调用栈还有栈的使用这些。它也能帮我们去追踪延迟,譬如中断被屏蔽,抢占被禁止的时间,以及唤醒一个进程之后多久开始执行的时间。
tracefs
首先就是需要将系统的 debugfs 或者 tracefs 给挂载到某个地方,几乎所有的 Linux 发行版,都开启了 debugfs/tracefs 的支持,所以我们也没必要去重新编译内核了。
CentOS 7 的上面,debugfs 通常被挂载到 /sys/kernel/debug
该目录有许多文件,下面大致介绍一下基本的文件。
$ lsavailable_events free_buffer README stack_max_size tracing_cpumask
available_filter_functions function_profile_enabled saved_cmdlines stack_trace tracing_max_latency
available_tracers instances saved_cmdlines_size stack_trace_filter tracing_on
buffer_size_kb kprobe_events set_event trace tracing_thresh
buffer_total_size_kb kprobe_profile set_ftrace_filter trace_clock uprobe_events
current_tracer max_graph_depth set_ftrace_notrace trace_marker uprobe_profile
dyn_ftrace_total_info options set_ftrace_pid trace_options
enabled_functions per_cpu set_graph_function trace_pipe
events printk_formats snapshot trace_stat
同时, 可以使用trace-cmd 工具,其更加友好。
基本使用
通过 available_tracers
可以知道有哪些支持的tracer。
$ cat available_tracersblk function_graph wakeup_dl wakeup_rt wakeup function nop
开启 function 的trace。
$ echo function > current_tracertrace-cmd start -p function
查看结果
cat trace | head -n 15 或者使用命令$ trace-cmd show| head -15
# tracer: function
#
# entries-in-buffer/entries-written: 20705/20705 #P:1
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
trace-cmd-6698 [000] .... 17131.903259: schedule <-do_exit
rcu_sched-9 [000] .... 17131.903264: schedule <-schedule_timeout
kworker/0:3-5306 [000] .... 17131.903269: schedule <-worker_thread
zsh-4670 [000] .... 17131.903674: schedule <-pipe_wait
stop trace:
$ echo nop > current_tracer$ cat trace
# tracer: nop
#
# entries-in-buffer/entries-written: 0/0 #P:1
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
使用命令:
trace-cmd start -p nop$ trace-cmd show
# tracer: nop
#
# entries-in-buffer/entries-written: 0/0 #P:1
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
function graph tracer
trace-cmd start -p function_graphtrace-cmd show
# tracer: function_graph
#
# CPU DURATION FUNCTION CALLS
# | | | | | | |
0) | schedule() {
------------------------------------------
0) <...>-7236 => rcu_sch-9
------------------------------------------
0) | schedule() {
------------------------------------------
0) rcu_sch-9 => kworker-5306
------------------------------------------
0) | schedule() {
c
只跟踪特定的function
#指定functionecho schedule > set_ftrace_filter
cat set_ftrace_filter
schedule
#不跟踪
echo "!schedule" > set_ftrace_filter
或者 :
echo schedule > set_ftrace_notrace
以上是 老白学编程Traceftrace 的全部内容, 来源链接: utcz.com/z/516434.html