ftrace使用介紹


Ftrace提供了linux下對內核事情的追蹤能力,可以理解為內核太的strace。

Ftrace使能

ftrace的位置一般位於/sys/kernel/debug/tracing/或者/sys/kernel/tracing.

Ftrace依賴內核開關使能:

  • CONFIG_FUNCTION_TRACER
  • CONFIG_FUNCTION_GRAPH_TRACER
  • CONFIG_STACK_TRACER
  • CONFIG_DYNAMIC_FTRACE

 ftrace是依賴於debugfs,也就是說它的使用與tracing/下各個文件關聯。

current_tracer:配置和顯示當前使能tracer。可用tracer見available_tracers;
available_tracers:顯示系統支持的tracer。
tracing_on:使能寫trace日志到ring buffer的開關,同時也可cat查看是否使能。echo 0表示關閉,echo 1表示打開。注意這里是總開關的概念,如果current_tracer或event都未使能(配置為空和關閉event開關),那么就算這里寫1使能,trace文件也是空的;如果配置了current_tracer和event,這個接口相當於總開關。
trace:保存trace記錄,cat trace查看跟蹤記錄。注意這里是臨時存放buffer,有空間大小限制,如果超了會被覆蓋。
buffer_size_kb:用於設置和顯示單個CPU所使用的跟蹤緩存的大小。跟蹤緩存為RingBuffer形式,如果跟蹤太多,舊的信息會被新的跟蹤信息覆蓋掉。默認size通常是一個頁(4K)。每個cpu的buffer size配置在per_cpu/cpu0/buffer_size_kb,percpu配置后,此文件顯示"X"。
buffer_total_size_kb:顯示所有的跟蹤緩存大小,不同之處在於buffer_size_kb是單個CPU的,buffer_total_size_kb是所有CPU的和。
trace_pipe:輸出和trace一樣的內容,輸出實時tracing日志,這樣就避免了RingBuffer的溢出。cat trace_pipe > trace.txt &保存文件,但是cat時候會帶來一些性能損耗。
trace_options:控制Trace打印內容格式或者設置跟蹤器,可以通過trace_options添加很多附加信息。
options:目錄文件,里面是每個trace options的文件,和trace_options對應,可以通過echo 0/1使能options。
tracing_max_latency:記錄某些Tracer的最大延時。比如interrupts的最大延時關閉后,會記錄在這里。可以echo值到此文件,然后遇到比設置值更大的延遲才會更新。
tracing_thresh:延時記錄Trace的閾值,當延時超過此值時才開始記錄Trace。單位是ms,只有非0才起作用
free_buffer:此文件用於在一個進程被關閉后,同時釋放RingBuffer內存,並將調整大小到最小值。
tracing_cpumask:可以通過此文件設置跟蹤指定CPU,二進制格式。
set_ftrace_filter:指定要跟蹤的函數,可跟蹤函數見available_filter_functions
set_ftrace_notrace:指定不跟蹤的函數,缺省為空。
set_ftrace_pid:tracer將只追蹤寫入此文件PID的對應的進程。"function-fork" option設置后,pid對應進程創建的子進程也會自動跟蹤。
set_event_pid:tracer將只追蹤寫入此文件PID的對應進程的event。"event-fork" option設置后,pid對應進程創建的子進程event也會自動跟蹤。
set_graph_function:function_graph tracer將只跟蹤此文件配置的函數,缺省對所有函數都追蹤。
set_graph_notrace:function_graph tracer不跟蹤特定的函數嵌套調用。
available_filter_functions:顯示可以跟蹤的functions。
dyn_ftrace_total_info:debug使用,顯示available_filter_functins中跟中函數的數目,兩者一致
enabled_functions:顯示回調函數。
function_profile_enabled:使能trace_stat/function<cpu> 的統計信息功能,統計包括function/hit/Time/Avg等信息。
trace_stat:存放不同tracing狀態的目錄
kprobe_events:Enable dynamic trace points. See kprobetrace.txt.
kprobe_profile:Dynamic trace points stats. See kprobetrace.txt.
max_graph_depth:function graph tracer使用,配置函數嵌套的最大深度。
printk_formats:提供給工具讀取原始格式trace的文件。
saved_cmdlines:ftrace會存放pid的comms在一個pid mappings,在顯示event時候同時顯示comm,這里可以配置pid對應的comm,如果配置,顯示類似<idle>-0,否則<...>-0。
saved_cmdlines_size:saved_cmdlines的數目
saved_tgids:If the option "record-tgid" is set, on each scheduling context switch the Task Group ID of a task is saved in a table mapping the PID of the thread to its TGID. By default, the "record-tgid" option is disabled.
snapshot:是對trace的snapshot。
                              echo 0清空緩存,並釋放對應內存。
                              echo 1進行對當前trace進行snapshot,如沒有內存則分配。
                              echo 2清空緩存,不釋放也不分配內存。
