利用ftrace跟踪内核static tracepoint
摘要:和很多linux内核子系统一样,static tracepoint有很多层次,其中某个层次都展示给不同层次的开发者来满足他们的不同需求。关于linux tracepoint的详细信息,我们可以在linux内核文档Documentation/trace/tracepoints.txt和 samples/tracepoints这两个地方找到。大致来说,对tracepoints本身的定义是第一个层次,一般只有内核开发者才会定义这些tracepoints;trace event是第二个层次,用于debug;第三个层次就是perf这些内核测试工具,他们调用底层的trace events来监控系统内核的某些特性。
一个tracepoint可以理解为一个linux内核中的占位符函数,内核子系统的开发者常常用它们来debug。static表明这些tracepoint的位置是固定的,你可以把它理解位传统C程序中的 #if DEBUG部分。如果在运行时没有开启,它们是不占用任何系统开销的。本文主要为你讲解如何用ftrace来使用这些tracepoint,当然,你也可以使用perf来使用这些tracepoints。
本文来源:
1.什么是linux static tracepoint
所有这些灵活性也有一定的缺点。一个可执行的kprobe有一个显著的负载——因为它利用了breakpoints和exception hadlers。另一个方面是probe的放置地点:kprobes可以很方便的放置在函数入口或者出口,但是如果你需要把probe放置在函数内部或者需要probe局部变量,那么你就需要systemtap和配置了 CONFIG_DEBUG_INFO的自己编译的内核。 从这个角度上看,静态tracepoints可以被放置在函数的任意地方,而且可以越过任意重要的局部变量。linux 2.6.32的主线以后已经实现了比较多的静态tracepoint。
增加一个静态tracepoint是非常简单的,你可以参考这个例子。在这个例子中,我给已经存在的trace组(irq)增加tracepoint,所以我仅仅需要定义tracepoint和这些tracepoints。你可以在内核的文档linux/samples/trace_events/trace-events-sample.h中找到一个tracepoint定义的五个部分的解释。针对更加复杂的例子,可以参考linux/samples/trace_events/。
2.使用linux static tracepoint
2.1挂载debug文件系统
mount -t debugfs nodev /debug
2.2查看可供使用的tracepoints # cat /sys/kernel/debug/tracing/available_events skb:skb_copy_datagram_iovec skb:kfree_skb block:block_rq_remap block:block_remap block:block_split block:block_unplug_io block:block_unplug_timer
Since we added our tracepoints to the irq group, we can find them in tracing/events/irq:
# ls /sys/kernel/debug/tracing/events/irq/ enable irq_handler_entry softirq_entry tasklet_entry filter irq_handler_exit softirq_exit tasklet_exit
Enable the tasklet tracepoints:
# echo 1 > /sys/kernel/debug/tracing/events/irq/tasklet_entry/enable # echo 1 > /sys/kernel/debug/tracing/events/irq/tasklet_exit/enable
And the output is available in the trace buffer:
# cat /sys/kernel/debug/tracing/trace # tracer: nop # # TASK-PID CPU# TIMESTAMP FUNCTION # | | | | | -0 [000] 327.349213: tasklet_entry: func=.rpavscsi_task -0 [000] 327.349217: tasklet_exit: func=.rpavscsi_task
When finished, we can disable the tracepoints. There are enable files at all levels of the hierarchy, so we can disable all tracepoints in one go:
# echo 0 > /sys/kernel/debug/tracing/events/enable
3.在内核模块中使用静态tracepoints
Kernel modules can also make use of static tracepoints. A simple module that hooks the tasklet_entry tracepoint and printks the function name of the tasklet might look like (I’ve called it tracepoint-example.c):
#include <linux/interrupt.h>
#include <linux/module.h>
#include <trace/events/irq.h>
static void probe_tasklet_entry(struct tasklet_struct *t)
{
printk("tasklet_entry %pf\n", t->func);
}
static int __init trace_init(void)
{
WARN_ON(register_trace_tasklet_entry(probe_tasklet_entry));
return 0;
}
static void __exit trace_exit(void)
{
unregister_trace_tasklet_entry(probe_tasklet_entry);
}
module_init(trace_init)
module_exit(trace_exit)
MODULE_LICENSE("GPL");
4 利用ftrace跟踪static tracepoints
以下所有操作均在/debug/tracing目录下进行
大致的步骤为:设定要监控的event,实际上也就是要监控的一系列的tracepoints;设定tracer成nop;开启tracing_on;查看结果。
4.1 使用event有两种方式
i) 通过set_event文件
events被组织成一个个子系统,如ext4,irq,sched等待,一个完整的event name是这样的:<subsystem>:<event>,其中subsystem是可选的,一个子系统中所有的events可以通过<subsystem>:*指定。
- #echo *:* > set_event
- #echo 'irq:*' > set_event
ii) 通过'enable' toggle
实例:我们需要监控writeback子系统,那么需要进行如下设定
$:echo writeback > set_event
4.2开启监控
$:echo nop > current_tracer
$:echo 1 > tracing_on
(wait for a moment......)
4.3结果查看:event trace的意义
$:cat trace | head -20
输出结果如下:
关于输出结果的意义,可以到对应events下面,利用cat fromat查看输出格式和意义
这里,不以common_开头的filed是每个event特有的。每一个event对应的有一个TRACE_EVENT定义一个record,这里offset为field在record中的偏移,size为其大小。下载一个内核,在samples/trace_events目录下有一个例子,可以查看TRACE_EVENT的定义方法。
4.4event filter
语法:
- field-name relation-operatior value //一个predicate
可以通过'&&', '||',以及圆括号将几个predicate组合起来。对于数字域,可以使用操作符==, !=, < , > , <=, >=,对于字符串域,可以使用==, !=。目前字符串只支持完全匹配,且最多可以组合16个predicate。
例子:
- #cd /sys/kernel/debug/tracing/events/signal/signal_generate
- #echo "((sig >= 10 && sig < 15) || sig == 17) && comm != bash" > filter
每个子系统都有独立的filter文件支持,如:
可以看到,虽然将sched子系统的filter设为prev_pid == 0,但由于只有sched_switch事件存在prev_pid域,所以对sched的filter文件的设置只影响了sched_switch。
4.5定义一个event-enabled tracepoint
定义tracepoint不在本文讨论范围之内
参考文档:
【1】Linux Static Tracepoints 【2】
【3】ftrace 学习笔记:
【4】tracing on linux
利用ftrace跟踪内核static tracepoint的更多相关文章
- 利用ftrace跟踪内核static tracepoint——实例writeback event
摘要:和很多linux内核子系统一样,static tracepoint有很多层次,其中某个层次都展示给不同层次的开发者来满足他们的不同需求.关于linux tracepoint的详细信息,我们可以在 ...
- 跟踪内核启动过程CONFIG_DEBUG_LL【转自】
转自:http://bbs.chinaunix.net/thread-3642079-1-1.html 最近在调试Linux内核,跟踪启动过程.发现在没有turn on mmu之前,可以使用物理地址, ...
- Fibratus:一款功能强大的Windows内核漏洞利用和跟踪工具
今天给大家介绍的是一款名叫Fibratus的开源工具,广大研究人员可以使用这款功能强大的工具来进行Windows内核漏洞利用.挖掘与跟踪. Fibratus这款工具能够捕捉到绝大多数的Windows内 ...
- 在Oracle中利用SQL_TRACE跟踪SQL的执行
当你在执行一条SQL语句非常慢的时候,你是不是想问Oracle怎么执行这条语句的呢? Oracle提供的SQL_TRACE工具可以让你知道你执行的SQL究竟做了什么.执行的过程会被 输出到trace文 ...
- Qemu+gdb跟踪内核源码
1.编译安装Qemu Qemu源码下载地址:http://wiki.qemu.org/Download linux下可以直接用wget下载: wget http://wiki.qemu.org/dow ...
- 利用sql_trace跟踪一个指定会话的操作
1. sys用户给管理用户授权.SQL> grant execute on sys.dbms_system to andy;Grant succeeded.2. 查询被跟踪用户的sid,ser ...
- Kali Rolling 下利用rtl-sdr跟踪飞机路线
环境 kali rolling 状态:未升级发行版,仅用 "apt-get upgrade " 命令更新了软件 原料 RTL-SDR电视棒一个,芯片是RTL2832U 原理 我国民 ...
- 问题排查利器:Linux 原生跟踪工具 Ftrace 必知必会
本文地址:https://www.ebpf.top/post/ftrace_tools TLDR,建议收藏,需要时查阅. 如果你只是需要快速使用工具来进行问题排查,包括但不限于函数调用栈跟踪.函数调用 ...
- ftrace:跟踪你的内核函数! | Linux 中国
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/F8qG7f9YD02Pe/article/details/79161135 ftrace 是一个 L ...
随机推荐
- json & pickle数据序列化
序列化:把内存中的数据对象变成字符串 info = { 'name':'tom', 'age':22 } f = open("test.txt","w") f. ...
- 斐讯面试记录—三线程交替打印ABC
package cn.shenzhen.feixun; public class PrintABC extends Thread{ private String name; private Objec ...
- [HZNUOJ] 使用Excel + Word 批量制作准考证
一般程序设计考试或者ACM比赛都会使用临时账号登录,这时候就需要批量制作密码条 首先需要用Excel 存储队伍的信息 比如像这样分门别类的放好 然后在word 中制作好密码条样式 选择邮件->开 ...
- spoj1812 LCS2 - Longest Common Substring II
地址:http://www.spoj.com/problems/LCS2/ 题面: LCS2 - Longest Common Substring II no tags A string is fi ...
- NIO 02 (转)
本文转自:http://weixiaolu.iteye.com/blog/1479656 SelectionKey.OP_ACCEPT // 服务端监听,并注册OP_ACCEPT事件后,就已准备好接受 ...
- react build 后打包发布总结
一,部署在apache web服务器上(wamp | xammp) 1.后台接口需要做跨域设置 (1)在服务端利用Access-Control-Allow-Origin响应头解决. 设置A ...
- 【.Net基础二】浅谈引用类型、值类型和装箱、拆箱
目前在看CLR via C#,把总结的记下来,索性就把他写成一个系列吧. 1.[.Net基础一] 类型.对象.线程栈.托管堆运行时的相互关系 2.[.Net基础二]浅谈引用类型.值类型和装箱.拆箱 引 ...
- linux ftp 简单搭建
1.安装 yum install vsftpd 2.重启服务 /sbin/service vsftpd restartShutting down vsftpd: [ OK ]Starting vsft ...
- 20145216史婧瑶《Java 程序设计》第4周学习总结
20145216 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承与多态 6.1 何谓继承 继承基本上就是避免多个类间重复定义共同行为. 在Java中,继承时使用exte ...
- 20145310 《Java程序设计》第2周学习总结
20145310 <Java程序设计>第2周学习总结 教材学习内容总结 第三章主要学习了java的基础语法. java中的基本类型主要可区分为,整数.字节.浮点数.字符与布尔.整数shor ...