Linux使用 ftrace 来跟踪内核函数调用

使用ftrace跟踪函数 在阅读Linux源码的过程中我们常常要花时间去梳理函数的调用关系,由于linux中存在各种分支,分析函数的调用关系成为一件很难的事情。除了死磕源码外,还有很多手段有助于我们梳理函数关系,比如:使用qemu + gdb,ftrace,ebpf等,linux的trace系统是一个很庞大的分支,一时很难梳理清楚,这篇文章重点列举使用ftrace跟踪函数的方式,尽量给出最短的demo脚本。 阅读详情

本文参考了一些博客,然后在自己的主机(Ubuntu 18.04)上进行了测试

在Linux内核文档中有关于ftrace的介绍:

https://www.kernel.org/doc/Documentation/trace/ftrace.txt

ftrace是一个Linux内部跟踪器,主要是帮助系统的开发人员和设计人员了解到内核中发生了的事情。

它可用于调试或分析在用户空间之外发生的延迟和性能问题。虽然ftrace通常被认为是函数跟踪器,但它实际上是几个各种跟踪实用程序的框架工作。有延迟跟踪来检查禁用和启用的中断之间发生的情况,以及抢占和从任务被唤醒到任务实际安排的时间

ftrace最常见的用途之一是事件跟踪。通过内核可以通过tracefs文件系统启用数百个静态事件点,以查看内核某些部分的情况。

现在以我的一台主机测试 ftrace 的使用。

在各种Linux发行版中基本都已经提供了对 ftrace 的支持,在我的Ubuntu中,相关内容在如下目录中:

/sys/kernel/debug/tracing

该目录下的内容如下: 

在该目录中,我们可以通过查看 available_tracers 文件,获取当前内核支持的跟踪器列表:

cat available_tracers

 Tracer有很多种,主要几大类:

  • 函数类:function, function_graph, stack
  • 延时类:irqsoff, preemptoff, preemptirqsoff, wakeup, wakeup_rt, waktup_dl
  • 其他类:nop, mmiotrace, blk

来源:http://www.cnblogs.com/arnoldlu/p/7211249.html

在本文中,主要使用 function 以及 function_graph 这两个跟踪器。

Function

使用如下命令来使用 function 跟踪器:

echo function > current_tracer

相当于把当前的跟踪器,配置为 function,我们可以使用 cat 命令查看当前的 current_tracer

从上图中可以看到,我们配置 function 成功。

配置好之久, ftrace 就开始工作了,会将相关的 trace 信息放到 trace 文件里面,直接读取这个文件就能获取相关的信息。

cat trace | head -n 20

如果直接 cat trace 文件,内容就太多了,我们可以通过文件 set_ftrace_filter 指定要跟踪的函数,缺省目标为所有可跟踪的内核函数;可以将感兴趣的函数通过 echo 写入该文件。

为了方便使用,set_ftrace_filter 文件还支持简单格式的通配符。

  • begin*选择所有名字以 begin 字串开头的函数
  • *middle*选择所有名字中包含 middle 字串的函数
  • *end选择所有名字以 end 字串结尾的函数

需要注意的是,这三种形式不能组合使用,比如“begin*middle*end”实际的效果与“begin”相同。另外,使用通配符表达式时,需要用单引号将其括起来,如果使用双引号,shell 可能会对字符‘ * ’进行扩展,这样最终跟踪的对象可能与目标函数不一样。

通过该文件还可以指定属于特定模块的函数,这要用到 mod 指令。指定模块的格式为:

echo ':mod:[module_name]' > set_ftrace_filter

来源:https://www.ibm.com/developerworks/cn/linux/l-cn-ftrace2/index.html

例如我要查看与schedule相关的内容,那么可以使用如下命令将要输出的写入到 set_ftrace_filter文件中:

echo schedule > set_ftrace_filter

然后再使用cat trace命令查看trace:

cat trace | head -n 20

如果不想要trace schedule 这个函数,也可以这样做:

echo '!schedule' > set_ftrace_filter

