首页 > 其他分享 >tracer ftrace笔记(12)—— trace文档翻译与实验——README

tracer ftrace笔记(12)—— trace文档翻译与实验——README

时间:2023-01-16 13:12:21浏览次数:47  
标签:触发器 12 trace ftrace hist trigger 事件 events

基于 Linux-5.10.110

一、翻译

/sys/kernel/tracing # cat README

tracing mini-HOWTO:

# echo 0 > tracing_on //禁用trace的快速方法
# echo 1 > tracing_on //重新启用trace的快速方法


1. 重要文件:

(1) trace - 缓冲区的静态内容。 要清除缓冲区,请:echo > trace

(2) trace_pipe - 耗时读取查看缓冲区内容。

(3) current_tracer - function和延迟跟踪器。

(4) available_tracers - 为 current_tracer 配置的跟踪器列表

(5) error_log - 失败命令的错误日志(得是支持它的)

(6) buffer_size_kb - 查看和修改每个 cpu 缓冲区的大小

(7) buffer_total_size_kb - 查看所有 cpu 缓冲区的总大小

(8) trace_clock - 更改时钟用于排序事件。

local:Per CPU 的时钟,但可能不会跨 CPU 同步。
global:跨 CPU 同步,但会使跟踪速度减慢。
counter:不是时钟,只是一个单调增的变量。
uptime:从启动时间开始的 Jiffy 计数器
perf:与 perf events 使用的时钟相同

(9) timestamp_mode - 查看用于时间戳事件的模式

delta:与缓冲区范围时间戳的增量
absolute:绝对(独立)时间戳

(10) trace_marker - 写入此文件就是写入内核缓冲区。

(11) trace_marker_raw - 写入此文件就是将二进制数据写入内核缓冲区。

(12) tracing_cpumask - 限制要跟踪的 CPU。 

(13) instances - 使用命令 mkdir instances/foo 创建子缓冲区,使用 rmdir 删除子缓冲区。

(14) trace_options - 设置格式或修改跟踪发生的方式,通过在选项名称前加上“no”来禁用选项

(15) saved_cmdlines_size - echo这个文件来设置存储 comm-pid 列表的个数。

(16) dynamic_events - 创建/附加/删除/显示通用动态事件,向此文件写入以定义/取消定义新的跟踪事件。【TODO: 怎么用?】

(17) kprobe_events - 创建/附加/删除/显示内核动态事件,向此文件写入以定义/取消定义新的跟踪事件。

(18) uprobe_events - 创建/附加/删除/显示用户空间动态事件,向此文件写入以定义/取消定义新的跟踪事件。

              accepts:事件定义(每行一个定义)
               Format:p[:[<group>/]<event>] <place> [<args>]
                       r[maxactive][:[<group>/]<event>] <place> [<args>]
                       s:[synthetic/]<event> <field> [<field>]
                       -:[<group>/]<event>
                place:[<module>:]<symbol>[+<offset>]|<memaddr>
    place (kretprobe): [<module>:]<symbol>[+<offset>]%return|<memaddr>
       place (uprobe): <path>:<offset>[%return][(ref_ctr_offset)]
                 args: <name>=fetcharg[:type]
             fetcharg: %<register>, @<address>, @<symbol>[+|-<offset>],
                       $stack<index>, $stack, $retval, $comm, $arg<N>,
                       +|-[u]<offset>(<fetcharg>), \imm-value, \"imm-string"
                 type: s8/16/32/64, u8/16/32/64, x8/16/32/64, string, symbol,
                       b<bit-width>@<bit-offset>/<container-size>, ustring,
                       <type>\[<array-size>\]
                field: <stype> <name>;
                stype: u8/u16/u32/u64, s8/s16/s32/s64, pid_t,
                       [unsigned] char/int/long

(19) events/ - 包含所有trace event子系统的目录,其下的 enable 文件写入 0/1 以启用/禁用所有事件的跟踪。

(20) events/<system>/ - 包含 <system> 的所有跟踪事件的目录,其下的 enable 文件写入 0/1 以启用/禁用所有 <system> 的事件的跟踪;其下的 filter 文件如果设置,则仅跟踪通过过滤器的事件。

(21) events/<system>/<event>/ - 包含 <event> 控制文件的目录:

      enable  - 写入 0/1 以启用/禁用对此 <event> 的跟踪。
       filter  - 如果设置,则仅跟踪通过过滤器的事件。
       trigger - 如果设置,当事件被触发时执行的命令。
            Format: <trigger>[:count][if <filter>]
           trigger: traceon, traceoff
                    enable_event:<system>:<event>
                    disable_event:<system>:<event>
                    enable_hist:<system>:<event>
                    disable_hist:<system>:<event>
                    stacktrace
                    hist (see below) 注: cat trigger 文件可以看到这些配置项,是所有event共性的配置。

