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

基于 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>] //设置一个probe探测点
                       r[maxactive][:[<group>/]<event>] <place> [<args>] //设置一个return probe探测点
                       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

对fetcharg补充:

FETCHARGS : Arguments. Each probe can have up to 128 args. ——指定要获取的参数信息
  %REG : Fetch register REG ——获取指定寄存器值
  @ADDR : Fetch memory at ADDR (ADDR should be in kernel) ——获取指定内存地址的值
  @SYM[+|-offs] : Fetch memory at SYM +|- offs (SYM should be a data symbol) ——获取全局变量的值
  $stackN : Fetch Nth entry of stack (N >= 0) ——获取指定栈空间值,即sp寄存器+N后的位置值
  $stack : Fetch stack address. ——获取sp寄存器值
  $retval : Fetch return value.(*) ——获取返回值,仅用于return probe
  +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**) ——以下可以由于获取指定地址的结构体参数内容,可以设定具体的参数名和偏移地址
    NAME=FETCHARG : Set NAME as the argument name of FETCHARG.
    FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types ——设置参数的类型,可以支持字符串和比特类型
 (u8/u16/u32/u64/s8/s16/s32/s64), "string" and bitfield are supported.

 

(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

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

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

此例中可以看出,当此 trace event 触发时打印栈回溯

 

 

参考:

Linux内核调试技术——kprobe使用与实现:https://blog.csdn.net/luckyapple1028/article/details/52972315

posted on 2023-01-16 13:00  Hello-World3  阅读(665)  评论(0编辑  收藏  举报

导航