使用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
使用ftrace学习linux内核函数调用的更多相关文章
- 源码分析:动态分析 Linux 内核函数调用关系
源码分析:动态分析 Linux 内核函数调用关系 时间 2015-04-22 23:56:07 泰晓科技 原文 http://www.tinylab.org/source-code-analysi ...
- 使用 ftrace 调试 Linux 内核【转】
转自:http://blog.csdn.net/adaptiver/article/details/7930646 使用 ftrace 调试 Linux 内核,第 1 部分 http://blog.c ...
- 使用 ftrace 调试 Linux 内核,第 1 部分【转】
转自:http://www.ibm.com/developerworks/cn/linux/l-cn-ftrace1/index.html ftrace 是 Linux 内核中提供的一种调试工具.使用 ...
- 使用 ftrace 调试 Linux 内核,第1部分
ftrace 是 Linux 内核中提供的一种调试工具.使用 ftrace 可以对内核中发生的事情进行跟踪,这在调试 bug 或者分析内核时非常有用.本系列文章对 ftrace 进行了介绍,分为三部分 ...
- Linux系统的理解及学习Linux内核的心得
作业列表 (点击作业跳转) linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作 linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核 ...
- 以Qemu模拟Linux,学习Linux内核
文章名称:以Qemu模拟Linux,学习Linux内核作 者:five_cent文章地址:http://www.cnblogs.com/senix/archive/2013/02/21/29 ...
- Linux内核(16) - 高效学习Linux内核
世界悲结束了,章鱼哥也退役了,连非诚勿扰中的拜金女也突然的少了很多.这本<Linux内核修炼之道>在卓越.当当.china-pub上也已经开卖了,虽然是严肃文学,但为了保证流畅性,大部分文 ...
- 使用 ftrace 调试 Linux 内核,第 3 部分
内核头文件 include/linux/kernel.h 中描述了 ftrace 提供的工具函数的原型,这些函数包括 trace_printk.tracing_on/tracing_off 等.本文通 ...
- 使用 ftrace 调试 Linux 内核,第 2 部分
ftrace 操作概述 使用 ftrace 提供的跟踪器来调试或者分析内核时需要如下操作: 切换到目录 /sys/kernel/debug/tracing/ 下 查看 available_tracer ...
随机推荐
- Spring框架 aop中的操作术语
Joinpoint 连接点 Pointcut 切入点 Advice 通知/增强 举例: 后置通知,不抛出异常则执行此通知,抛异常则不执行 最终通知,抛不抛异常都通知 其他通知都是环绕通知的衍生 ...
- 两种常见JS面向象写法
基于构造函数 function Circle(r) { this.r = r; } Circle.PI = 3.14159; Circle.prototype.area = function() { ...
- 【Linux】启动Tomcat遇到Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
找不到JAVA_HOME路径,需要做以下变更: 找到启动路径所在的目录: cd bin/ vi catalina.sh 加入以下信息: export JAVA_HOME=/home/gongzi/ht ...
- 如何用纯 CSS 创作一个均衡器 loader 动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oybWBy 可交互视频教 ...
- Java-转换Unicode和utf-8
package com.tj; import java.io.UnsupportedEncodingException; public class MyClass implements Cloneab ...
- Linux中执行shell脚本命令的4种方法总结
bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在 ...
- POJ-1743 Musical Theme,后缀数组+二分!
Musical Theme 人生第一道后缀数组的题,采用大众化思想姿势极其猥琐. 题意:给你n个 ...
- PTA 08-图8 How Long Does It Take (25分)
题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/674 5-12 How Long Does It Take (25分) Given ...
- EasyUI combogrid 赋多个值
var values = []; for (var i = 0; i < rows.length; i++) { if (rows[i].id>0 ) { values.push('' + ...
- redis介绍和安装(一)
Redis介绍:redis是一个key-value存储系统. 和Memcached类似,它支持存储的value类型相对更多,包括 string(字符串). list(链表).set(集合).zset( ...