例子:

echo traceoff > events/block/block_unplug/trigger //成功
echo traceoff:3 > events/block/block_unplug/trigger //重复设置失败,TODO: 3是什么意思?
echo 'enable_event:kmem:kmalloc:3 if nr_rq > 1' > events/block/block_unplug/trigger //重复设置成功 【TODO: nr_rq是?】

上例中的第一个例子会在每次 block_unplug 事件触发时禁用跟踪。
上例中的第二个例子会在 block_unplug 事件触发的前3次禁用跟踪。
上例中的第三个例子会在 block_unplug 事件触发的前3次且 nr_rq 事件field大于1时使能 kmalloc event。

与函数触发器一样,计数器仅在启用或禁用跟踪时递减。
要删除没有计数的触发器执行:echo '!<trigger> > <system>/<event>/trigger
要删除带有计数的触发器执行:echo '!<trigger>:0 > <system>/<event>/trigger #########注意0

删除触发器时可以忽略过滤器。

hist trigger -  如果设置,事件命中将聚合到哈希表中
    Format: hist:keys=<field1[,field2,...]>
            [:values=<field1[,field2,...]>]
            [:sort=<field1[,field2,...]>]
            [:size=#entries]
            [:pause][:continue][:clear]
            [:name=histname1]
            [:<handler>.<action>]
            [if <filter>]

注意,也可以使用特殊字段:

common_timestamp - 记录当前时间戳。
common_cpu - 记录事件发生的 CPU

当命中匹配事件时,使用指定的键和值将条目添加到哈希表,并且称为“hitcount”的总和的值增加。
键和值对应于事件格式描述中的字段。 键可以是任何字段,或特殊字符串“stacktrace”。 由最多两
个字段组成的复合键可以由 'keys' 关键字指定。 值必须对应于数字字段。 可以使用“sort”关键字
指定最多包含两个字段的排序键。 可以通过将“.descending”或“.ascending”附加到排序字段来修改
排序方向。 'size' 参数可用于指定多于或少于哈希表大小的默认 2048 个条目。 如果使用“name”参
数为历史触发器命名,则其直方图数据将与其他同名触发器共享,触发器命中将更新此公共数据。

读取事件的“hist”文件会将哈希表完整地转储到标准输出。 如果有多个 hist 触发器附加到一个事件,则
输出中的每个触发器都会有一个表。 为命名触发器显示的表将与具有相同名称的任何其他实例相同。 用于
显示给定字段的默认格式可以通过将以下任何修饰符附加到字段名称来修改(如果适用):

.hex 将数字显示为十六进制值
.sym 将地址显示为符号
.sym-offset 将地址显示为符号和偏移量
.execname 显示一个 common_pid 作为程序名
.syscall 将系统调用 ID 显示为系统调用名称
.log2 显示 log2 值而不是原始数
.usecs 以微秒为单位显示 common_timestamp

“pause”参数可用于暂停现有的历史记录触发器或启动历史记录触发器但不记录任何事件,直到被告知这样做。
'continue' 可用于启动或重新启动暂停的历史触发器。

'clear' 参数将清除正在运行的历史触发器的内容,并保持其当前 paused/active 状态不变。

enable_hist 和 disable_hist 触发器可用于让一个事件有条件地启动和停止另一个事件附加的 hist 触发器。
语法类似于 enable_event 和 disable_event 触发器。

每当添加或更新直方图条目时,都会执行 Hist 触发器处理程序和操作。 它们采用以下形式:

<handler>.<action>

可用的处理程序是:

onmatch(matching.event) - 添加或更新时调用
onmax(var)              - 如果 var 超过当前最大值则调用
onchange(var)           - 如果 var 改变则调用

可用的操作是:

trace(<synthetic_event>, param list) - 生成合成事件
save(field,...)                      - 保存当前事件字段

(22) events/synthetic_events - 创建/附加/删除/显示 合成事件 //实际看是在 kernel/tracing 目录下,而不在 events 目录下。写入此文件以 define/undefine 新的合成事件。
示例:

echo 'myevent u64 lat;  char name[]' >> synthetic_events //【作用?】

 

二、实验

1. events 的 trigger 文件

/sys/kernel/tracing/events/sched/sched_blocked_reason # cat trigger
# Available triggers:
# traceon traceoff stacktrace enable_event disable_event enable_hist disable_hist hist
/sys/kernel/tracing/events/sched/sched_blocked_reason # echo stacktrace > trigger //设置trigger
/sys/kernel/tracing/events/sched/sched_blocked_reason # cat trigger
stacktrace:unlimited

正常抓trace:

EvtQ_codecPipe 625-625     (   1473) [003] d.s5 44222.924205: sched_blocked_reason: pid=13 iowait=0 caller=rcu_gp_fqs_loop+0x154/0xac4
           <...>-625     (   1473) [003] d.s5 44222.924209: <stack trace>
 => try_to_wake_up
 => process_timeout
 => call_timer_fn
 => expire_timers
 => __run_timers
 => run_timer_softirq
 => efi_header_end
 => __irq_exit_rcu
 => __handle_domain_irq
 => gic_handle_irq.30286
 => el1_irq
 => __wake_up_sync_key
 => binder_proc_transaction
 => binder_transaction
 => binder_thread_write
 => binder_ioctl_write_read
 => binder_ioctl
 => __arm64_sys_ioctl
 => el0_svc_common
 => el0_svc
 => el0_sync_handler
 => el0_sync

取消 trigger 设置:

/sys/kernel/tracing/events/sched/sched_blocked_reason # echo !stacktrace > trigger //取消trigger设置
/sys/kernel/tracing/events/sched/sched_blocked_reason # cat trigger
# Available triggers:
# traceon traceoff stacktrace enable_event disable_event enable_hist disable_hist hist

 

标签:触发器,12,trace,ftrace,hist,trigger,事件,events
From: https://www.cnblogs.com/hellokitty2/p/17055175.html

相关文章

  • 12.函数式语言特性:迭代器与闭包
    一、闭包:能够捕获环境的匿名函数Rust中的闭包是一种可以存入变量或作为参数传递给其他函数的匿名函数。你在可以在一个地方创建闭包,然后在不同的上下文环境中调用该闭包来......
  • frida trace
    /**raptor_frida_android_trace.js-CodetracerforAndroid*Copyright(c)2017MarcoIvaldi<[email protected]>**Frida.reJSscripttotracearb......
  • docker 创建seafile 1bec7de0740f4117904bf3be5122ecaf
    docker创建seafile部署Portainerdockerpullportainer/portainerdockerrun-p9000:9000-p8000:8000--nameportainer\--restart=always\-v/var/run/docker.......
  • centos8 编译安装 Realtek 8125 2.5G网卡驱动
    1.通过命令lspci查看网卡型号:#lspciEthernetcontroller:IntelCorporationEthernetConnection(7)I219-V(rev10)Ethernetcontroller:RealtekSemiconductorC......
  • 12.PyQt5【基本组件】多行输入框-QTextEdit
    一、前言QTextEdit文本输入框可以输入多行文本。二、学习目标1.QTextEdit常用方法2.QTextEdit常用信号3.QTextEdit组件的应用三、知识点1.【QTextEdit常用方法】......
  • (12)go-micro微服务JWT跨域认证
    目录一JWT介绍二JWT优缺点三JWT使用1.导包和数据定义2.生成JWT3.解析JWT4.完整代码四最后一JWT介绍JWT英文名是JsonWebToken,是一种用于通信双方之间传递安全......
  • 20211217|写给一年后的培民的一封信
    亲爱的民:培民,见面如晤,没错这是一封来自一年前的信。自四月份考试结束,我就游荡于广州和深圳,记4.14下午自广州到深圳,第一站即是找立彬,我自知今年插本已是与我无缘,随即开始......
  • 20211217|写给一年后的立彬的一封信
    亲爱的彬:立彬,见面如晤,没错这是一封来自一年前的信。自四月份考试结束,我就游荡于广州和深圳,记4.14下午自广州到深圳,第一站即是找你,顶楼你留了门卡,大门你远程开,晚上下班我......
  • 代码随想录18 LettCode 513. 找树左下角的值 112. 路径总和 106. 从中序与后序遍历序
    513.找树左下角的值下面运用层序遍历法比较简单,当遍历到一层时设立一个值去不断覆盖一层的队头,即最左边元素classSolution{public:intfindBottomLeftValue(Tr......
  • java基础12 文本注释javadoc
    文本注释javadoc文本注释,javadoc:/**接回车可以生成一些注释的文档,直接看代码吧用window命令窗口执行:javadocjava文件,中间可以加一大堆的参数使得中文不乱码​......