目录

  • 1.前言
  • 2.Tracing event的用法
    • 2.1.通过‘set_event’接口
    • 2.2 通过enable
    • 2.3 boot选项
  • 3.定义一个trace event
  • 4.event格式
  • 5.Event filtering
    • 5.1 filter格式
    • 5.2 设置 filter
    • 5.3 清除filter
    • 5.4 子系统filter
    • 5.5 PID filter
  • 6.触发event
    • 6.1 Expression syntax
    • 6.2 支持的trigger command
      • enable_event/disable_event
      • stacktrace
      • snapshot
      • traceon/traceoff
  • 参考文档

1.前言

本文档都是对内核文档《Event Tracing》的翻译和整理。Tracing event实际是建立在Trace points基础之上的,使用Tracing event不用像tracing point那样需要自己定义probe函数,而且这些probe函数往往要通过模块的方式进行定义,然后加载,而Tracing event提供了TRACE_EVENT宏,可以通过复杂宏帮助定义统一格式的probe函数,而Tracing event需要用户指定trace 信息以何种格式存放到ring buffer中,trace信息将以何种格式打印。

2.Tracing event的用法

主要有如下几种用法:

2.1.通过‘set_event’接口

#cat /sys/kernel/debug/tracing/available_events

查看支持的event

 #echo sched_wakeup >> /sys/kernel/debug/tracing/set_event

使能一个特定的event

#echo '!sched_wakeup' >> /sys/kernel/debug/tracing/set_event

禁用一个特定的event

#echo > /sys/kernel/debug/tracing/set_event

禁用所有的event

#echo *:* > /sys/kernel/debug/tracing/set_event

使能所有子系统的所有event

 #echo 'irq:*' > /sys/kernel/debug/tracing/set_event

使能某个子系统的所有event

2.2 通过enable

#echo 1 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable

使能某个子系统的某个event

#echo 0 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable

禁用某个子系统的某个event

#echo 1 > /sys/kernel/debug/tracing/events/sched/enable

使能某个子系统的所有event

#echo 0 > /sys/kernel/debug/tracing/events/sched/enable

禁用某个子系统的所有event

#echo 1 > /sys/kernel/debug/tracing/events/enable

使能所有子系统的所有event

当读取这个节点时候将会有如下的显示结果:
0 - all events this file affects are disabled
1 - > all events this file affects are enabled
X - there is a mixture of events enabled and disabled
? - this file does not affect any event

2.3 boot选项

trace_event=[event-list]

为了在启动阶段能跟踪trace打印

注:event-list需要用“,”作为分隔符

3.定义一个trace event

看考内核代码 sample/trace_events

4.event格式

每个event有一个format文件,包含了记录log的每个field的描述符,这个主要用来解析二进制trace文件,同时也可以用于查找,以便在filters中使用。任何的filed有如下的格式:

field:field-type field-name; offset:N; size:N;

如:对于scsi_dispatch_cmd_start,cat format如下:

#cat /sys/kernel/debug/tracing/events/scsi/scsi_dispatch_cmd_start/format
name: scsi_dispatch_cmd_start
ID: 446
format:field:unsigned short common_type;       offset:0;       size:2; signed:0;field:unsigned char common_flags;       offset:2;       size:1; signed:0;field:unsigned char common_preempt_count;       offset:3;       size:1; signed:0;field:int common_pid;   offset:4;       size:4; signed:1;field:unsigned int host_no;     offset:8;       size:4; signed:0;field:unsigned int channel;     offset:12;      size:4; signed:0;field:unsigned int id;  offset:16;      size:4; signed:0;field:unsigned int lun; offset:20;      size:4; signed:0;field:unsigned int opcode;      offset:24;      size:4; signed:0;field:unsigned int cmd_len;     offset:28;      size:4; signed:0;field:unsigned int data_sglen;  offset:32;      size:4; signed:0;field:unsigned int prot_sglen;  offset:36;      size:4; signed:0;field:unsigned char prot_op;    offset:40;      size:1; signed:0;field:__data_loc unsigned char[] cmnd;  offset:44;      size:4; signed:0;

其中前4个为公共的,固定的格式,剩余的是每个 event 个性化的信息格式

5.Event filtering

可以通过filter表达式对event进行过滤,只要event的信息进入到trace buffer后,field值就会与filter表达式进行检查,只有field值与filter匹配才能够输出,如果不匹配将会被丢弃。对于一个event默认是没有定义filter,会输出所有的log

5.1 filter格式

field-name relational-operator value

(1)如果有多个filter格式可以用逻辑表达式链接
‘&&’ and ‘||’

(2)field-name为format中定义的域名
(3)relational-operator
对于数值:
==, !=, <, <=, >, >=, &

对于字符串
==, !=, ~

5.2 设置 filter

#cd /sys/kernel/debug/tracing/events/sched/sched_wakeup
#echo "common_preempt_count > 4" > filter

将表达式通过echo写入event文件节点下的filter节点
更复杂一点的例子

# cd /sys/kernel/debug/tracing/events/signal/signal_generate
# echo "((sig >= 10 && sig < 15) || sig == 17) && comm != bash" > filter

