http://www.ibm.com/developerworks/cn/linux/l-cn-ftrace/
http://www.ibm.com/developerworks/cn/linux/l-cn-ftrace1/
http://www.cnblogs.com/pengdonglin137/articles/4752082.html
基本使用
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模塊中的函數
5. 啟動/關閉 trace
echo 1 > tracing_on
echo 0 > tracing_on
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
好了,這樣可以看到一些函數調用過程。