啟動時跟蹤

作者:

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”。