加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

Linux ftrace 之 function、function_graph 使用筆記(一)

2023/08/25
4202
閱讀需 8 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

?哈嘍,大家好,我是小G。

前言

ftrace 功能很強(qiáng)大,不僅能跟蹤代碼流程,也能用來分析性能問題。對(duì)于 Linux 和 Android 平臺(tái)的學(xué)習(xí)和開發(fā)人員來說 ,能夠熟練使用 ftrace 的話,是非常強(qiáng)大的生產(chǎn)力,非常尤其要深入和快速學(xué)習(xí)linux內(nèi)核相關(guān)流程,也非常有用。

我也是在努力學(xué)習(xí)中,目前能進(jìn)行一些簡單的性能問題分析,常用的主要還在使用 ftrace 熟悉和學(xué)習(xí) linux 內(nèi)核函數(shù)和相關(guān)流程,更好的理解工作中涉及到的內(nèi)核層面知識(shí)。所以用的 最多的是ftrace 的 function、function_graph ?這兩個(gè)跟蹤器。

在學(xué)習(xí)使用? function、function_graph 之前,需要先了解一些,ftrace 相關(guān)的一些數(shù)據(jù)和節(jié)點(diǎn)文件知識(shí)。

正文

最新的linux 內(nèi)核,ftrace 所有相關(guān)數(shù)據(jù)和文件節(jié)點(diǎn)都位于?/sys/kernel/tracing 目錄下。

ftrace部分?jǐn)?shù)據(jù)和文件節(jié)點(diǎn)說明:

文件..................... 用途.........................
README README文件提供了一個(gè)簡短的使用說明,展示了ftrace的操作命令序列??梢酝ㄟ^cat命令查看該文件以了解概要的操作流程。
current_tracer current_tracer用于設(shè)置或顯示當(dāng)前使用的跟蹤器;使用echo將跟蹤器名字寫入該文件可以切換到不同的跟蹤器。系統(tǒng)啟動(dòng)后,其缺省值為nop,即不做任何跟蹤操作。在執(zhí)行完一段跟蹤任務(wù)后,可以通過向該文件寫入nop來重置跟蹤器。
available_tracers available_tracers記錄了當(dāng)前編譯進(jìn)內(nèi)核的跟蹤器的列表,可以通過cat查看其內(nèi)容。寫current_tracer文件時(shí)用到的跟蹤器名字必須在該文件列出的跟蹤器名字列表中。
trace trace文件提供了查看獲取到的跟蹤信息的接口。可以通過cat等命令查看該文件以查看跟蹤到的內(nèi)核活動(dòng)記錄,也可以將其內(nèi)容保存為記錄文件以備后續(xù)查看。
...... ...
set_graph_function set_graph_function設(shè)置要清晰顯示調(diào)用關(guān)系的函數(shù),顯示的信息結(jié)構(gòu)類似于C語言代碼,這樣在分析內(nèi)核運(yùn)作流程時(shí)會(huì)更加直觀一些。在使用function_graph跟蹤器時(shí)使用;缺省為對(duì)所有函數(shù)都生成調(diào)用關(guān)系序列,可以通過寫該文件來指定需要特別關(guān)注的函數(shù)。
buffer_size_kb buffer_size_kb用于設(shè)置單個(gè)CPU所使用的跟蹤緩存的大小。跟蹤器會(huì)將跟蹤到的信息寫入緩存,每個(gè)CPU的跟蹤緩存是一樣大的。跟蹤緩存實(shí)現(xiàn)為環(huán)形緩沖區(qū)的形式,如果跟蹤到的信息太多,則舊的信息會(huì)被新的跟蹤信息覆蓋掉。

說明:

要更改該文件的值需要先將“current_tracer”設(shè)置為“nop”才可以。

