ftrace跟踪内核_用Ftrace跟踪内核模块
如果你需要分析一个内核模块的函数调用数或者希望得到各语句段的执行时间,那么这篇文章很适合您。
Ftrace抛开内核代码跟踪领域的对手如KFT等进入Linux官方内核,正说明其功能强大性能稳定。Ftrace 的作用是帮助开发人员了解
Linux
内核的运行时行为,以便进行故障调试或性能分析。网上有很多关于ftrace的介绍及使用的文章,在此就不赘述,本文主要就使用ftrace跟踪分析内核
模块,说明其详细操作过程和一些技巧。
对一个名为epl.ko的内核模块进行trace的过程如下:
1 首先确保你打开相应的内核选项: kernel_hacking/Trace下面。如果需要重编内核。
注意重编内核后重编你的模块。
2 设置ftrace
mount -t debugfs debugfs /sys/kernel/debug #要使用 ftrace首先需要mount这个debugfs
ln -s /sys/kernel/debug /debug #方便期间做个链接
cd /debug
echo function_graph > current_tracer #输出函数调用图,需要打开内核选项FUNCTION_GRAPH_TRACER
3 提取模块里的函数列表
如果没有设置过滤表(默认加载debugfs后),available_filter_functions文件包含了所有可追踪的函数名称,默认情况下这
个链表覆盖了所有内核的可trace函数。如果我们插入一个模块,那么ftrace会自动把我们我们这个模块的函数符号加到
available_filter_functions中。提取一个内核模块的函数可以有两种方法,一种是用nm命令,一种是比较插入模块前后
available_filter_functions的差异,两种方法都提供给读者如下:
1)比较插入模块前后available_filter_functions的差异
cat available_filter_functions > /tmp/funcs_without_epl
insmod epl.ko
cat available_filter_functions > /tmp/funcs_with_epl
diff /tmp/funcs_without_epl /tmp/funcs_with_epl > epl_funcs
删除 epl_funcs文件里由diff产生的无用信息。
2) 使用nm命令导出epl.ko里的符号
参考 [附表:nm基本用法]
nm导出的是ko里的所有符号,我们只需要函数符号
nm -s epl.ko | grep " T " | awk '{ print $3 }' > nm_funcs
nm -s epl.ko | grep " t " | awk '{ print $3 }' >> nm_funcs
为了比较两者产生的差别,首先排下序
sort nm_funcs > nm_funcs_sorted
sort epl_funcs > epl_funcs_sorted
diff -Nur nm_funcs_sorted epl_funcs_sorted
我们可能发现nm_funcs包含了一些epl_funcs没有的函数,这些函数正式kernel里面本来有的内核函数,所以如果你只想trace你的模块的函数,那么推荐使用方法1。
4 开始trace
insmod epl.ko
cat /tmp/epl_funcs > set_ftrace_filter
echo 1 >tracing_enabled #开始trace
cat trace_pipe > /tmp/ftrace_result.txt & #设置一个管道重定向,防止溢出
tracing & waiting....
echo 0 >tracing_enabled #结束trace
说明:一个ko插入kernel以后才可以给
set_ftrace_filter设置函数过滤表,因为没插入以前内核没有epl.ko的函数符号,故设置set_ftrace_filter失败,所
以需要先插入模块以后再enable
trace,但是这样又有一个问题:我们也想trace模块插入时候的执行情况时,我们还不能在插入模块前设置过滤表,那么怎么办呢?需要得到这个答案需
要首先确认:在默认情况下,也就是设置ftrace为trace所有可trace的函数后,我们插入模块时候ftrace是不是马上把这个ko的函数表加
进可trace列表,同时也能够trace这些函数?如果可以,那我们可以先预先准备好filter
list(即我们文中所述的epl_funcs),插入模块后然后再设置set_ftrace_filter过滤表,这样会在ftrace的结果的前一段
会有我们不希望trace的函数(内核函数),或者删除,或者提取出我们模块初始化部分即可。作者在实践过程中发现有时候ftrace的结果输出没有显示
函数符号表,这个问题还有待进一步确认...希望对这方便有深入了解的网友不吝赐教,mqyoung at gmail.com。
如下是我在学习使用过程中做的一些笔记和备忘,也许对您有用
需要了解的几个文件:
===============
set_ftrace_filter:
limit the trace to only those functions.
set_ftrace_notrace:
An effect opposite to that of set_ftrace_filter. Any function that is
added here will not be traced. If a function exists in both files,
the function will _not_ be traced.
set_ftrace_pid:
Only trace a single thread.
available_filter_functions:
This lists the funtions that ftrace has processed and can trace. These
are the function names that you can pass to "set_ftrace_filter" or
"set_ftrace_notrace".
Ftrace 提供的几种Tracer
=================
"function"
"function_graph"
"sched_switch"
context switches and wakeups between tasks
"irqsoff"
disable intrrupts and saves the trace with the longest max latency.
See tracing_max_latency.
"preemptoff"
"preemptirqsoff"
"wakeup"
Records the max latency that it takes for the highest priority task to
get scheduled after it has been woken up.
"hw-branch-tracer"
"nop"
"trace nothing" tracer. To remove all tracers from tracing simply echo
"nop" into current_tracer.
参考资料:
[1] nm http://hi.baidu.com/zzgmtv/blog/item/d021d7437d38d91f72f05d57.html
[2] ftrace kernel_src/Documentation/trace/ftrace.txt
附表:nm基本用法
对于每一个符号,nm列出其值(the symbol value),类型(the symbol type)和其名字(the symbol name)。
符号
类型
说明
A
该符号的值是绝对的,在以后的链接过程中,不允许进行改变。这样的符号值,常常出现在中断向量表中,例如用符号来表示各个中断向量函数在中断向量表中的位置。
B
该符号的值出现在非初始化数据段
(bss)
中。例如,在一个文件中定义全局
static int test
。则该符号
test
的类型为
b
,位于
bss section
中。其值表示该符号在
bss
段中的偏移。一般而言,
bss
段分配于
RAM
中
C
该符号为
common
。
common symbol
是未初始话数据段。该符号没有包含于一个普通
section
中。只有在链接过程中才进行分配。符号的值表示该符号需要的字节数。例如在一个
c
文件中,定义
int test
,并且该符号在别的地方会被引用,则该符号类型即为
C
。否则其类型为
B
。
D
该符号位于初始话数据段中。一般来说,分配到
data section
中。例如定义全局
int baud_table[5] = {9600, 19200, 38400, 57600, 115200}
,则会分配于初始化数据段中
。
G
该符号也位于初始化数据段中。主要用于
small object
提高访问
small data object
的一种方式。
I
该符号是对另一个符号的间接引用。
N
该符号是一个
debugging
符号。
R
该符号位于只读数据区。例如定义全局
const int test[] = {123, 123};
则
test
就是一个只读数据区的符号。注意在
cygwin
下如果使用
gcc
直接编译成
MZ
格式时,源文件中的
test
对应
_test
,并且其符号类型为
D
,即初始化数据段中。但是如果使用
m6812-elf-gcc
这样的交叉编译工具,源文件中的
test
对应目标文件的
test,
即没有添加下划线,并且其符号类型为
R
。一般而言,位于
rodata section
。值得注意的是,如果在一个函数中定义
const char *test = “abc”, const char test_int = 3
。使用
nm
都不会得到符号信息,但是字符串“
abc
”分配于只读存储器中,
test
在
rodata section
中,大小为
4
。
S
符号位于非初始化数据区,用于
small object
。
T
该符号位于代码区
text section
。
U
该符号在当前文件中是未定义的,即该符号的定义在别的文件中。例如,当前文件调用另一个文件中定义的函数,在这个被调用的函数在当前就是未定义的;但是在定义它的文件中类型是
T
。但是对于全局变量来说,在定义它的文件中,其符号类型为
C
,在使用它的文件中,其类型为
U
。
V
该符号是一个
weak object
。
W
The symbol is a weak symbol that has not been specifically tagged as a weak object symbol.
-
该符号是
a.out
格式文件中的
stabs symbol
。
?
该符号类型没有定义
ftrace跟踪内核_用Ftrace跟踪内核模块相关推荐
- 使用 ftrace 跟踪内核
转自:https://blog.csdn.net/qq_33487044/article/details/81750993 https://blog.csdn.net/aneutron/article ...
- ftrace跟踪内核_ftrace追踪内核函数调用
前言:在追踪内核的网络栈时,经常会出现复杂的条件分支,导致分不清报文处理的重要流程,本文介绍的ftrace则能够追踪记录函数的调用流程,非常方便的用以分析代码. 一. ftrace简单介绍 ftra ...
- linux内核调试器ftrace使用
本文的实验是在ubuntu(内核版本3.19.0)上运行的. ftrace原理 ftrace是一个追踪器框架,其中一个强大的追踪器就是函数追踪器(即函数的调用过程).它使用gcc的-pg选项让内核中的 ...
- 极值跟踪算法 c语言,快速约束极值子空间跟踪算法_魏志强.pdf
快速约束极值子空间跟踪算法_魏志强 34 4 Vol. 34 No. 4 第 卷第 期 华 北 水 利 水 电 学 院 学 报 2013 8 Journal of North China Instit ...
- 通信原理包络是什么意思_适用于包络跟踪应用的高带宽AB类放大器设计
摘要 本文介绍了用于包络跟踪(ET,envelope tracking)应用的线性辅助混合电源转换器(linear assisted hybrid converter)中的高带宽和高压摆率c1ass- ...
- ccot 目标跟踪全称_一种焊缝跟踪系统的实时姿态估计方法与流程
本发明属于焊接机器人焊缝跟踪领域,特别涉及一种焊缝跟踪系统的实时姿态估计方法. 背景技术: 现在的焊接机器人基本上都是在焊接之前先进行示教,让机器人每次都走一个固定的轨迹,这种方式有一个好处就是重复精 ...
- php跟踪系统调用,使用strace命令跟踪系统调用
一.是什么strace? strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由 ...
- 路径跟踪算法之PID路径跟踪与PP跟踪
路径跟踪算法之PID路径跟踪与PP跟踪 1路径跟踪原理 2 常见的路径跟踪算法 2.1 Pure puresuit(pp)纯跟踪 2.2 PID 跟踪 1路径跟踪原理 在运用好的路径规划算法,规划好一 ...
- 基于matlab介绍传感器融合和跟踪工具箱中用于评估跟踪器性能的不同定量分析工具(附源码)
目录 一.分配和错误指标 1.1 轨道和真相定义 1.2 计算和分析指标 1.3 分析分配指标 编辑 1.4 分析错误指标 编辑二.将指标汇总为分数 2.1 欧斯帕公制 2.2 分析 OSPA 指 ...
最新文章
- linux 镜像文件名,linux – 使用wget镜像具有相同名称的路径和子文件夹的网站
- mmap和shm共享内存的区别和联系
- python管道符_Python实现处理管道的方法
- SQLServer创建数据库详解
- java-- properties总结
- UVa 1600 Patrol Robot (习题 6-5)
- PIFO到底是什么?【Programmable Packet Scheduling at Line Rate】
- python display方法_在Python中縮放和顯示圖像的最快方法是什么?
- kotlin button_使用Kotlin和XML的Android Button
- 自学了三天的SeaJs学习,解决了前端的一些问题,与小伙伴们一起分享一下!...
- 基于Attention Model的Aspect level文本情感分类---用Python+Keras实现
- 算法导论第三版 第1章习题答案
- 虚拟机上安装linux版QQ并卸载
- 三菱MDS-D-SVJ3-10/20/10NA/20NA伺服驱动器
- 软件工程——软件结构图设计(变换分析设计、事务分析设计、混合流设计)
- Mock数据模板规范详解
- 方维P2P短信接口修改
- Transition过渡动画
- 节点精灵免root脚本之直播间秒抢红包雨
- 【渝粤教育】国家开放大学2018年春季 8639-21T食品营养与健康 参考试题
热门文章
- Kaldi AMI数据集脚本学习6---转移模型(Transition Model)
- 机器学习之分类决策树节点划分指标
- sklearn分类、回归器总结
- c语言数据结构用矩阵存储图,数据结构之---C语言实现图的数组(邻接矩阵)存储表示...
- 什么是IOC,IOC的优缺点及IOC的应用
- cas云计算机管理平台添加加密锁,CAS云计算管理平台安装手册.docx
- java自定义sql查询条件_mybatis-plus QueryWrapper自定义查询条件的实现
- zookeeper安装_Centos7安装配置Zookeeper
- DotNetNuke 5 User's Guide: Get Your Website Up and Running
- 机器学习实战8-Apriori算法