或者也可以这样做:

echo schedule > set_ftrace_notrace

Function_ Graph

Function_ Graph比function能够更加详细地打印出函数调用上下文。

function_graph 跟踪器则可以提供类似 C 代码的函数调用关系信息。通过写文件 set_graph_function 可以显示指定要生成调用关系的函数,缺省会对所有可跟踪的内核函数生成函数调用关系图。

设置为 function graph

echo function_graph > current_tracer

打印出 trace:

cat trace | head -n 20

我们也可以只跟踪某一个函数的堆栈,例如open:

echo kfree > set_graph_function

打印出 trace:

cat trace | head -n 20

参考博客

1. 《使用 ftrace 来跟踪系统问题 - ftrace 介绍》

地址:https://www.jianshu.com/p/99e127973abe

主要是ftrace的使用方法

2. 《Linux ftrace框架介绍及运用》

地址:http://www.cnblogs.com/arnoldlu/p/7211249.html

讲解了ftrace的源码,在这篇博客中也给出了一些参考的内容

ftrace的帮助文档在Documentation/trace,ftrace代码主要在kernel/trace,ftrace相关头文件在include/trace中。

WiKiPedia有关于ftrace的简单介绍。

ftrace的作者在LinuxCon 2010有一篇关于Ftrace Linux Kernel Tracing的slides值得一读。

3. 《使用 ftrace 调试 Linux 内核,第 2 部分》

地址:https://www.ibm.com/developerworks/cn/linux/l-cn-ftrace2/index.html

主要是ftrace的使用方法

4. 《ftrace 简介》

地址:https://www.cnblogs.com/danxi/p/6417828.html

 

Linux-ftrace(内核调试工具) Linux内核调试工具 -- ftrace 阅读详情

相关推荐

Linux 利用 ftrace 分析内核调用

在 Linux 中,ftrace是一种用于跟踪内核函数调用和事件的工具。它是一个功能强大的跟踪框架,可用于分析和调试内核性能问题。ftrace提供了多种功能,包括函数跟踪、事件记录和性能分析等。它能够记录函数的调用和返回信息,以及函数执行的路径和时间。通过跟踪这些信息,我们可以了解到内核函数的执行情况,从而定位和解决性能问题。ftrace使用了内核中的一些机制来实现跟踪功能。其中一个关键的机制是函数预编译器,它会在每个内核函数的入口和出口处插入一些特殊的指令,用于记录函数的调用和返回信息。

Projectsauron 的博客 5万+

Linux动态追踪——ftrace

动态跟踪工具 ftrace 的使用~

Fireplusplus的博客 2965

【Linux系统调试】内核函数调用行为分析工具:Ftrace

Ftrace 是 Linux 内核中的一种跟踪工具,主要用于调试和分析内核行为。它能够捕获内核函数的调用路径、执行时间、中断延迟等信息,帮助开发者诊断性能问题和调试内核代码。Ftrace 的优势在于其轻量级和低开销,适合在生产环境中使用。Ftrace 是 Linux 内核的一部分,通常不需要单独安装。确保内核配置中启用了 Ftrace 相关选项。命令执行过程中调用的内核函数及其调用顺序。通过分析这些信息,可以了解命令执行时的内核行为,帮助诊断性能问题或调试内核代码。,则表示内核已启用 Ftrace。

以实战经验介绍行业知识 879

ftrace内核跟踪技术

ftrace内核跟踪技术

ljbcharles的专栏 1762

避坑指南:C#用S7NetPlus读写西门子PLC字符串(String/WString)的完整方案

本文详细解析了C#通过S7NetPlus读写西门子PLC字符串(String/WString)的完整方案,包括内存布局、编码差异和字节序处理等关键技术细节。提供了实战优化的代码示例和常见问题排查指南,帮助开发者避免乱码、截断等常见陷阱,提升工业自动化项目的开发效率。

weixin_32956805的博客 323

LIN 协议测试