tracing_on tracing_on用于控制跟蹤的暫停。有時(shí)候在觀察到某些事件時(shí)想暫時(shí)關(guān)閉跟蹤,可以將0寫入該文件以停止跟蹤,這樣跟蹤緩沖區(qū)中比較新的部分是與所關(guān)注的事件相關(guān)的;寫入1可以繼續(xù)跟蹤。
available_filter_functions available_filter_functions記錄了當(dāng)前可以跟蹤的內(nèi)核函數(shù)。對(duì)于不在該文件中列出的函數(shù),無法跟蹤其活動(dòng)。
set_ftrace_filter、

set_ftrace_notrace

set_ftrace_filter和?set_ftrace_notrace在編譯內(nèi)核時(shí)配置了動(dòng)態(tài)ftrace(選中 CONFIG_DYNAMIC_FTRACE 選項(xiàng))后使用。前者用于顯示指定要跟蹤的函數(shù),后者則作用相反,用于指定不跟蹤的函數(shù)。如果一個(gè)函數(shù)名同時(shí)出現(xiàn)在這兩個(gè)文件中,則這個(gè)函數(shù)的執(zhí)行狀況不會(huì)被跟蹤。這些文件還支持簡單形式的含有通配符的表達(dá)式,這樣可以用一個(gè)表達(dá)式一次指定多個(gè)目標(biāo)函數(shù)。缺省為可以跟蹤所有內(nèi)核函數(shù),文件set_ftrace_notrace的值則為空。

說明:

要寫入這兩個(gè)文件的函數(shù)名必須可以在文件available_filter_functions中看到。

ftrace部分跟蹤器說明:

ftrace包含多個(gè)跟蹤器,用于跟蹤不同類型的信息,例如進(jìn)程調(diào)度、中斷關(guān)閉等??梢酝ㄟ^ available_tracers 獲取內(nèi)核當(dāng)前支持的跟蹤器列表。常見的跟蹤器有:

跟蹤器.............. 說明.......................
nop nop跟蹤器不會(huì)跟蹤任何內(nèi)核活動(dòng),將nop寫入current_tracer文件可以刪除之前所使用的跟蹤器,并清空之前收集到的跟蹤信息,即刷新trace文件。
function function跟蹤器可以跟蹤內(nèi)核函數(shù)的執(zhí)行情況,可以通過文件set_ftrace_filter顯示指定要跟蹤的函數(shù)。
function_graph function_graph跟蹤器可以顯示類似C源碼的函數(shù)調(diào)用關(guān)系圖,這樣查看起來比較直觀一些,可以通過文件 set_graph_function顯示指定要生成調(diào)用流程圖的函數(shù)。
sched_switch sched_switch跟蹤器可以對(duì)內(nèi)核中的進(jìn)程調(diào)度活動(dòng)進(jìn)行跟蹤。
irqsoff、

preemptoff

irqsoff跟蹤器和?preemptoff跟蹤器分別跟蹤關(guān)閉中斷的代碼和禁止進(jìn)程搶占的代碼,并記錄關(guān)閉的最大時(shí)長,preemptirqsoff跟蹤器則可以看做它們的組合。

ftrace還支持其它一些跟蹤器,了解更多可查看詳細(xì)內(nèi)核文檔和源碼?!癉ocumentation/trace”目錄下的文檔以及“kernel/trace”下的源文件。

下一篇,將會(huì)看下具體如何使用 function 和 function_graph 。

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
CY62146EV30LL-45ZSXIT 1 Cypress Semiconductor Standard SRAM, 256KX16, 45ns, CMOS, PDSO44, LEAD FREE, TSOP2-44
$6.47 查看
HFBR-2416TZ 1 Foxconn Receiver, ST Connector, Through Hole Mount, ROHS COMPLIANT, PLASTIC, 8 PIN
$20.95 查看
S25FL512SAGBHIA13 1 Spansion Flash, 128MX4, PBGA24, FBGA-24
$59.58 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

記錄和分享C/C++、Linux、ARM、Android、IoT相關(guān)知識(shí)。技術(shù)相伴于生活和成長,愿你我永為少年,心中有火,眼中有光,始保熱情。