如果表达式错误,会报出错信息,通过cat filter可以查看到错误在哪个位置

# cd /sys/kernel/debug/tracing/events/signal/signal_generate
# echo "((sig >= 10 && sig < 15) || dsig == 17) && comm != bash" > filter
-bash: echo: write error: Invalid argument
# cat filter
((sig >= 10 && sig < 15) || dsig == 17) && comm != bash
^
parse_error: Field not found

5.3 清除filter

向filter节点写入0

5.4 子系统filter

  • 清除子系统filter
# cd /sys/kernel/debug/tracing/events/sched
# echo 0 > filter
# cat sched_switch/filter
none
# cat sched_wakeup/filter
none
  • 设置子系统filter
    使用common filed为子系统的所有event设置filter,所有event使用新的filter
# cd /sys/kernel/debug/tracing/events/sched
# echo common_pid == 0 > filter
# cat sched_switch/filter
common_pid == 0
# cat sched_wakeup/filter
common_pid == 0

使用私有fileld设置子系统filter,只会对有此属性的event生效

# cd /sys/kernel/debug/tracing/events/sched
# echo prev_pid == 0 > filter
# cat sched_switch/filter
prev_pid == 0
# cat sched_wakeup/filter
common_pid == 0

5.5 PID filter

只为特定进程trace event

# cd /sys/kernel/debug/tracing
# echo $$ > set_event_pid //跟踪当前进程
# echo 1 > events/enable

为更多PID追加跟踪

# echo 123 244 1 >> set_event_pid

6.触发event

通过让一个 event与一个 trigger关联,通过设置event的filter,当检测filter匹配时,也就是event命中,与event关联的trgger会被触发。如果没有设置filter则总是匹配

6.1 Expression syntax

语法是建立在set_ftrace_filter 基础上的

# echo 'command[:count] [if filter]' > trigger

添加trigger

# echo '!command[:count] [if filter]' > trigger

移除trigger

注:
1.移除trigger时, [if filter]可以用!代替,因为是不做检查的
2.filter与前述event filter语法是一样的
3.无法通过>>来追加trigger
4.无法一次性删除所有的trigger,只能用!command的方式移除

6.2 支持的trigger command

enable_event/disable_event

(1)格式:
enable_event::[:count]
disable_event::[:count]

(2)举例:

# echo 'enable_event:kmem:kmalloc:1' > \/sys/kernel/debug/tracing/events/syscalls/sys_enter_read/trigger

当sys_enter_read事件命中,kmalloc事件被使能

# echo 'disable_event:kmem:kmalloc' > \/sys/kernel/debug/tracing/events/syscalls/sys_exit_read/trigger

当sys_exit_read事件命中,kmalloc事件被禁用

# echo '!enable_event:kmem:kmalloc:1' > \/sys/kernel/debug/tracing/events/syscalls/sys_enter_read/trigger
# echo '!disable_event:kmem:kmalloc' > \/sys/kernel/debug/tracing/events/syscalls/sys_exit_read/trigger

移除命令
注:enable_event/disable_event可以支持一个trigger对应多条命令,但是每条命令只能有一个版本,如上述对于kmalloc事件,只允许有一个版本,不支持:
kmem:kmalloc and kmem:kmalloc:1 or ‘kmem:kmalloc if bytes_req == 256’ and ‘kmem:kmalloc if bytes_alloc == 256’

stacktrace

当trigger事件发生时会dump stack到trace buffer
(1)格式:
stacktrace[:count]

(2)举例:

# echo 'stacktrace' > \/sys/kernel/debug/tracing/events/kmem/kmalloc/trigger

kmalloc事件发生时dump stack

# echo 'stacktrace:5 if bytes_req >= 65536' > \/sys/kernel/debug/tracing/events/kmem/kmalloc/trigger

kmalloc事件发生,且bytes_req >= 65536时dump stack 5次

# echo '!stacktrace' > \/sys/kernel/debug/tracing/events/kmem/kmalloc/trigger
# echo '!stacktrace:5 if bytes_req >= 65536' > \/sys/kernel/debug/tracing/events/kmem/kmalloc/trigger

# echo '!stacktrace:5' > \/sys/kernel/debug/tracing/events/kmem/kmalloc/trigger

移除上述命令

注:每个trigger只能有一个stacktrace

snapshot

当事件发生时snapshot触发,创建一个快照,一般是在一个event命中时,需要trace很多个event时使用

# echo 'snapshot if nr_rq > 1' > \/sys/kernel/debug/tracing/events/block/block_unplug/trigger

a block request queue is unplugged with a depth > 1时,创建一个快照

# echo 'snapshot:1 if nr_rq > 1' > \/sys/kernel/debug/tracing/events/block/block_unplug/trigger

a block request queue is unplugged with a depth > 1时,创建一个快照1次

# echo '!snapshot if nr_rq > 1' > \/sys/kernel/debug/tracing/events/block/block_unplug/trigger
# echo '!snapshot:1 if nr_rq > 1' > \/sys/kernel/debug/tracing/events/block/block_unplug/trigger