如下图,使用PicoScope示波器抓取报文Id为0x18的波形,数据场Byte1的长度为519.994μs,Byte1共10bit,计算位时间:tBit= 519.994/10 = 51.9994μs,符合预期。■ 唤醒信号是一个250μs到5ms的显性电平,发送唤醒信号的节点发送唤醒信号后150ms~250ms没有收到其他节点的唤醒信号,发送唤醒信号的节点发送新的唤醒信号。对于LIN主节点,检查发送的帧头长度是否符合设计要求,对于LIN从节点,检查从节点能否正确响应设计范围之内的帧头长度。

m0_63902994的博客 5936

使用 Ftrace 跟踪内核函数调用,内核调试必备!

最近使用eBPF做可观测性的项目,接触到了一些内核跟踪工具,其中就包括Ftrace。Ftrace 是 Linux 内核自带的跟踪工具,能够追踪内核中的函数调用、上下文切换、中断处理等。通过 Ftrace,开发人员可以详细了解内核的运行状态,从而更好地优化和调试内核模块。Ftrace 的配置和使用非常灵活,可以通过命令行工具和配置文件来控制其行为。Ftrace 提供了多种跟踪模式,其中主要包括function和两种模式。function模式是 Ftrace 最基本的跟踪模式,用于记录内核函数的调用。

weixin_51342637的博客 1211

飞塔防火墙CVE-2022-40684漏洞复现:手把手教你搭建靶场环境(附调试技巧)

本文详细指导如何搭建Fortinet飞塔防火墙CVE-2022-40684认证绕过漏洞的靶场环境,涵盖虚拟机部署、网络配置、调试模式开启及漏洞原理分析。通过手把手教程,读者可掌握漏洞复现与深度调试技巧,深入理解该认证绕过漏洞的利用与防御。

h6i7j8的博客 695

【linux调试】ftrace函数栈追踪

ftrace 追踪imx6ul 下驱动得加载过程

qq_42427720的博客 453

(侧边抽屉)移动端APP汉堡页设计全解:从规范落地到体验优化

汉堡页是一种隐藏式侧边导航组件,由汉堡图标(三条水平横线)、侧边抽屉面板、主界面遮罩层三部分构成。点击汉堡图标后,面板通常从左侧滑入,覆盖主界面部分区域(或悬浮于主界面之上);关闭时可通过点击关闭按钮、遮罩层、返回键或侧滑手势完成,是移动端特有的空间优化设计模式。

qq_67370502的博客 617

从零开始跑通3DGS教程:(四)修改(缩放、空间变换)colmap生成的sfm结果

通过colmap进行的sfm的普通方式会丢失场景的物理尺度信息,并且并不在符合一般认知的坐标系下,本文将读取colmap生成的点云和相机pose,将其进行空间变换和缩放之后,重新保存,新保存的结果仍然可以被colmap读取以及进行后续的稠密重建以及3dgs等工作

诺有缸的高飞鸟的博客 1425

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

转载: http://blog.youkuaiyun.com/ronliu/article/details/6446251   linux中大量使用函数指针钩子,导致阅读代码困难。比如想知道一个函数的调用路径,那么就只能用source insight之类的工具看代码了。有没有办法可以迅速获得调用关系的整体印象?ftrace是内核提供的一种调试工具,可以对内核中发生的事情进行跟 踪。比如函数的调用,进程的切...

weixin_33895516的博客 124

28、时间敏感网络中可靠性感知的综合路由与调度

本文针对时间敏感网络(TSN)中现有路由与调度机制主要关注时间触发(TT)流量而忽略其他类型流量效用的问题,提出了一种可靠性感知的综合路由与调度机制。通过将具有不同可靠性和延迟要求的各类流量的联合路由与调度问题形式化为基于优化模理论(OMT)的混合整数规划问题,设计了完整的路由约束与调度约束,并分析了不同类型流量的传输效用,设定了优化目标以提升整体网络性能。实验结果表明,该机制在满足TT流量严格时延与可靠性要求的同时,显著提高了AVB和BE等非关键流量的传输效用,实现了多类型流量的高效协同传输。

