linux内核 ftrace,使用ftrace学习linux内核函数调用(示例代码)

linux中大量使用函数指针钩子,导致阅读代码困难。比如想知道一个函数的调用路径,那么就只能用source insight之类的工具看代码了。有没有办法可以迅速获得调用关系的整体印象?ftrace是内核提供的一种调试工具,可以对内核中发生的事情进行跟 踪。比如函数的调用,进程的切换,中断的开关等等。这里利用这个工具来跟踪函数的调用。

fz.gif

# cat /boot/config-2.6.36 | grep FTRACE

CONFIG_HAVE_FTRACE_NMI_ENTER=y

CONFIG_HAVE_DYNAMIC_FTRACE=y

CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y

CONFIG_FTRACE_NMI_ENTER=y

CONFIG_FTRACE=y #FTRACE打开后,编译内核时会打开-pg选项。

CONFIG_FTRACE_SYSCALLS=y

CONFIG_DYNAMIC_FTRACE=y

CONFIG_FTRACE_MCOUNT_RECORD=y

# CONFIG_FTRACE_STARTUP_TEST is not set

fz.gif

mkdir  /debug

mount -t debugfs nodev /debug   #挂载debugfs。ftrace使用debugfs作为配置工具

cd tracing     #检查是否存在tracing文件夹。如果不存在,当前内核不支持ftrace,需要重新编译。参考文档

tracing文件夹中有很多文件用于配置ftrace工具。

echo nop > current_tracer   #清楚当前tracer。执行该操作,会将pid等清空。

echo function > current_tracer  #跟踪函数调用

echo 1 > tracing_enabled  #打开ftrace开始跟踪

echo 0 > tracing_enabled  #关闭ftrace停止跟踪

cat trace | less  # 读trace文件。可以使用vim等工具。

20180110223252703900.png 

echo 1 > set_ftrace_pid    #跟踪单个进程(内核线程)的函数调用。有效值大于0。如果echo  > set_ftrace_pid则清空该选项。

echo function_graph > current_tracer  #以图形化的方式跟踪函数调用。如下图所示。效果非常好。

20180110223252705853.png  

默认情况下,会捕获所有的内核函数调用。可以使用下面的命令进行过滤,只捕获关心的函数调用。

echo sys_socket > set_graph_function    #可以写多个函数。也可以使用通配符*,如sys_*。

cat available_filter_functions | grep sys_   #查询ftrace支持的包含sys_字符的函数。注意,内核中使用EXPORT_SYMBOL声明的函数才能使用ftrace跟踪。

参考文档:

1. ftrace使用手册:kernel-srctree/Documentation/trace/ftrace.txt

2. ftrace设计文档:kernel-srctree/Documentation/trace/ftrace-design.txt

3. http://www.ibm.com/developerworks/cn/linux/l-cn-ftrace/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值