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