Ftrace 进阶用法
1 前言
本文为 Ftrace 系列文章第二篇,描述 Ftrace 进阶用法。上一篇文章中我们接触到了 Ftrace 基本概念,知道了如何 trace 一个函数,知道了如何 enable 一个 trace event。
同时,上一篇文章也遗留了几个问题:
- 如何跟踪某个进程?如何跟踪一个命令,但是这个命令执行时间很短?
- 用户态的行为轨迹如何与内核中的 trace 联系到一起?
- 如何跟踪过滤多个进程?多个函数?
- 如何灵活控制 trace 的开关?
本文将一一解答上述问题。
2 查看函数调用栈
查看函数调用栈是内核调试最最基本得需求,常用方法:
- 函数内部添加 WARN_ON(1)
- ftrace
trace 函数的时候,设置 echo 1 > options/func_stack_trace 即可在 trace 结果中获取追踪函数的调用栈。
以 dev_attr_show 函数为例,看看 ftrace 如何帮我们获取调用栈:
$ cd /sys/kernel/debug/tracing
$ sudo -s
# echo 0 > tracing_on
# echo function > current_tracer
# echo dev_attr_show > set_ftrace_filter
// 设置 func_stack_trace
# echo 1 > options/func_stack_trace
# echo 1 > tracing_on
# cat trace
# tracer: function
#
# entries-in-buffer/entries-written: 8/8 #P:4
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
top-3008 [003] .... 621.507777: dev_attr_show <-sysfs_kf_seq_show
top-3008 [003] .... 621.507784: <stack trace>
=> dev_attr_show
=> sysfs_kf_seq_show
=> kernfs_seq_show
=> seq_read
=> kernfs_fop_read
=> __vfs_read
=> vfs_read
=> ksys_read
=> __x64_sys_read
=> do_syscall_64
=> entry_SYSCALL_64_after_hwframe
=> 0
=> 0
=> 0
=> 0
=> 0
=> 0
=> 0
=> 0
3 如何跟踪一个命令,但是这个命令执行时间很短?
首先我们介绍一下 ftrace 过滤控制相关文件:
| 文件名 | 功能 |
|---|---|
| set_ftrace_filter | function tracer 只跟踪某个函数 |
| set_ftrace_notrace | function tracer 不跟踪某个函数 |
| set_graph_function | function_graph tracer 只跟踪某个函数 |
| set_graph_notrace | function_graph tracer 不跟踪某个函数 |
| set_event_pid | trace event 只跟踪某个进程 |
| set_ftrace_pid | function/function_graph tracer 只跟踪某个进程 |
如果这时候问:如何跟踪某个进程内核态的某个函数?
答案是肯定的,将被跟踪进程的 pid 设置到 set_event_pid/set_ftrace_pid 文件即可。
但是如果问题变成了,我要调试 kill 的内核执行流程,如何办呢?
因为 kill 运行时间很短,我们不能知道它的 pid,所以就没法过滤了。
调试这种问题的小技巧,即 脚本化,这个技巧在很多地方用到:
sh -c "echo $$ > set_ftrace_pid; echo 1 > tracing_on; kill xxx; echo 0 > tracing_on"
PS:请在这里面加上你需要过滤的函数或其它设置
4 过滤技巧 - 如何跟踪过滤多个进程?多个函数?
4.1 情景1:函数名雷同,可以使用正则匹配
# cd /sys/kernel/debug/tracing
# echo 'dev_attr_*' > set_ftrace_filter
# cat set_ftrace_filter
dev_attr_store
dev_attr_show
4.2 情景2:追加某个函数
用法为:echo xxx >> set_ftrace_filter,例如,先设置 dev_attr_*:
# cd /sys/kernel/debug/tracing
# echo 'dev_attr_*' > set_ftrace_filter
# cat set_ftrace_filter
dev_attr_store
dev_attr_show
再将 ip_rcv 追加到跟踪函数中:
# cd /sys/kernel/debug/tracing
# echo ip_rcv >> set_ftrace_filter
# cat set_ftrace_filter
dev_attr_store
dev_attr_show
ip_rcv
4.3 情景3:基于模块过滤
格式为:<function>:<command>:<parameter>,例如,过滤 ext3 module 的 write* 函数:
$ echo 'write*:mod:ext3' > set_ftrace_filter
4.4 情景4:从过滤列表中删除某个函数,使用“感叹号”
格式为:<function>:<command>:<parameter>,例如,过滤 ext3 module 的 write* 函数:
$ echo 'write*:mod:ext3' > set_ftrace_filter
4.4 情景4:从过滤列表中删除某个函数,使用“感叹号”
感叹号用来移除某个函数,把上面追加的 ip_rcv 去掉:
# cd /sys/kernel/debug/tracing
# cat set_ftrace_filter
dev_attr_store
dev_attr_show
ip_rcv
# echo '!ip_rcv' >> set_ftrace_filter
# cat set_ftrace_filter
dev_attr_store
dev_attr_show
PS:上述所有涉及通配符的操作最好都加上单引号。
5 用户态内核态联动
有些问题是需要将用户态、内核态的行为联系在一起的,但是 printf/printk 天然是分家的,如何办?
答案是 trace_marker,用户态程序只需要打开 trace_marker 节点可以向其中写入内容,写入的内容会体现在 trace 文件中,与内核态的各种 trace 融合在一起,提供时间线、事件参考
# cd /sys/kernel/debug/tracing
# echo 'hello ftrace' > trace_marker
# cat trace
# tracer: nop
#
# entries-in-buffer/entries-written: 1/1 #P:4
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
<...>-2157 [001] .... 1227.772963: tracing_mark_write: hello ftrace
6 灵活控制 trace 开关
6.1 用户态
用户态程序可以很灵活的控制 trace 开关,因为可以在程序中打开 tracing_on 文件,灵活控制何时 enable,何时 disable。
6.2 内核态
如何在跟踪内核函数的时候灵活控制 trace enable/disable 呢?
首先明确这件事的意义:根据条件及时停止,更准确获取现场信息,同时防止后面的无效信息冲掉有效信息。
这种功能是通过 set_ftrace_filter 实现的,控制范式:<function>:<command>:<parameter>
简单示例:遇到 __schedule_bug 函数后关闭 trace
# echo '__schedule_bug:traceoff' > set_ftrace_filter
除了 traceoff 外,set_ftrace_filter 还支持其它的关键字,感兴趣的请阅读:filter-commands
7 前端工具
Ftrace 提供了 trace 能力,但是使用起来还是有点麻烦,所以有一些前端工具,一来方便大家使用,比如 trace-cmd,二来将许多调试能力大一统,比如 perf/bcc。
Ftrace 进阶用法的更多相关文章
- Django框架学习-Model进阶用法
Model进阶用法 回顾 访问外键 访问多对多关系 更改数据库结构 当处理数据库结构改变时,需要注意到几点: 增加字段 首先在开发环境中: 再到产品环境中: 删除字段 删除多对多字段 删除model ...
- canvas图形处理和进阶用法
前面的话 上一篇博客介绍了canvas基础用法,本文将更进一步,介绍canvas的图形处理和进阶用法 图形变换 图形变换是指用数学方法调整所绘形状的物理属性,其实质是坐标变形.所有的变换都依赖于后台的 ...
- 前端自动化测试神器-Katalon进阶用法
前言 上一篇介绍了Katalon的基础用法,本篇继续介绍一些进阶的用法. Keyword 和 Method Call Statement Keyword Keyword就是自定义方法,该方法在当前项目 ...
- SpringBoot进阶用法-随笔
SpringBoot进阶用法 实现setApplicationContext //实现ApplicationContextAware接口,重写setApplicationContext方法 publi ...
- CocoaPods学习系列4——进阶用法
这篇文章,记录一下CocoaPods的进阶用法. 进阶用法主要体现在.podspec文件和Podfile的配置上. .podspec文件的进阶配置 以官方的一个.podspec文件示例细说: Pod: ...
- (数据科学学习手札61)xpath进阶用法
一.简介 xpath作为对网页.对xml文件进行定位的工具,速度快,语法简洁明了,在网络爬虫解析内容的过程中起到很大的作用,除了xpath的基础用法之外(可参考我之前写的(数据科学学习手札50)基于P ...
- webpack进阶用法你都get到了么?
如何消除无用代码:打包自己的私有js库:实现代码分割和动态import提升初次加载速度:配置eslint规范团队代码规范:打包异常抓捕你都get到了么? 摇树优化:Tree Shaking webpa ...
- xpath进阶用法
一.简介 xpath作为对网页.对xml文件进行定位的工具,速度快,语法简洁明了,在网络爬虫解析内容的过程中起到很大的作用,除了xpath的基础用法之外xpath中还存在着非常之多的进阶用法,本文将对 ...
- ASP.NET Core 6框架揭秘实例演示[14]:日志的进阶用法
为了对各种日志框架进行整合,微软创建了一个用来提供统一的日志编程模式的日志框架.<日志的基本编程模式>以实例演示的方式介绍了日志的基本编程模式,现在我们来补充几种"进阶" ...
- Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍
大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第三篇了,先来回顾下前面两篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...
随机推荐
- Linux 有趣命令
代码雨 1.上传软件包 Linux 获取 wget https://jaist.dl.sourceforge.net/project/cmatrix/cmatrix/1.2a/cmatrix-1.2a ...
- Apache COC闪电演讲总结【OSGraph】
大家能看到我最近一直在折腾与OSGraph这个产品相关的事情,之前在文章<妙用OSGraph:发掘GitHub知识图谱上的开源故事>中向大家阐述过这个产品的设计理念和应用价值.比方说以下问 ...
- 【Java】关于获取注解的问题发现
同事设置了个注解,想用Spring获取的Bean来找到Class获取注解 但是发现是空的,在查看的Spring返回Bean之后,发现这个Bean对象并不是原生的实例 而是被Spring代理增强的代理对 ...
- 【Vue】Re03 computed属性计算和ES6的一些补充
一.Computed属性计算 四种计算处理的方式方法 <!DOCTYPE html> <html lang="en"> <head> <m ...
- python库 —— gym retro 的 ROMs文件下载地址
如题: python库 -- gym retro 的 ROMs文件下载地址: https://archive.org/details/No-Intro-Collection_2016-01-03_Fi ...
- lua环境配置与编译
1.背景 2.安装lua 官方下载地址:https://joedf.ahkscript.org/LuaBuilds/ 下载后解压即可 解压后: 配置环境变量: 检查是否安装成功: 如果能输出版本号,则 ...
- volatile重要特性-可见性,避免指令重排序-案例讲解
1.背景 volatile 修饰的作用???? 什么是可见性?? 什么是指令重排序?? 2.可见性-案例 package com.my.aqs; /** * @Copyright (C) XXXXX技 ...
- uniapp苹果开发用什么截屏
uniapp开发好苹果的app后,需要上架到app store connect后,用户才能使用app store进行安装. 在上架app store的过程中,却要求我们提供多种尺寸的app运行的设备截 ...
- Camera | 1.Camera基础知识
一口君最近在玩瑞芯微的板子,之前写了几篇基于瑞芯微的文章,大家可以学习一下. <瑞芯微rk356x板子快速上手> <Linux驱动|rtc-hym8563移植笔记> <L ...
- 【问答23】Linux移植:如何制作rootfs?
粉丝问题 如何制作rootfs? 安排! 想直奔主题的,直接跳到第四章. 一.分析 1. 文件系统简介 理论上说一个嵌入式设备如果内核能够运行起来,且不需要运行用户进程的话,是不需要文件系统的,文件系 ...