如何使用ftrace

http://www.ibm.com/developerworks/cn/linux/l-cn-ftrace1/

http://blog.csdn.net/ganggexiongqi/article/details/6710201

Documentation/trace/ftrace.txt


基本使用

1. 编译内核

ref:http://www.omappedia.org/wiki/Installing_and_Using_Ftrace
===================================================
Kernel configuration & Re-build

Kernel Hacking -> Tracers -> FUNCTION_TRACER
Kernel Hacking -> Tracers -> FUNCTION_GRAPH_TRACER (if possible)
Kernel Hacking -> Tracers -> STACK_TRACER  //  Trace max stack
Kernel Hacking -> Tracers -> DYNAMIC_FTRACE // enable/disable ftrace tracepoints dynamically


2. mount debugfs

mount -t debugfs nodev /sys/kernel/debug


3. 选择ftrace

echo function > /sys/kernel/debug/tracing/current_tracer


cat /sys/kernel/debug/tracing/available_tracers 可以显示可用的tracer

blk mmiotrace function_graph wakeup_rt wakeup function nop

现在有这些种类的trace。


ftrace主要用来观察函数调用情况。


4. 选择需要trace的函数

echo func_name > set_ftrace_filter


echo ':mod:e1000e' > set_ftrace_filter

追踪e1000e模块中的所有函数


cat enabled_functions 可以显示哪些函数已经列入了跟踪范围


5. 启动/关闭 trace

echo 1 > tracing_on

echo 0 > tracing_on


echo 0 > trace  清空,否则会有之前的记录


6. 输出

在文件 /sys/kernel/debug/tracing/trace中, 这个是静态的。

/sys/kernel/debug/tracing/trace_pipe 是动态的,数据读过后就不会再显示。且会block。


7. 输出格式

输出的格式可以在trace_options文件中,做些小调整。

cat trace_options 可以显示所有能做调整的选项。


echo noprint-parent > trace_options

就不会显示谁调用了该函数


echo sym-offset > trace_options

除了显示函数的名字,还会显示函数的offset


实例操作

1. function 的例子

从代码中看到有 dev_activate() 和 dev_deactivate() 分别在链路开启和断开时候被调用。

不过不确定是不是这样,之前的话需要在代码中加上printk,编译,换新的内核才能看到效果。

现在用ftrace来试试


echo function > current_tracer

echo dev_activate > set_ftrace_filter

echo dev_deactivate >> set_ftrace_filter

echo 1 > tracing_on


然后插拔网线,可以看到这两个函数确实被调用到。


2. function_graph 的例子


echo function_graph > current_tracer

echo dev_activate > set_graph_function

echo dev_deactivate >> set_graph_function

echo 3 > max_graph_depth

echo 1 > tracing_on


好了,这样可以看到一些函数调用过程。







你可能感兴趣的:(Linux,kernel,Debug)