使用ftrace学习linux内核函数调用

http://www.cnblogs.com/pengdonglin137/articles/4752082.html

转载: http://blog.csdn.net/ronliu/article/details/6446251

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

# 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

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等工具。

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

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

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

时间: 2024-10-13 05:37:44

使用ftrace学习linux内核函数调用的相关文章

源码分析:动态分析 Linux 内核函数调用关系

源码分析:动态分析 Linux 内核函数调用关系 时间 2015-04-22 23:56:07  泰晓科技 原文  http://www.tinylab.org/source-code-analysis-dynamic-analysis-of-linux-kernel-function-calls/ 主题 Linux源码分析 By Falcon ofTinyLab.org 2015/04/18 缘由 源码分析是程序员离不开的话题. 无论是研究开源项目,还是平时做各类移植.开发,都避免不了对源码的

使用 ftrace 调试 Linux 内核,第1部分

ftrace 是 Linux 内核中提供的一种调试工具.使用 ftrace 可以对内核中发生的事情进行跟踪,这在调试 bug 或者分析内核时非常有用.本系列文章对 ftrace 进行了介绍,分为三部分.本文是第一部分,介绍了内核相关的编译选项.用户态访问 ftrace 的接口.ftrace 的数据文件,并对 ftrace 提供的跟踪器的用途进行了介绍,以使读者更好的了解和使用该工具. ftrace 是内建于 Linux 内核的跟踪工具,从 2.6.27 开始加入主流内核.使用 ftrace 可以

Linux系统的理解及学习Linux内核的心得

作业列表      linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作 linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核代码 linux内核分析作业3:跟踪分析Linux内核的启动过程 linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 linux内核分析作业5:分析system_call中断处理过程 linux内核分析作业6:分析Linux内核创建一个新进程的过程 Linux内核分析作业7:L

以Qemu模拟Linux,学习Linux内核

文章名称:以Qemu模拟Linux,学习Linux内核作      者:five_cent文章地址:http://www.cnblogs.com/senix/archive/2013/02/21/2921221.html维护日志:2013-02-21 建立文档(注:文章参考自http://www.linuxidc.com/Linux/2011-07/39373.htm, 是对该篇文章的一些补充和说明.文章内所使用的环境是Ubuntu 12.04,如果其中遇到编译问题,请自行参考错误说明,配置依赖

Linux内核(16) - 高效学习Linux内核

世界悲结束了,章鱼哥也退役了,连非诚勿扰中的拜金女也突然的少了很多.这本<Linux内核修炼之道>在卓越.当当.china-pub上也已经开卖了,虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到写上去的每段话能够让读者产生什么疑惑,然后也都会紧接着尽量的去进行解释清楚,中间的很多概念也有反复纠结过怎么解释能够更容易的理解,力求即使对于初学者也可以有很少阻碍的一气读完.同时我也把书中一部分自己的感悟抽出来整理了精华版,share出来.当然水平有限,

使用 ftrace 调试 Linux 内核,第 3 部分

内核头文件 include/linux/kernel.h 中描述了 ftrace 提供的工具函数的原型,这些函数包括 trace_printk.tracing_on/tracing_off 等.本文通过示例模块程序向读者展示如何在代码中使用这些工具函数. 使用 trace_printk 打印跟踪信息 ftrace 提供了一个用于向 ftrace 跟踪缓冲区输出跟踪信息的工具函数,叫做 trace_printk(),它的使用方式与 printk() 类似.可以通过 trace 文件读取该函数的输出

《Linux操作系统分析》之Linux系统的理解及学习Linux内核的心得

经过这一段时间的学习,自己对linux也有了一定的认识,今天这篇博客对以往的知识进行一个总结吧. 以往linux学习的博客,从上而下是学习深入的过程,我的博客链接如下: 第一篇:<Linux操作系统分析>之分析计算机如何启动以及如何工作运行 第二篇:<Linux操作系统分析>之分析精简的Linux的内核中断和时间片轮询 第三篇:<Linux操作系统分析>之跟踪分析Linux内核的启动过程 第四篇:<Linux操作系统分析>之使用库函数API和C代码中嵌入汇编

使用 ftrace 调试 Linux 内核,第 2 部分

ftrace 操作概述 使用 ftrace 提供的跟踪器来调试或者分析内核时需要如下操作: 切换到目录 /sys/kernel/debug/tracing/ 下 查看 available_tracers 文件,获取当前内核支持的跟踪器列表 关闭 ftrace 跟踪,即将 0 写入文件 tracing_enabled 激活 ftrace_enabled ,否则 function 跟踪器的行为类似于 nop:另外,激活该选项还可以让一些跟踪器比如 irqsoff 获取更丰富的信息.建议使用 ftra

轻松学习linux内核源码的方法

轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件组织:1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心. 本文基于稳定的2.2.5源代码,第二部分的实现平台为 RedHat Lin