打开内核选项
CONFIG_NOP_TRACER=y
CONFIG_HAVE_FUNCTION_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
CONFIG_HAVE_DYNAMIC_FTRACE=y
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
CONFIG_HAVE_C_RECORDMCOUNT=y
CONFIG_TRACER_MAX_TRACE=y
CONFIG_TRACE_CLOCK=y
CONFIG_RING_BUFFER=y
CONFIG_EVENT_TRACING=y
CONFIG_CONTEXT_SWITCH_TRACER=y
CONFIG_TRACING=y
CONFIG_GENERIC_TRACER=y
CONFIG_TRACING_SUPPORT=y
CONFIG_FTRACE=y
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
static void; inline不能跟踪到(已验证)
echo ‘:mod:module_name’ > set_ftrace_filter
前面提过,通过文件 set_ftrace_filter 可以指定要跟踪的函数,缺省目标为所有可跟踪的内核函数;可以将感兴趣的函数通过 echo 写入该文件。为了方便使用,set_ftrace_filter 文件还支持简单格式的通配符。
begin*选择所有名字以 begin 字串开头的函数
middle选择所有名字中包含 middle 字串的函数
*end选择所有名字以 end 字串结尾的函数
通过该文件还可以指定属于特定模块的函数,这要用到 mod 指令。指定模块的格式为
si_detach [dhd]
echo ‘:mod:dhd’ > set_ftrace_filter
event
130|p212:/sys/kernel/debug/tracing # cat available_events |grep cfg80211
cfg80211:rdev_suspend
cfg80211:rdev_return_int
cfg80211:rdev_scan
cfg80211:rdev_resume
cfg80211:rdev_return_void
cfg80211:rdev_get_ringparam
cfg80211:rdev_get_antenna
cfg80211:rdev_rfkill_poll
cfg80211:rdev_set_wakeup
cfg80211:rdev_add_virtual_intf
echo ‘cfg80211:*’ > set_event
/sys/kernel/debug/tracing # echo 1 > events/cfg80211/enable
function_graph性能
+ means that the function exceeded 10 usecs.
! means that the function exceeded 100 usecs.
# means that the function exceeded 1000 usecs.
$ means that the function exceeded 1 sec.