启动时跟踪

作者:

Masami Hiramatsu <mhiramat@kernel.org>

概述

启动时跟踪允许用户跟踪启动过程,包括设备初始化,并具有ftrace的完整功能,包括每个事件的过滤器和操作、直方图、kprobe-事件和合成事件,以及跟踪实例。 由于内核命令行不足以控制这些复杂的功能,因此它使用bootconfig文件来描述跟踪功能编程。

Boot Config中的选项

以下是boot config文件中启动时跟踪的可用选项列表[1]。 所有选项都在“ftrace.”或“kernel.”前缀下。 有关以“kernel.”前缀开头的选项,请参阅内核参数[2]

Ftrace全局选项

Ftrace全局选项在boot config中具有“kernel.”前缀,这意味着这些选项作为内核传统命令行的一部分传递。

kernel.tp_printk

也在printk缓冲区上输出trace-event数据。

kernel.dump_on_oops [= MODE]

在Oops时转储ftrace。 如果MODE = 1或省略,则在所有CPU上转储trace缓冲区。 如果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

这将采用NON-跟踪功能过滤器规则数组。

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[...]]

将ACTIONs设置为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=functionkernel.trace_event将在initcall之前开始)。

示例

例如,要为每个事件添加过滤器和操作,定义kprobe事件,并使用直方图定义合成事件,请编写如下的boot config

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_”函数,您可以编写如下的boot config

ftrace.instance {
      foo {
              tracer = "function"
              ftrace.filters = "user_*"
      }
      bar {
              tracer = "function"
              ftrace.filters = "kernel_*"
      }
}

实例节点也接受事件节点,以便每个实例都可以自定义其事件跟踪。

使用触发器操作和kprobes,您可以在调用函数时跟踪函数图。 例如,这将跟踪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"
              }
      }
}

此启动时跟踪还支持通过boot config的ftrace内核参数。 例如,以下内核参数

trace_options=sym-addr trace_event=initcall:* tp_printk trace_buf_size=1M ftrace=function ftrace_filter="vfs*"

这可以写在boot config中,如下所示

kernel {
      trace_options = sym-addr
      trace_event = "initcall:*"
      tp_printk
      trace_buf_size = 1M
      ftrace = function
      ftrace_filter = "vfs*"
}

请注意,参数以“kernel”前缀开头,而不是“ftrace”。