如果要使用 ftrace,请将其加入 /etc/fstab 从而在开机时自动挂载 tracefs。

ftrace - Function Tracer — The Linux Kernel documentation

Linux 原生机制 去跟踪系统事件以及检索/分析故障信息,内核中的第一款跟踪工具。

Ftrace (function tracer) basically lets you watch and record the execution flow of kernel functions.

不像 straceperf,ftrace 并不是真正的 程序 – 你不能只运行 ftrace my_cool_function

trace-cmd 是 ftrace 的一个前端。

trace_printk() output looks like a comment in the function graph tracer. To see the output:

tail -f /sys/kernel/tracing/trace

WARN_ON(1) 可以在 dmesg 里查看内核函数调用栈。

Official documentation referenced: ftrace - Function Tracer — The Linux Kernel documentation

trace_printk()

虽然 printk() 使用起来简单,但是其开销较大,有时甚至会影响到我们对内核进行调试。

比如在调试 scheduler 或者 network 这种非常忙碌的子系统时,printk() 会极大地拖慢系统性能,甚至造成死锁;而在调试一些竞态问题时,使用 printk() 甚至会让问题 “消失”,或者难以复现。

而 Ftrace 提供的 trace_printk() 则可以用于这些调试场景,跟 printk () 一样,它也可以用于任何上下文中;不同的是,它不会把 log 输出到 console,而是输出到一个独立的 buffer。使用 trace_printk() 输出的 log 会与其它 tracer 输出的 log 结合。

使用Ftrace调试Linux内核 | colorfulshark

tail -f /sys/kernel/debug/tracing/trace

如何将用户空间的 log 和内核空间结合?

trace_marker.

Tracer

Tracer:

A list of all the tracers: ftrace - Function Tracer — The Linux Kernel documentation

switch tracer:

echo nop > /sys/kernel/tracing/current_tracer # no tracer, the default
echo function_graph > /sys/kernel/tracing/current_tracer

Tracefs

Ftrace uses the tracefs file system to hold the control files as well as the files to display output.

It is mounted at /sys/kernel/tracing. (For combability reason, /sys/kernel/debug/tracing can also be used)

To see the meaning of each file, see ftrace - Function Tracer — The Linux Kernel documentation

Questions

When change current tracer, will the previous trace log be cleared?