启动时跟踪¶
- 作者:
Masami Hiramatsu <mhiramat@kernel.org>
概述¶
启动时跟踪允许用户使用 ftrace 的全部功能(包括每个事件的过滤器和操作、直方图、kprobe 事件和合成事件以及跟踪实例)来跟踪启动时过程,包括设备初始化。由于内核命令行不足以控制这些复杂的功能,因此它使用启动配置 (bootconfig) 文件来描述跟踪功能编程。
启动配置中的选项¶
以下是启动配置文件中用于启动时跟踪的可用选项列表[1]。所有选项都在“ftrace.”或“kernel.”前缀下。有关以“kernel.”前缀开头的选项,请参阅内核参数[2]。
Ftrace 全局选项¶
Ftrace 全局选项在启动配置中具有“kernel.”前缀,这意味着这些选项作为内核传统命令行的一部分传递。
- kernel.tp_printk
也在 printk 缓冲区上输出跟踪事件数据。
- kernel.dump_on_oops [= MODE]
在 Oops 上转储 ftrace。如果 MODE = 1 或省略,则在所有 CPU 上转储跟踪缓冲区。如果 MODE = 2,则在触发 Oops 的 CPU 上转储缓冲区。
- kernel.traceoff_on_warning
如果发生 WARN_ON(),则停止跟踪。
- kernel.fgraph_max_depth = MAX_DEPTH
将 MAX_DEPTH 设置为 fgraph 跟踪器的最大深度。
- kernel.fgraph_filters = FILTER[, FILTER2...]
添加 fgraph 跟踪函数过滤器。
- kernel.fgraph_notraces = FILTER[, FILTER2...]
添加 fgraph 非跟踪函数过滤器。
Ftrace 每个实例选项¶
这些选项可用于每个实例,包括全局 ftrace 节点。
- ftrace.[instance.INSTANCE.]options = OPT1[, OPT2[...]]
启用给定的 ftrace 选项。
- ftrace.[instance.INSTANCE.]tracing_on = 0|1
在启动启动时跟踪时启用/禁用此实例上的跟踪。(您可以通过“traceon”事件触发操作启用它)
- ftrace.[instance.INSTANCE.]trace_clock = CLOCK
将给定的 CLOCK 设置为 ftrace 的 trace_clock。
- ftrace.[instance.INSTANCE.]buffer_size = SIZE
将 ftrace 缓冲区大小配置为 SIZE。 您可以使用“KB”或“MB”作为该 SIZE。
- ftrace.[instance.INSTANCE.]alloc_snapshot
分配快照缓冲区。
- ftrace.[instance.INSTANCE.]cpumask = CPUMASK
将 CPUMASK 设置为跟踪 cpu-mask。
- ftrace.[instance.INSTANCE.]events = EVENT[, EVENT2[...]]
在启动时启用给定的事件。您可以在 EVENT 中使用通配符。
- ftrace.[instance.INSTANCE.]tracer = TRACER
在启动时将 TRACER 设置为当前跟踪器。(例如 function)
- ftrace.[instance.INSTANCE.]ftrace.filters
这将采用跟踪函数过滤器规则的数组。
- ftrace.[instance.INSTANCE.]ftrace.notraces
这将采用非跟踪函数过滤器规则的数组。
Ftrace 每个事件选项¶
这些选项用于设置每个事件的选项。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.enable
启用 GROUP:EVENT 跟踪。
- ftrace.[instance.INSTANCE.]event.GROUP.enable
启用 GROUP 内的所有事件跟踪。
- ftrace.[instance.INSTANCE.]event.enable
启用所有事件跟踪。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.filter = FILTER
将 FILTER 规则设置为 GROUP:EVENT。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.actions = ACTION[, ACTION2[...]]
将 ACTION 设置为 GROUP:EVENT。
- ftrace.[instance.INSTANCE.]event.kprobes.EVENT.probes = PROBE[, PROBE2[...]]
基于 PROBE 定义新的 kprobe 事件。它可以在一个事件上定义多个探测,但这些探测必须具有相同类型的参数。此选项仅适用于组名称为“kprobes”的事件。
- ftrace.[instance.INSTANCE.]event.synthetic.EVENT.fields = FIELD[, FIELD2[...]]
使用 FIELD 定义新的合成事件。每个字段应为“type varname”。
请注意,kprobe 和合成事件定义可以写在实例节点下,但它们也可以从其他实例看到。 因此,请注意事件名称冲突。
Ftrace 直方图选项¶
由于将直方图操作写为每个事件操作选项的字符串太长,因此在每个事件的“hist”子键下都有树形选项,用于直方图操作。有关每个参数的详细信息,请阅读事件直方图文档 (事件直方图)
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist.[N.]keys = KEY1[, KEY2[...]]
设置直方图键参数。(必需) “N”是多个直方图的数字字符串。如果事件上只有一个直方图,您可以省略它。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist.[N.]values = VAL1[, VAL2[...]]
设置直方图值参数。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist.[N.]sort = SORT1[, SORT2[...]]
设置直方图排序参数选项。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist.[N.]size = NR_ENTRIES
设置直方图大小(条目数)。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist.[N.]name = NAME
设置直方图名称。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist.[N.]var.VARIABLE = EXPR
通过 EXPR 表达式定义新的 VARIABLE。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist.[N.]<pause|continue|clear>
设置直方图控制参数。您可以设置其中一个。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist.[N.]onmatch.[M.]event = GROUP.EVENT
设置直方图“onmatch”处理程序匹配事件参数。 “M”是多个“onmatch”处理程序的数字字符串。如果此直方图上有一个“onmatch”处理程序,您可以省略它。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist.[N.]onmatch.[M.]trace = EVENT[, ARG1[...]]
为“onmatch”设置直方图“trace”操作。EVENT 必须是合成事件名称,ARG1... 是该事件的参数。如果设置了“onmatch.event”选项,则为必需。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist.[N.]onmax.[M.]var = VAR
设置直方图“onmax”处理程序变量参数。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist.[N.]onchange.[M.]var = VAR
设置直方图“onchange”处理程序变量参数。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist.[N.]<onmax|onchange>.[M.]save = ARG1[, ARG2[...]]
为“onmax”或“onchange”处理程序设置直方图“save”操作参数。如果设置了“onmax.var”或“onchange.var”选项,则此选项或以下“snapshot”选项是必需的。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist.[N.]<onmax|onchange>.[M.]snapshot
为“onmax”或“onchange”处理程序设置直方图“snapshot”操作。如果设置了“onmax.var”或“onchange.var”选项,则此选项或以上“save”选项是必需的。
- ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist.filter = FILTER_EXPR
设置直方图过滤器表达式。您不需要在 FILTER_EXPR 中使用“if”。
请注意,如果“actions”选项具有直方图操作,则此“hist”选项可能会与每个事件的“actions”选项冲突。
何时启动¶
所有以 ftrace
开头的启动时跟踪选项将在 core_initcall 结束时启用。这意味着您可以从 postcore_initcall 跟踪事件。 大多数子系统和架构相关的驱动程序将在之后初始化(arch_initcall 或 subsys_initcall)。因此,您可以使用启动时跟踪来跟踪这些。 如果要在 core_initcall 之前跟踪事件,可以使用以 kernel
开头的选项。 其中一些选项将比 initcall 处理更早启用(例如,kernel.ftrace=function
和 kernel.trace_event
将在 initcall 之前启动。)
示例¶
例如,要为每个事件添加过滤器和操作,定义 kprobe 事件和带有直方图的合成事件,请编写如下的启动配置
ftrace.event {
task.task_newtask {
filter = "pid < 128"
enable
}
kprobes.vfs_read {
probes = "vfs_read $arg1 $arg2"
filter = "common_pid < 200"
enable
}
synthetic.initcall_latency {
fields = "unsigned long func", "u64 lat"
hist {
keys = func.sym, lat
values = lat
sort = lat
}
}
initcall.initcall_start.hist {
keys = func
var.ts0 = common_timestamp.usecs
}
initcall.initcall_finish.hist {
keys = func
var.lat = common_timestamp.usecs - $ts0
onmatch {
event = initcall.initcall_start
trace = initcall_latency, func, $lat
}
}
}
此外,启动时跟踪支持“instance”节点,这允许我们同时运行多个用于不同目的的跟踪器。 例如,一个跟踪器用于跟踪以“user_”开头的函数,另一个跟踪器用于跟踪“kernel_”函数,您可以如下编写启动配置
ftrace.instance {
foo {
tracer = "function"
ftrace.filters = "user_*"
}
bar {
tracer = "function"
ftrace.filters = "kernel_*"
}
}
实例节点也接受事件节点,以便每个实例都可以自定义其事件跟踪。
通过触发操作和 kprobe,您可以在调用函数时跟踪函数图。 例如,这将跟踪 pci_proc_init() 中的所有函数调用
ftrace {
tracing_on = 0
tracer = function_graph
event.kprobes {
start_event {
probes = "pci_proc_init"
actions = "traceon"
}
end_event {
probes = "pci_proc_init%return"
actions = "traceoff"
}
}
}
此启动时跟踪还支持通过启动配置的 ftrace 内核参数。 例如,以下内核参数
trace_options=sym-addr trace_event=initcall:* tp_printk trace_buf_size=1M ftrace=function ftrace_filter="vfs*"
可以使用如下方式在启动配置中编写
kernel {
trace_options = sym-addr
trace_event = "initcall:*"
tp_printk
trace_buf_size = 1M
ftrace = function
ftrace_filter = "vfs*"
}
请注意,参数以“kernel”前缀开头,而不是“ftrace”。