老白学编程Traceftrace

编程

Ftrace 可以帮我们分析内核特定的事件,也能帮我们去追踪动态的内核函数,以及这些函数的调用栈还有栈的使用这些。它也能帮我们去追踪延迟,譬如中断被屏蔽,抢占被禁止的时间,以及唤醒一个进程之后多久开始执行的时间。

tracefs

首先就是需要将系统的 debugfs 或者 tracefs 给挂载到某个地方,几乎所有的 Linux 发行版,都开启了 debugfs/tracefs 的支持,所以我们也没必要去重新编译内核了。

CentOS 7 的上面,debugfs 通常被挂载到 /sys/kernel/debug

该目录有许多文件,下面大致介绍一下基本的文件。

$ ls

available_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_tracers

blk function_graph wakeup_dl wakeup_rt wakeup function nop

开启 function 的trace。

$ echo function > current_tracer

trace-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_graph

trace-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

#指定function

echo 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

回到顶部