stack_max_size:當使用stack跟蹤器時,記錄產生過的最大stack size
stack_trace:顯示stack的back trace
stack_trace_filter:設置stack tracer不檢查的函數名稱

trace_clock:配置trace日志中"timestamp"列的時鍾,默認使用local時鍾。
	local:默認時鍾,在每CPU中快速且精准,但是可能不會在各個CPU之間同步;
	global:各CPU間同步,但是比local慢;
	counter:並不是時鍾,而是一個原子計數器。數值一直+1,但是所有cpu是同步的。主要用處是分析不同cpu發生的events;
	uptime:time stamp和jiffies counter根據boot time;
	perf:clock跟perf使用一致。
	x86-tsc:非系統自己時鍾。比如x86有TSC cycle clock;
	ppc-tb:使用powerpc的基礎時鍾寄存器值;
	mono:使用fast monotonic clock (CLOCK_MONOTONIC)
	mono_raw:使用raw monotonic clock (CLOCK_MONOTONIC_RAW)
	boot:使用boot clock (CLOCK_BOOTTIME)。

trace_marker:從用戶態寫trace mark到ftrace中,可以做一個標記到trace。
trace_marker_raw:以二進制格式寫入到trace中。
uprobe_events:Add dynamic tracepoints in programs.See uprobetracer.rst
uprobe_profile:Uprobe statistics. See uprobetrace.txt
instances:創建不同的trace buffer實例,可以在不同的trace buffers中分開記錄。
events:系統Trace events目錄,在每個events下面都有enable、filter和fotmat。enable是開關;format是events的格式,然后根據格式設置 filter。
set_event:將Trace events名稱直接寫入set_event就可以打開。
available_events:列出系統中所有可用的Trace events,分兩個層級,用冒號隔開。
per_cpu:
per_cpu/cpu0/buffer_size_kb:配置per_cpu的buffer空間
per_cpu/cpu0/trace:當前CPU的trace文件。
per_cpu/cpu0/trace_pipe:當前CPU的trace_pipe文件。
per_cpu/cpu0/trace_pipe_raw:當前CPU的trace_pipe_raw
per_cpu/cpu0/snapshot:當前CPU的snapshot
per_cpu/cpu0/snapshot_raw:當前CPU的snapshot_raw
per_cpu/cpu0/stats:當前CPU的trace統計信息
每個文件的詳細使用可以參考kernel Document/trace/ftrace.rst

Ftrace使用范例
adb shell "echo 65536 > /sys/kernel/tracing/buffer_size_kb"
adb shell "echo nop > /sys/kernel/tracing/current_tracer"
adb shell "echo 'sched_switch sched_wakeup sched_wakeip_new block_rq_issue block_rq_complete irq_handler_entry
irq_handler_exit mmc_blk_rw_start mmc_blk_rw_end' > /sys/kernel/tracing/set_event"

adb shell "echo > /sys/kernel/tracing/trac" //清空buffer
adb shell "echo 1 > /sys/kernel/tracing/tracing_on" //enable ftrace
/do test/
adb shell "echo 0 > /sys/kernel/tracing/tracing_on"
adb pull /sys/kenrel/tracing/trace SYS-Ftrace

ftrace參考網站:https://tinylab.org/ftrace-usage/
https://www.zhihu.com/column/c_1136667431828316160


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM