Linux Ftrace 使用

Ftrace相关的文章

如何利用ftrace精确跟踪特定进程调度信息

1、Ftrace 是什么东西?

Ftrace是一个直接内置在Linux内核中的跟踪工具。许多发行版在最近的发行版中已经启用了各种各样的Ftrace配置。Ftrace给Linux带来的好处之一是能够看到内核中发生了什么。因此,这使得发现问题区域或简单地跟踪奇怪的bug变得更容易管理。

上面那段话是直接翻译过来的,原文如下,我比较推荐大家直接看英文

Ftrace is a tracing utility built directly into the Linux kernel. Many distributions already have various configurations of Ftrace enabled in their most recent releases. One of the benefits that Ftrace brings to Linux is the ability to see what is happening inside the kernel. As such, this makes finding problem areas or simply tracking down that strange bug more manageable.

2、怎么使用Ftrace

我的实验平台是MT8167、Linux4.4内核

2.1、配置内核宏

weiqifa@bsp-ubuntu1804:~/is10-sdk$ git diff kernel-4.4/
diff --git a/kernel-4.4/arch/arm/configs/xxx_defconfig 
b/kernel-4.4/arch/arm/configs/xxx_defconfig
index 8da5210003..a88e53253f 100755
--- a/kernel-4.4/arch/arm/configs/xxx_defconfig
+++ b/kernel-4.4/arch/arm/configs/xxx_defconfig
@@ -400,3 +400,7 @@ CONFIG_USB_RTL8152=yCONFIG_USB_NET_DRIVERS=yCONFIG_GPIO_CONTROL=y#CONFIG_POGO_PIN=y
+CONFIG_FUNCTION_TRACER=y
+CONFIG_FUNCTION_GRAPH_TRACER=y
+CONFIG_STACK_TRACER=y
+CONFIG_DYNAMIC_FTRACE=y

2.2、烧录boot.img 重新开机

2.3、查看是否生效

进入ftrace 目录

xxx:/ # cd /sys/kernel/debug/tracing
xxx:/sys/kernel/debug/tracing # ls
README                     enabled_functions saved_cmdlines      set_graph_function trace_marker
available_events           events            saved_cmdlines_size set_graph_notrace  trace_options
available_filter_functions free_buffer       saved_tgids         snapshot           trace_pipe
available_tracers          instances         set_event           stack_max_size     tracing_cpumask
buffer_size_kb             max_graph_depth   set_event_pid       stack_trace        tracing_max_latency
buffer_total_size_kb       options           set_ftrace_filter   stack_trace_filter tracing_on
current_tracer             per_cpu           set_ftrace_notrace  trace              tracing_thresh
dyn_ftrace_total_info      printk_formats    set_ftrace_pid      trace_clock
xxx:/sys/kernel/debug/tracing #

查看内核支持的跟踪器列表

xxx:/sys/kernel/debug/tracing # cat available_tracers
function_graph function nop
xxx:/sys/kernel/debug/tracing #

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

  • 函数类:function, function_graph, stack

  • 延时类:irqsoff, preemptoff, preemptirqsoff, wakeup, wakeup_rt, waktup_dl

  • 其他类:nop, mmiotrace, blk

使能function_graph跟踪器

echo function_graph > current_tracer

查看当前的跟踪器

xxx:/sys/kernel/debug/tracing # cat current_tracer
function_graph
xxx:/sys/kernel/debug/tracing #

使能ftrace 功能

xxx:/sys/kernel/debug/tracing # echo 1 > tracing_on

查看ftrace输出

1|Knowin inSight10:/sys/kernel/debug/tracing # cat trace | head -40
# tracer: function_graph
#
# CPU  DURATION                  FUNCTION CALLS
# |     |   |                     |   |   |   |2)   4.000 us    |          } /* path_init */2)               |          link_path_walk() {2)               |            inode_permission2() {2)               |              __inode_permission2() {2)               |                generic_permission() {2)   0.384 us    |                  in_group_p();2)   2.154 us    |                }2)               |                security_inode_permission() {2)               |                  selinux_inode_permission() {2)   0.231 us    |                    __rcu_read_lock();2)   0.308 us    |                    avc_lookup();2)   0.231 us    |                    __rcu_read_unlock();2)   5.923 us    |                  }2)   7.846 us    |                }2) + 13.538 us   |              }2) + 15.308 us   |            }2)               |            walk_component() {2)               |              lookup_fast() {2)   0.307 us    |                __d_lookup_rcu();2)   0.307 us    |                __lookup_mnt();2)   4.231 us    |              }2)   6.077 us    |            }2)               |            inode_permission2() {2)               |              __inode_permission2() {3)   3.923 us    |                      } /* down_trylock */2)               |                generic_permission() {3)   6.538 us    |                    } /* console_trylock */2)   0.308 us    |                  in_group_p();3)               |                    console_unlock() {3)   0.231 us    |                      _raw_spin_lock_irqsave();2)   2.231 us    |                }2)               |                security_inode_permission() {2)               |                  selinux_inode_permission() {3)   0.308 us    |                      _raw_spin_unlock_irqrestore();2)   0.231 us    |                    __rcu_read_lock();3)   0.231 us    |                      _raw_spin_lock_irqsave();
Knowin inSight10:/sys/kernel/debug/tracing #