移除上面的命令
注:每个trigger只能有一个snapshot

traceon/traceoff

当事件命中时,trace on或trace off

# echo 'traceoff:1 if nr_rq > 1' > \/sys/kernel/debug/tracing/events/block/block_unplug/trigger

the first time a block request queue is unplugged with a depth > 1,trace off

# echo 'traceoff if nr_rq > 1' > \/sys/kernel/debug/tracing/events/block/block_unplug/trigger

always disable tracing when nr_rq > 1:

# echo '!traceoff:1 if nr_rq > 1' > \/sys/kernel/debug/tracing/events/block/block_unplug/trigger
# echo '!traceoff if nr_rq > 1' > \/sys/kernel/debug/tracing/events/block/block_unplug/trigger

To remove the above commands
注: that there can be only one traceon or traceoff trigger per triggering event.
hist
See Documentation/trace/histogram.txt for details and examples.

参考文档

1.https://www.kernel.org/doc/html/v4.17/trace/events.html

Tracing event相关推荐

  1. 50 【Go版本变化】

    Go的版本介绍:https://golang.org/project/ https://golang.org/doc/go1.4 #Go1.4# 语言层面变化较少,但是编译器而言是有巨大的突破的,体现 ...

  2. Oracle事件诊断列表

    oracle事件诊断列表,从0到20000,并输出到文件oracle.txt中. SET linesize 120 SET feedback off SET SERVEROUTPUT ON spool ...

  3. trace系列0 - 概述

    1.前言 本文主要是根据阅码场 <Linux内核tracers的实现原理与应用>视频课程在aarch64上的实践.这是整个系列文章的第一篇,本篇主要解决如下几个问题: ftrace是什么? ...

  4. ORA_ERROR大全

    常见错误: -60 ORA00060: deadlock detected while waiting for resource 一般错误:   - 1 ORA00001: unique constr ...

  5. trace系列4 - kprobe学习笔记

    目录 0.前言 1. kprobe的总体原理 2. kprobe领域模型 3. kprobe创建 3.1 create_or_delete_trace_kprobe 3.1.1 register_tr ...

  6. Android笔记-Linux Kernel Ftrace (Function Trace)解析

    from : http://blog.csdn.net/hlchou/article/details/6441272 [ ftrace 简介 http://www.ibm.com/developerw ...

  7. linux内核文档汇集

    链接:https://01.org/linuxgraphics/gfx-docs/drm/ The Linux Kernel documentation This is the top level o ...

  8. ORACLE ERROR大全

    ORA_ERROR大全 1 ORA00001: unique constraint (.) violated -17 ORA00017: session requested to set trace ...

  9. Event Tracing for Windows

    突然ですが.皆さんは.馬に乗ったことはありますか?・・・このお話にご興味のある方は本文の最後の[閑話休題]までどうぞ. さて.今回は. Event Tracing for Windows (ETW) ...

最新文章

  1. sass文件编译的三种方式【舒】
  2. 一起谈.NET技术,.NET并行(多核)编程系列之七 共享数据问题和解决概述
  3. centos linux内核编译环境,CENTOS linux kernel 内核编译
  4. JDK15真的来了,一起来看看它的新特性
  5. linux编译避免污染源码分离,如何避免linux上的系统标准C/C++库?
  6. java foreach并行_使用foreach在Java中迭代并行数组的漂亮方法
  7. java将数组置零的函数,Java Script 数组内置函数
  8. NIO(一)——缓冲区Buffer
  9. vue json对象转数组_vue的数据驱动原理及简单实现
  10. Android 开机Logo、铃声、震动修改方案
  11. 需求分析之矩阵分析法
  12. s7 modbus测试软件,S7-1200 Modbus-Tcp通讯测试
  13. clamav查杀病毒
  14. html如何制作展开全文,如何实现文章内容页点击“展开阅读全文”的功能
  15. mysql window系统备份远程数据库到本地
  16. 学java去中公还是黑马_公务员考试复习:巧做一匹大黑马
  17. 一个简单的网页制作期末作业,学生个人html静态网页制作成品代码
  18. NCAE(全国工业和信息化应用人才考试 )-- 服务外包 JAVA 软件开发复习整理(一)
  19. 网站内页移动适配Meta标注声明 (DEDE 版)
  20. Rhino 减少结构线的一个方法—重建曲面

热门文章

  1. password unchanged Authentication token manipulation error
  2. uClinux移植与分析(3)
  3. 你是天蝎座(10.24-11.22)的吗?
  4. 自然语言处理----常用函数简析
  5. AutoSAR系列讲解(入门篇)5.2-描述文件
  6. android其实很简单 -- roaster 以代码构建代码
  7. TP90、TP95、TP99性能指标含义及计算
  8. 转载:WVGA,QVGA,VGA,HVGA,WQVGA是什么意思?如何区别?
  9. 作为零基础的新手,如何自学Java和JavaEE开发技术?
  10. c++直角空心三角形_八年级数学三角形专题知识点汇总,掌握了考满分!