hhh00的博客 95

ftrace命令调试内核详细总结(快速掌握附实例讲解)

Ftrace是一个专门针对linux kernel内核空间的debug工具,用于帮助开发者弄清kernel正在发生的行为,对用户空间对内核低延时,内核性能等方面的问题进行调试分析。Ftrace最开始设计时主要是为了追踪函数的调用栈,但随着功能的增强,已经演变成一个跟踪框架,支持多种跟踪器,如function、function_graph、wakeup、irq等。

Luckiers的博客 6938

【华为OD机试】2024年真题C卷(python)-API集群负载统计

【华为OD机试】-API集群负载统计-【华为OD机试】-API集群负载统计:某个产品的 restful API 集合部署在服务器集群的多个节点上,近期对客户端访问日志进行了采集,需要统计各个API的访问频次,根据热点信息在服务器节点之间做负载均衡,现在需要实现热点信息统计查询功能。 restful API 是由多个层级构成,层级之间使用/连接,如 A/B/C/D 这个地址,A属于第一级,B属于第二级,C属于第三级,D属于第四级。 现在负载均衡模块需要知道给定层级上某个名字出现的频次,未出现过用0

u014481728的博客 1497

[QMT量化交易小白入门]-七、可转债双低策略Python代码详解与实战

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步,自己淋过雨了,希望大家都有一把伞。

木头大左的博客 3885

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

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

weixin_29596789的博客 419

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ftrace使用

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

angle_birds的专栏 3555

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

问题排查利器:Linux 原生跟踪工具 Ftrace 必知必会

TLDR:建议收藏,需要时查阅。如果你只是需要快速使用工具来进行问题排查,包括但不限于函数调用栈跟踪、函数调用子函数流程、函数返回结果,那么推荐你直接使用 BCC trace[1] 或 B...

云原生实验室 1494

ftrace使用介绍

ftrace使用介绍 1.介绍 Ftrace是一个专门针对linux kernel内核空间的debug工具,用于帮助开发者在用户空间对内核低延时,内核性能等方面的分析。 尽管ftrace最开始设计时主要是为了追踪函数的调用栈,但随着功能的增强,已经演变成一个跟踪框架,支持多种跟踪器,如function、function_graph、wakeup、irq等。另外一个很常用的功能就是事件跟踪,在用户空...

lunhui2016的博客 3222

用Ftrace跟踪内核模块

 创建时间:2010-05-23作者:杨民强 Steven YangE-mail:mqyoung@gmail.com转载请注明出处:http://blog.youkuaiyun.com/defeattroy/archive/2010/05/23/5618099.aspx  如果你需要分析一个内核模块的函数调用数或者希望得到各语句段的执行时间,那么这篇文章很适合您。 Ft

木马屠城 5887

调试内核工具之-ftrace

Ftrace是直接内置在内核的跟踪程序,可以理解成ftrace是内核态的strace,用于追踪内核态的调用记录,【适用场景】(1)主要用来跟踪延时和内核函数调用流程,分析性能问题。(2)如何在没有内核或程序代码的情况下查看系统调用的过程。

qq_48057735的博客 957

Ftrace 调试linux内核

Ftrace 调试linux内核 简介 ftrace 是内建于 Linux 内核的跟踪工具,从 2.6.27 开始加入主流内核。使用 ftrace 可以调试或者分析内核中发生的事情。ftrace 提供了不同的跟踪器,以用于不同的场合,比如跟踪内核函数调用、对上下文切换进行跟踪、查看中断被关闭的时长、跟踪内核态中的延迟以及性能问题等。系统开发人员可以使用 ftrace 对内核进行跟踪调试,以找到内核...

Kian_G 的博客 1010
上一篇: 理解Linux的进程,线程相关的各类ID:PID,LWP,TID,TGID
下一篇: 持久化内存简介
SweeNeil
博客等级 码龄9年 251粉丝 86原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值