3、Ftrace 其他使用特点

直接cat trace 文件,内容太多了,我们可以通过设置filter来设置过滤函数。

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

  • value* 选择所有名字以 value字串开头的函数

  • *value* 选择所有名字中包含 value字串的函数

  • *value 选择所有名字以 value字串结尾的函数

设置filter

xxx:/sys/kernel/debug/tracing # echo raw* > set_ftrace_filter
xxx:/sys/kernel/debug/tracing #

再查看trace文件

xxx:/sys/kernel/debug/tracing # cat trace
# tracer: function_graph
#
# CPU  DURATION                  FUNCTION CALLS
# |     |   |                     |   |   |   |2)   1.693 us    |  raw_local_deliver();2)   0.308 us    |  raw_local_deliver();2)   1.000 us    |  raw_notifier_call_chain();2)   2.077 us    |  raw_notifier_call_chain();2)   1.923 us    |  raw_local_deliver();------------------------------------------2)  ntloop--1393  =>    <...>-16------------------------------------------2)   0.308 us    |  raw_local_deliver();------------------------------------------2)    <...>-16    =>    <idle>-0------------------------------------------2)   0.307 us    |  raw_notifier_call_chain();2)   0.846 us    |  raw_notifier_call_chain();2)   0.385 us    |  raw_notifier_call_chain();------------------------------------------2)    <idle>-0    =>  droid.b-4348------------------------------------------2)   1.000 us    |  raw_notifier_call_chain();2)   1.384 us    |  raw_notifier_call_chain();------------------------------------------2)  droid.b-4348  =>  Binder:-524------------------------------------------2)   0.923 us    |  raw_notifier_call_chain();2)   1.077 us    |  raw_notifier_call_chain();------------------------------------------2)  Binder:-524   =>  droid.b-4348------------------------------------------2)   1.000 us    |  raw_notifier_call_chain();------------------------------------------2)  droid.b-4348  =>  Binder:-524------------------------------------------2)   1.231 us    |  raw_notifier_call_chain();------------------------------------------2)  Binder:-524   =>  droid.b-4348------------------------------------------2)   1.077 us    |  raw_notifier_call_chain();2)   1.692 us    |  raw_notifier_call_chain();2)   2.000 us    |  raw_notifier_call_chain();2)   1.000 us    |  raw_notifier_call_chain();2)   0.923 us    |  raw_notifier_call_chain();2)   0.462 us    |  raw_notifier_call_chain();2)   1.000 us    |  raw_notifier_call_chain();2)   0.846 us    |  raw_notifier_call_chain();

查看中间字符串

xxx:/sys/kernel/debug/tracing # echo *touch* > set_ftrace_filter

查看trace

xxx:/sys/kernel/debug/tracing # cat trace |head -40
# tracer: function_graph
#
# CPU  DURATION                  FUNCTION CALLS
# |     |   |                     |   |   |   |0)               |  /* 6 [cpu_loading] not_reset_cpu_loading */0)               |  /* 6 [cpu_loading] update cpu_loading */0)               |  /* 6 [cpu_loading] cur_idle_time[0].time:933317139 cur_wall_time[0].time:1008009932*/0)               |  /* 6 [cpu_loading] cur_idle_time[1].time:936071150 cur_wall_time[1].time:1008009942*/0)               |  /* 6 [cpu_loading] cur_idle_time[2].time:917091836 cur_wall_time[2].time:1008009946*/0)               |  /* 6 [cpu_loading] cur_idle_time[3].time:890438730 cur_wall_time[3].time:1008009950*/0)               |  /* 6 [cpu_loading] cur_idle_time[0].time:933317139 cur_wall_time[0].time:1008009932*/0)               |  /* 6 [cpu_loading] cur_idle_time[1].time:936071150 cur_wall_time[1].time:1008009942*/0)               |  /* 6 [cpu_loading] cur_idle_time[2].time:917091836 cur_wall_time[2].time:1008009946*/0)               |  /* 6 [cpu_loading] cur_idle_time[3].time:890438730 cur_wall_time[3].time:1008009950*/0)               |  /* 6 [cpu_loading] tmp_cpu_loading:2 prev_cpu_loading:1 previous state:3*/0)               |  /* 6 [cpu_loading] sent uevent success:lower=2 */0)               |  /* 6 [cpu_loading] current state:3*/0)               |  /* 6 [cpu_loading] enable timer */1)   1.462 us    |  touch_atime();1)   0.616 us    |  touch_atime();1)   0.385 us    |  touch_atime();1)   0.538 us    |  touch_atime();1)   0.539 us    |  touch_atime();1)   1.461 us    |  touch_atime();1)   0.308 us    |  touch_atime();1)   0.385 us    |  touch_atime();1)   0.385 us    |  touch_atime();1)   2.000 us    |  touch_atime();1)   0.923 us    |  touch_atime();1)   0.615 us    |  touch_atime();
xxx:/sys/kernel/debug/tracing #

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

echo ':mod:[module_name]' > set_ftrace_filter

查看对应的内核模块

xxx:/sys/kernel/debug/tracing # cat /proc/devices
Character devices:1 mem2 pty3 ttyp4 ttyS5 /dev/tty5 /dev/console5 /dev/ptmx10 misc13 input14 sound29 fb

使用过滤器只针对某个模块进行跟踪

xxx:/sys/kernel/debug/tracing # echo ':mod:sound' > set_ftrace_filter
1|xxx:/sys/kernel/debug/tracing #

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

4.参考资料

[1]、 https://lwn.net/Articles/365835/

[2]、https://www.kernel.org/doc/Documentation/trace/ftrace.txt

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cortex M3寄存器组

寄存器组 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、通用目的寄存器R0~R7 R0-R7 也被称为低组寄存器。所有指令都能访问它们。它们的字长全是 32 位&#xff0c;复位后的初始值是不可预料的。 2、通用目的寄存器 R8-R12 R8-R12 也被称为高组寄…

深度学习-超参数调优

在机器学习中有很多调优的方式机器学习——超参数调优&#xff0c;深度学习中也存在同样的方式&#xff0c;接下来&#xff0c;介绍一下深度学习框架里边的自动调参模块。 1. 基于Tensorflow的Keras tuner 官方教程如下&#xff1a;Introduction to the Keras Tuner | Tens…

Paddle——常见的评估指标

在模型评估过程中&#xff0c;分类、回归、排序问题往往使用不同的指标进行评估。分类问题通常用准确率、召回率、精准率、F1值等指标进行评估&#xff1b;回归问题使用MSE、RMSE、R^2、MAPE等&#xff1b; 1 分类评估原理 1.1 准确率的局限性 我们经常接触的评价指标就是准…

大江大河,随笔观后感

我是「大江大河」的铁粉&#xff0c;非常喜欢这部剧&#xff0c;从这部剧里面能看到生活的一些影子。从这部剧里面也可以看到不同阶层的人们对待生活&#xff0c;对待理想&#xff0c;对待身边的朋友亲人的态度。—— 知乎热论「程开颜为什么输给了杨思申&#xff1f;」程开颜并…

Cortex M3内核架构

CortexM3内核架构 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、ARMCortex-M3处理器 Cortex-M3处理器内核是单片机的中央处理单元&#xff08; CPU&#xff09;。 完整的基于CM3的MCU还需要很多其它组件。在芯片制造商得到CM3处理器内核的使用授权…

NLP——序列标注之命名实体识别

1.概述 序列标注包括自然语言处理中的分词&#xff0c;词性标注&#xff0c;命名实体识别&#xff0c;关键词抽取&#xff0c;词义角色标注等。解决方案是NN模型&#xff08;神经网络模型&#xff09;CRF 命名实体识别&#xff08;Named Entity Recognition&#xff0c;简称N…

C语言验证6174数学问题

有意思的数学问题任意4位不完全一样的数字&#xff0c;能组合出的最大数字减去能组合出的最小数字&#xff0c;得到一个新的数字(3位数补0&#xff09;&#xff0c;重复以上操作&#xff0c;不超过7个循环&#xff0c;必然得到一个数&#xff1a;6174这个问题是之前发布的文章&…

Cortex-M3工作模式与异常

Cortex-M3工作模式与异常 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、工作模式 线程模式和手柄模式。 当处理器处在线程状态下时&#xff0c;既可以使用特权级&#xff0c;也可以使用用户级&#xff1b;另一方面&#xff0c; handler模式总是特…

自己动手实现一个malloc内存分配器 | 30图

对内存分配器透彻理解是编程高手的标志之一。如果你不能理解malloc之类内存分配器实现原理的话&#xff0c;那你可能写不出高性能程序&#xff0c;写不出高性能程序就很难参与核心项目&#xff0c;参与不了核心项目那么很难升职加薪&#xff0c;很难升级加薪就无法走向人生巅峰…

机器学习面试——分类算法SVM

1、什么是硬间隔和软间隔&#xff1f; 当训练数据线性可分时&#xff0c;通过硬间隔最大化&#xff0c;学习一个线性分类器&#xff0c;即线性可分支持向量机。 当训练数据近似线性可分时&#xff0c;引入松弛变量&#xff0c;通过软间隔最大化&#xff0c;学习一个线性分类器…

Cortex M3 NVIC与中断控制

Cortex M3 NVIC与中断控制 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、NVIC概览 ——嵌套中断向量表控制器 NVIC 的寄存器以存储器映射的方式来访问&#xff0c;除了包含控制寄存器和中断处理的控制逻辑之外&#xff0c; NVIC 还包含了 MPU、 S…

VS 2005 或 VS 2008 在安装VSS 2005后,看不到源代码管理的解决办法

昨天有朋友在重新安装VS 2008后&#xff0c;再安装VSS 2005&#xff0c;安装好后在文件菜单中找不到“源代码管理”的菜单项&#xff0c;后来经朋友告知&#xff0c;是开发工具的默认选项设置问题。打开开发工具&#xff0c;“工具”--“选项”&#xff1a;&#xff08;如图&am…

代码里-3gt;gt;1是-2但3gt;gt;1是1,-3/2却又是-1,为什么?

之前群里有个同学向大家提出了类似这样的问题。随后这位同学公布了答案&#xff1a;右移运算是向下取整&#xff0c;除法是向零取整。这句话对以上现象做了很好的总结&#xff0c;可是本质原因是什么呢&#xff1f;我一直以为-3>>1的结果是-1。所以打算思考一下这个问题。…

机器学习面试——逻辑回归和线性回归

1、什么是广义线性模型&#xff08;generalize linear model&#xff09;&#xff1f; 普通线性回归模型是假设X为自变量&#xff0c;Y为因变量&#xff0c;当X是一维的&#xff0c;y是一维的&#xff0c;共进行n次观测&#xff0c;则 其中&#xff0c;w是待估计的参数&#x…

STM32开发环境

STM32开发环境 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、MDK安装 MDK 是一个集代码编辑&#xff0c;编译&#xff0c;链接和下载于一体的集成开发环境&#xff08; KDE &#xff09;。MDK 这个名字我们可能不熟悉&#xff0c;但说到 KEIL …

机器学习面试——XGBoost,GBDT,RF(上)

1、常见的集成思想 bagging&#xff1a;基学习器之间并行训练&#xff0c;且学习器之间没有依赖&#xff0c;像是集体决策的过程&#xff0c;每个个体都进行单独学习&#xff0c;再通过投票的方式做最后的集体决策。常见的算法有随机森林 boosting&#xff1a;基学习器之间串…

听说有人不了解柔性数组

1 引言 定长数组包在平时的开发中&#xff0c;缓冲区数据收发时&#xff0c;如果采用缓冲区定长包&#xff0c;假定大小是 1k&#xff0c;MAX_LENGTH 为 1024。结构体如下&#xff1a;// 定长缓冲区 struct max_buffer {int len;char data[MAX_LENGTH]; };数据结构的大小 &…

Transformer模型拆解分析

资源来自&#xff1a;DataWhale 学习资料 最近看了DataWhale 的Transformer图解&#xff0c;突然对Transformer的结构图有了更加清晰的理解&#xff0c;特此记录。 1、大框架 Transformer是由6个encoder和6个decoder组成&#xff0c;模型的具体实现是model变量里边&#xff0…

设计模式学习笔记六:.NET反射工厂

1&#xff0e; 简述 通过前面的学习&#xff0c;我们以传统的方式实现了简单工厂&#xff0c;工厂方法和抽象工厂&#xff0c;但是有些场合下如此处理&#xff0c;代码会变得冗余并且难以维护。假设我们要创建交通工具。可以是汽车&#xff0c;火车&#xff0c;轮船等&#xff…