0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何通過(guò) tracefs 實(shí)現(xiàn)跟蹤能力

Linux閱碼場(chǎng) ? 來(lái)源:Linux閱碼場(chǎng) ? 作者:Linux閱碼場(chǎng) ? 2022-10-24 09:17 ? 次閱讀

如果你只是需要快速使用工具來(lái)進(jìn)行問(wèn)題排查,包括但不限于函數(shù)調(diào)用棧跟蹤、函數(shù)調(diào)用子函數(shù)流程、函數(shù)返回結(jié)果,那么推薦你直接使用 BCC trace[1] 或 Brendan Gregg[2] 封裝的 perf-tools[3] 工具即可,本文嘗試從手工操作 Ftrace 跟蹤工具的方式展示在底層是如何通過(guò) tracefs 實(shí)現(xiàn)這些能力的。如果你對(duì)某個(gè)跟蹤主題感興趣,建議直接跳轉(zhuǎn)到相關(guān)的主題查看。

快速說(shuō)明:

kprobe 為內(nèi)核中提供的動(dòng)態(tài)跟蹤機(jī)制,/proc/kallsym 中的函數(shù)幾乎都可以用于跟蹤,但是內(nèi)核函數(shù)可能隨著版本演進(jìn)而發(fā)生變化,為非穩(wěn)定的跟蹤機(jī)制,數(shù)量比較多。

uprobe 為用戶空間提供的動(dòng)態(tài)機(jī)制;

tracepoint 是內(nèi)核提供的靜態(tài)跟蹤點(diǎn),為穩(wěn)定的跟蹤點(diǎn),需要研發(fā)人員代碼編寫,數(shù)量有限;

usdt 為用戶空間提供的靜態(tài)跟蹤點(diǎn) 【本次暫不涉及】

Ftrace 是 Linux 官方提供的跟蹤工具,在 Linux 2.6.27 版本中引入。Ftrace 可在不引入任何前端工具的情況下使用,讓其可以適合在任何系統(tǒng)環(huán)境中使用。

Ftrace 可用來(lái)快速排查以下相關(guān)問(wèn)題:

特定內(nèi)核函數(shù)調(diào)用的頻次 (function)

內(nèi)核函數(shù)在被調(diào)用的過(guò)程中流程(調(diào)用棧) (function + stack)

內(nèi)核函數(shù)調(diào)用的子函數(shù)流程(子調(diào)用棧)(function graph)

由于搶占導(dǎo)致的高延時(shí)路徑等

Ftrace 跟蹤工具由性能分析器(profiler)和跟蹤器(tracer)兩部分組成:

性能分析器,用來(lái)提供統(tǒng)計(jì)和直方圖數(shù)據(jù)(需要 CONFIG_ FUNCTION_PROFILER=y)

函數(shù)性能分析

直方圖

跟蹤器,提供跟蹤事件的詳情:

函數(shù)跟蹤(function)

跟蹤點(diǎn)(tracepoint)

kprobe

uprobe

函數(shù)調(diào)用關(guān)系(function_graph)

hwlat 等

除了操作原始的文件接口外,也有一些基于 Ftrace 的前端工具,比如 perf-tools 和 trace-cmd (界面 KernelShark)等。整體跟蹤及前端工具架構(gòu)圖如下:

7a26b8a6-5331-11ed-a3b6-dac502259ad0.png

圖片來(lái)自于 《Systems Performance Enterprise and the Cloud 2nd Edition》 14.1 P706

Ftrace 的使用的接口為 tracefs 文件系統(tǒng),需要保證該文件系統(tǒng)進(jìn)行加載:

$sysctl-qkernel.ftrace_enabled=1
$mount-ttracefstracefs/sys/kernel/tracing

$mount-tdebugfs,tracefs
tracefson/sys/kernel/tracingtypetracefs(rw,nosuid,nodev,noexec,relatime)
debugfson/sys/kernel/debugtypedebugfs(rw,nosuid,nodev,noexec,relatime)
tracefson/sys/kernel/debug/tracingtypetracefs(rw,nosuid,nodev,noexec,relatime)

$ls-F/sys/kernel/debug/tracing#完整目錄如下圖

7a3b54d2-5331-11ed-a3b6-dac502259ad0.png

tracing 目錄下核心文件介紹如下表格,當(dāng)前可僅關(guān)注黑體加粗的項(xiàng),其他項(xiàng)可在需要的時(shí)候再進(jìn)行回顧:

文件 描述
available_tracers 可用跟蹤器,hwlat blk function_graph wakeup_dl wakeup_rt wakeup function nop,nop 表示不使用跟蹤器
current_tracer 當(dāng)前使用的跟蹤器
function_profile_enabled 啟用函數(shù)性能分析器
available_filter_functions 可跟蹤的完整函數(shù)列表
set_ftrace_filter 選擇跟蹤函數(shù)的列表,支持批量設(shè)置,例如 *tcp、tcp* 和 *tcp* 等
set_ftrace_notrace 設(shè)置不跟蹤的函數(shù)列表
set_event_pid 設(shè)置跟蹤的 PID,表示僅跟蹤 PID 程序的函數(shù)或者其他跟蹤
tracing_on 是否啟用跟蹤,1 啟用跟蹤 0 關(guān)閉跟蹤
trace_options 設(shè)置跟蹤的選項(xiàng)
trace_stat(目錄) 函數(shù)性能分析的輸出目錄
kprobe_events 啟用 kprobe 的配置
uprobe_events 啟用 uprobe 的配置
events ( 目錄 ) 事件(Event)跟蹤器的控制文件:tracepoint、kprobe、uprobe
trace 跟蹤的輸出 (Ring Buffer)
trace_pipe 跟蹤的輸出;提供持續(xù)不斷的數(shù)據(jù)流,適用于程序進(jìn)行讀取

perf_tools 包含了一個(gè)復(fù)位所有 ftrace 選型的工具腳本,在跟蹤不符合預(yù)期的情況下,建議先使用 reset-ftrace[4] 進(jìn)行復(fù)位,然后再進(jìn)行測(cè)試。

1. 內(nèi)核函數(shù)調(diào)用跟蹤

基于 Ftrace 的內(nèi)核函數(shù)調(diào)用跟蹤整體架構(gòu)如下所示:

7a552dbc-5331-11ed-a3b6-dac502259ad0.png

圖片來(lái)自于 《Systems Performance Enterprise and the Cloud 2nd Edition》 14.4 P713

這里我們嘗試對(duì)于內(nèi)核中的系統(tǒng)調(diào)用函數(shù) __arm64_sys_openat 進(jìn)行跟蹤(前面兩個(gè)下劃線),需要注意的是 __arm64_sys_openat 是在 arm64 結(jié)構(gòu)體系下 sys_openat 系統(tǒng)調(diào)用的包裝,如果在 x86_64 架構(gòu)下則為 __x64_sys_openat() ,由于我們本地的電腦是 M1 芯片,所以演示的樣例以 arm64 為主。

在不同的體系結(jié)構(gòu)下,可以在 /proc/kallsym 文件中搜索確認(rèn)。

后續(xù)的目錄,如無(wú)特殊說(shuō)明,都默認(rèn)位于 /sys/kernel/debug/tracing/ 根目錄。

#使用function跟蹤器,并將其設(shè)置到current_tracer
$sudoechofunction>current_tracer

#將跟蹤函數(shù)__arm64_sys_openat設(shè)置到set_ftrace_filter文件中
$sudoecho__arm64_sys_openat>set_ftrace_filter

#開啟全局的跟蹤使能
$sudoecho1>tracing_on

#運(yùn)行l(wèi)s命令觸發(fā)sys_openat系統(tǒng)調(diào)用,新的內(nèi)核版本中直接調(diào)用sys_openat
$ls-hl

#關(guān)閉
$sudoecho0>tracing_on
$sudoechonop>current_tracer

#需要主要這里的echo后面有一個(gè)空格,即“echo+空格>"
$sudoecho>set_ftrace_filter

#通過(guò)cattrace文件進(jìn)行查看
$sudocattrace
#tracer:function
#
#entries-in-buffer/entries-written:224/224#P:4
#
#_-----=>irqs-off
#/_----=>need-resched
#|/_---=>hardirq/softirq
#||/_--=>preempt-depth
#|||/delay
#TASK-PIDCPU#||||TIMESTAMPFUNCTION
#|||||||||
sudo-15099[002]....29469.444400:__arm64_sys_openat<-invoke_syscall
????????????sudo-15099???[002]?....?29469.444594:?__arm64_sys_openat?<-invoke_syscall

我們可以看到上述的結(jié)果表明了函數(shù)調(diào)用的任務(wù)名稱、PID、CPU、標(biāo)記位、時(shí)間戳及函數(shù)名字。

在 perf_tools[5] 工具集中的前端封裝工具為 functrace[6] ,需要注意的是該工具默認(rèn)不會(huì)設(shè)置 tracing_on 為 1, 需要在啟動(dòng)前進(jìn)行設(shè)置,即 ”echo 1 > tracing_on“。

perf_tools[7] 工具集中 kprobe[8] 也可以實(shí)現(xiàn)類似的效果,底層基于 kprobe 機(jī)制實(shí)現(xiàn),ftrace 機(jī)制中的 kprobe 在后續(xù)章節(jié)會(huì)詳細(xì)介紹。

2. 函數(shù)被調(diào)用流程(棧)

在第 1 部分我們獲得了內(nèi)核函數(shù)的調(diào)用,但是有些場(chǎng)景我們更可能希望獲取調(diào)用該內(nèi)核函數(shù)的流程(即該函數(shù)是在何處被調(diào)用),這需要通過(guò)設(shè)置 options/func_stack_trace 選項(xiàng)實(shí)現(xiàn)。

$sudoechofunction>current_tracer
$sudoecho__arm64_sys_openat>set_ftrace_filter
$sudoecho1>options/func_stack_trace#設(shè)置調(diào)用棧選項(xiàng)
$sudoecho1>tracing_on

$ls-hl

$sudoecho0>tracing_on

$sudocattrace
#tracer:function
#
#entries-in-buffer/entries-written:292/448#P:4
#
#_-----=>irqs-off
#/_----=>need-resched
#|/_---=>hardirq/softirq
#||/_--=>preempt-depth
#|||/delay
#TASK-PIDCPU#||||TIMESTAMPFUNCTION
#|||||||||
sudo-15134[000]....29626.670430:__arm64_sys_openat<-invoke_syscall
????????????sudo-15134???[000]?....?29626.670431:?
=>__arm64_sys_openat
=>invoke_syscall
=>el0_svc_common.constprop.0
=>do_el0_svc
=>el0_svc
=>el0_sync_handler
=>el0_sync

#關(guān)閉
$sudoechonop>current_tracer
$sudoecho>set_ftrace_filter
$sudoecho0>options/func_stack_trace

通過(guò)上述跟蹤記錄,我們可以發(fā)現(xiàn)記錄同時(shí)展示了函數(shù)調(diào)用的記錄和被調(diào)用的函數(shù)流程,__arm64_sys_openat 的被調(diào)用棧如下:

=>__arm64_sys_openat
=>invoke_syscall
=>el0_svc_common.constprop.0
=>do_el0_svc
=>el0_svc
=>el0_sync_handler
=>el0_sync

perf_tools[9] 工具集中 kprobe[10] 通過(guò)添加 ”-s“ 參數(shù)實(shí)現(xiàn)同樣的功能,運(yùn)行的命令如下:

$./kprobe-s'p:__arm64_sys_openat'

3. 函數(shù)調(diào)用子流程跟蹤(棧)

如果想要分析內(nèi)核函數(shù)調(diào)用的子流程(即本函數(shù)調(diào)用了哪些子函數(shù),處理的流程如何),這時(shí)需要用到 function_graph 跟蹤器,從字面意思就可看出這是函數(shù)調(diào)用關(guān)系跟蹤。

基于 __arm64_sys_openat 子流程調(diào)用關(guān)系的跟蹤的完整設(shè)置過(guò)程如下:

#將當(dāng)前current_tracer設(shè)置為function_graph
$sudoechofunction_graph>current_tracer
$sudoecho__arm64_sys_openat>set_graph_function

#設(shè)置跟蹤子函數(shù)的最大層級(jí)數(shù)
$sudoecho3>max_graph_depth#設(shè)置最大層級(jí)
$sudoecho1>tracing_on

$ls-hl

$sudoecho0>tracing_on
#$echonop>set_graph_function
$sudocattrace
#tracer:function_graph
#
#CPUDURATIONFUNCTIONCALLS
#|||||||
1)|__arm64_sys_openat(){
1)|do_sys_openat2(){
1)0.875us|getname();
1)0.125us|get_unused_fd_flags();
1)2.375us|do_filp_open();
1)0.084us|put_unused_fd();
1)0.125us|putname();
1)4.083us|}
1)4.250us|}

在本樣例中 __arm64_sys_openat 函數(shù)的調(diào)用子流程僅包括 do_sys_openat2() 子函數(shù),而 do_sys_openat2() 函數(shù)又調(diào)用了 getname()/get_unused_fd_flags() 等子函數(shù)。

這種完整的子函數(shù)調(diào)用關(guān)系,對(duì)于我們學(xué)習(xí)內(nèi)核源碼和分析線上的問(wèn)題都提供了便利,排查問(wèn)題時(shí)則可以順藤摸瓜逐步縮小需要分析的范圍。

在 perf_tools[11] 工具集的前端工具為 funcgraph[12] ,使用 funcgraph 啟動(dòng)命令如下所示:

$./funcgraph-m3__arm64_sys_openat

如果函數(shù)調(diào)用棧比較多,直接查看跟蹤記錄則非常不方便,基于此社區(qū)補(bǔ)丁 [PATCH] ftrace: Add vim script to enable folding for function_graph traces[13] 提供了一個(gè)基于 vim 的配置,可通過(guò)樹狀關(guān)系來(lái)折疊和展開函數(shù)調(diào)用的最終記錄,vim 設(shè)置完整如下:

"Enablefoldingforftracefunction_graphtraces.
"
"Touse,:sourcethisfilewhileviewingafunction_graphtrace,orusevim's
"-Soptiontoloadfromthecommand-linetogetherwithatrace.Youcanthen
"usetheusualvimfoldcommands,suchas"za",toopenandclosenested
"functions.Whileclosed,afoldwillshowthetotaltimetakenforacall,
"aswouldnormallyappearonthelinewiththeclosingbrace.Folded
"functionswillnotincludefinish_task_switch(),sofoldingshouldremain
"relativelysaneeventhroughacontextswitch.
"
"Notethatthiswillalmostcertainlyonlyworkwellwitha
"single-CPUtrace(e.g.trace-cmdreport--cpu1).

function!FunctionGraphFoldExpr(lnum)
letline=getline(a:lnum)
ifline[-1:]=='{'
ifline=~'finish_task_switch(){$'
return'>1'
endif
return'a1'
elseifline[-1:]=='}'
return's1'
else
return'='
endif
endfunction

function!FunctionGraphFoldText()
lets=split(getline(v:foldstart),'|',1)
ifgetline(v:foldend+1)=~'finish_task_switch(){$'
lets[2]='taskswitch'
else
lete=split(getline(v:foldend),'|',1)
lets[2]=e[2]
endif
returnjoin(s,'|')
endfunction

setlocalfoldexpr=FunctionGraphFoldExpr(v:lnum)
setlocalfoldtext=FunctionGraphFoldText()
setlocalfoldcolumn=12
setlocalfoldmethod=expr

將上述指令保存為 function-graph-fold.vim 文件,在 vim 使用時(shí)通過(guò) -S 參數(shù)指定上述配置,就可實(shí)現(xiàn)按照層級(jí)展示跟蹤記錄。在 vim 中,可通過(guò) za 展開,zc 折疊跟蹤記錄。(通過(guò)文件分析,我們需要在 cat trace 文件時(shí)候重定向到文件)。

$vim-Sfunction-graph-fold.vimtrace.log

4. 內(nèi)核跟蹤點(diǎn)(tracepoint)跟蹤

可基于 ftrace 跟蹤內(nèi)核靜態(tài)跟蹤點(diǎn),可跟蹤的完整列表可通過(guò) available_events 查看。events 目錄下查看到各分類的子目錄,詳見下圖:

7a7ba230-5331-11ed-a3b6-dac502259ad0.png

#available_events文件中包括全部可用于跟蹤的靜態(tài)跟蹤點(diǎn)
$sudogrepopenatavailable_events
syscalls:sys_exit_openat2
syscalls:sys_enter_openat2
syscalls:sys_exit_openat
syscalls:sys_enter_openat

#我們可以在events/syscalls/sys_enter_openat中查看該跟蹤點(diǎn)相關(guān)的選項(xiàng)
$sudols-hlevents/syscalls/sys_enter_openat
total0
-rw-r-----1rootroot0Jan11970enable#是否啟用跟蹤1啟用
-rw-r-----1rootroot0Jan11970filter#跟蹤過(guò)濾
-r--r-----1rootroot0Jan11970format#跟蹤點(diǎn)格式
-r--r-----1rootroot0Jan11970hist
-r--r-----1rootroot0Jan11970id
--w-------1rootroot0Jan11970inject
-rw-r-----1rootroot0Jan11970trigger


$sudocatevents/syscalls/sys_enter_openat/format
name:sys_enter_openat
ID:555
format:
field:unsignedshortcommon_type;offset:0;size:2;signed:0;
field:unsignedcharcommon_flags;offset:2;size:1;signed:0;
field:unsignedcharcommon_preempt_count;offset:3;size:1;signed:0;
field:intcommon_pid;offset:4;size:4;signed:1;

field:int__syscall_nr;offset:8;size:4;signed:1;
field:intdfd;offset:16;size:8;signed:0;
field:constchar*filename;offset:24;size:8;signed:0;
field:intflags;offset:32;size:8;signed:0;
field:umode_tmode;offset:40;size:8;signed:0;

printfmt:"dfd:0x%08lx,filename:0x%08lx,flags:0x%08lx,mode:0x%08lx",((unsignedlong)(REC->dfd)),((unsignedlong)(REC->filename)),((unsignedlong)(REC->flags)),((unsignedlong)(REC->mode))

這里直接使用 tracepoint 跟蹤 sys_openat 系統(tǒng)調(diào)用,設(shè)置如下:

$sudoecho1>events/syscalls/sys_enter_openat/enable
$sudoecho1>tracing_on
$sudocattrace
#tracer:nop
#
#entries-in-buffer/entries-written:19/19#P:4
#
#_-----=>irqs-off
#/_----=>need-resched
#|/_---=>hardirq/softirq
#||/_--=>preempt-depth
#|||/delay
#TASK-PIDCPU#||||TIMESTAMPFUNCTION
#|||||||||
cat-16961[003]....47683.934082:sys_openat(dfd:ffffffffffffff9c,filename:ffff9abf20f0,flags:80000,mode:0)
cat-16961[003]....47683.934326:sys_openat(dfd:ffffffffffffff9c,filename:ffff9ac09f20,flags:80000,mode:0)
cat-16961[003]....47683.935468:sys_openat(dfd:ffffffffffffff9c,filename:ffff9ab75150,flags:80000,mode:0)

#關(guān)閉
$sudoecho0>events/syscalls/sys_enter_openat/enable

我們通過(guò)設(shè)置 sys_enter_openat/enable 開啟對(duì)于 sys_enter_openat 的跟蹤,trace 文件中的跟蹤記錄格式與 sys_enter_openat/format 中的 print 章節(jié)的格式一致。

printfmt:"dfd:0x%08lx,filename:0x%08lx,flags:0x%08lx,mode:0x%08lx"...

Filter 跟蹤記錄條件過(guò)濾

關(guān)于 sys_enter_openat/filter 文件為跟蹤記錄的過(guò)濾條件設(shè)置,格式如下:

fieldoperatorvalue

其中:

field 為 sys_enter_openat/format 中的字段。

operator 為比較符

整數(shù)支持:==,!=,= 和 & ,

字符串支持 ==,!=,~ 等,其中 ~ 支持 shell 腳本中通配符 *,?,[] 等操作。

不同的條件也支持 && 和 || 進(jìn)行組合。

如需要通過(guò) format 格式中的 mode 字段過(guò)濾:

field:umode_tmode;offset:40;size:8;signed:0;

只需要將進(jìn)行如下設(shè)置即可:

$sudoecho'mode!=0'>events/syscalls/sys_enter_openat/filter

如果需要清除 filter,直接設(shè)置為 0 即可:

$sudoecho0>events/syscalls/sys_enter_openat/filter

5. kprobe 跟蹤

kprobe 為內(nèi)核提供的動(dòng)態(tài)跟蹤機(jī)制。與第 1 節(jié)介紹的函數(shù)跟蹤類似,但是 kprobe 機(jī)制允許我們跟蹤函數(shù)任意位置,還可用于獲取函數(shù)參數(shù)與結(jié)果返回值。使用 kprobe 機(jī)制跟蹤函數(shù)須是 available_filter_functions 列表中的子集。

kprobe 設(shè)置文件和相關(guān)文件如下所示,其中部分文件為設(shè)置 kprobe 跟蹤函數(shù)后,F(xiàn)trace 自動(dòng)創(chuàng)建:

kprobe_events

設(shè)置 kprobe 跟蹤的事件屬性;

完整的設(shè)置格式如下,其中 GRP 用戶可以直接定義,如果不設(shè)定默認(rèn)為 kprobes:

p[:[GRP/]EVENT][MOD:]SYM[+offs]|MEMADDR[FETCHARGS]#設(shè)置probe探測(cè)點(diǎn)
r[:[GRP/]EVENT][MOD:]SYM[+0][FETCHARGS]#函數(shù)地址的返回跟蹤
-:[GRP/]EVENT#刪除跟蹤

kprobes///enabled

設(shè)置后動(dòng)態(tài)生成,用于控制是否啟用該內(nèi)核函數(shù)的跟蹤;

kprobes///filter

設(shè)置后動(dòng)態(tài)生成,kprobe 函數(shù)跟蹤過(guò)濾器,與上述的跟蹤點(diǎn) fliter 類似;

kprobes///format

設(shè)置后動(dòng)態(tài)生成,kprobe 事件顯示格式;

kprobe_profile

kprobe 事件統(tǒng)計(jì)性能數(shù)據(jù);

Kprobe 跟蹤過(guò)程可以指定函數(shù)參數(shù)的顯示格式,這里我們先給出 sys_openat 函數(shù)原型:

SYSCALL_DEFINE4(openat,int,dfd,constchar__user*,filename,int,flags,
umode_t,mode);

跟蹤函數(shù)入口參數(shù)

這里仍然以 __arm64_sys_openat 函數(shù)為例,演示使用 kpboe 機(jī)制進(jìn)行跟蹤:

#p[:[GRP/]EVENT][MOD:]SYM[+offs]|MEMADDR[FETCHARGS]
#GRP=my_grpEVENT=arm64_sys_openat
#SYM=__arm64_sys_openat
#FETCHARGS=dfd=$arg1flags=$arg3mode=$arg4
$sudoecho'p:my_grp/arm64_sys_openat__arm64_sys_openatdfd=$arg1flags=$arg3mode=$arg4'>>kprobe_events

$sudocatevents/my_grp/arm64_sys_openat/format
name:__arm64_sys_openat
ID:1475
format:
field:unsignedshortcommon_type;offset:0;size:2;signed:0;
field:unsignedcharcommon_flags;offset:2;size:1;signed:0;
field:unsignedcharcommon_preempt_count;offset:3;size:1;signed:0;
field:intcommon_pid;offset:4;size:4;signed:1;

field:unsignedlong__probe_ip;offset:8;size:8;signed:0;

printfmt:"(%lx)",REC->__probe_ip

events/my_grp/arm64_sys_openat/format
$sudoecho1>events/my_grp/arm64_sys_openat/enable
#$sudoecho1>options/stacktrace#啟用棧

$cattrace
#tracer:nop
#
#entries-in-buffer/entries-written:38/38#P:4
#
#_-----=>irqs-off
#/_----=>need-resched
#|/_---=>hardirq/softirq
#||/_--=>preempt-depth
#|||/delay
#TASK-PIDCPU#||||TIMESTAMPFUNCTION
#|||||||||
cat-17025[002]d...52539.651096:arm64_sys_openat:(__arm64_sys_openat+0x0/0xb4)dfd=0xffff8000141cbeb0flags=0x1bfmode=0xffff800011141778

#關(guān)閉,注意需要先echo0>enable停止跟蹤
#然后再使用"-:my_grp/arm64_sys_openat"停止,否則會(huì)正在使用或者忙的錯(cuò)誤
$sudoecho0>events/my_grp/arm64_sys_openat/enable
$sudoecho'-:my_grp/arm64_sys_openat'>>kprobe_events

跟蹤函數(shù)返回值

kprobe 可用于跟蹤函數(shù)返回值,格式如下:

r[:[GRP/]EVENT][MOD:]SYM[+offs]|MEMADDR[FETCHARGS]

例如:

$sudoecho'r:my_grp/arm64_sys_openat__arm64_sys_openatret=$retval'>>kprobe_events

變量 $retval 參數(shù)表示函數(shù)返回值,其他的使用格式與 kprobe 類似。

6. uprobe 跟蹤

uprobe 為用戶空間的動(dòng)態(tài)跟蹤機(jī)制,格式和使用方式與 kprobe 的方式類似,但是由于是用戶態(tài)程序跟蹤需要指定跟蹤的二進(jìn)制文件和偏移量。

p[:[GRP/]EVENT]]PATH:OFFSET[FETCHARGS]#跟蹤函數(shù)入口
r[:[GRP/]EVENT]]PATH:OFFSET[FETCHARGS]#跟蹤函數(shù)返回值
-:[GRP/]EVENT]#刪除跟蹤點(diǎn)

這里以跟蹤 /bin/bash 二進(jìn)制文件中的 readline() 函數(shù)為例:

$readelf-s/bin/bash|grep-wreadline
920:00000000000d6070208FUNCGLOBALDEFAULT13readline

$echo'p:my_grp/readline/bin/bash:0xd6070'>>uprobe_events
$echo1>events/my_grp/readline/enable

$cattrace
#tracer:nop
#
#entries-in-buffer/entries-written:1/1#P:4
#
#_-----=>irqs-off
#/_----=>need-resched
#|/_---=>hardirq/softirq
#||/_--=>preempt-depth
#|||/delay
#TASK-PIDCPU#||||TIMESTAMPFUNCTION
#|||||||||
bash-14951[003]....54570.055093:readline:(0xaaaab3ce6070)

$echo0>events/my_grp/readline/enable
$echo'-:my_grp/readline'>>uprobe_events

uprobe 跟蹤是跟蹤用戶態(tài)的函數(shù),因此需要指定二進(jìn)制文件+符號(hào)偏移量才能進(jìn)行跟蹤。不同系統(tǒng)中的二進(jìn)制版本或者編譯方式不同,會(huì)導(dǎo)致函數(shù)符號(hào)表的位置不同,因此需要跟蹤前進(jìn)行確認(rèn)。

7. 總結(jié)

至此,我們完整介紹 Ftrace 的整體應(yīng)用場(chǎng)景,也通過(guò)具體的設(shè)置,學(xué)習(xí)了使用的完整流程。

實(shí)際問(wèn)題排查中,考慮到效率和易用性,推薦大家這樣選擇:

如果排查問(wèn)題機(jī)器上支持 eBPF 技術(shù),首選 BCC trace[14] 及相關(guān)工具;

否則推薦使用 perf-tools[15] ;

最后的招數(shù)就是使用本文 Ftrace 的完整流程了。

但目前基于 eBPF 的工具還未支持 function_graph 跟蹤器,特定場(chǎng)景下還需要 ftrace 的 function_graph 跟蹤器的配合。

Ftrace 與 eBPF 并非是相互替代,而是相互補(bǔ)充協(xié)同關(guān)系,在后續(xù)的問(wèn)題排查案例中我們將看到這一點(diǎn)。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 封裝
    +關(guān)注

    關(guān)注

    125

    文章

    7592

    瀏覽量

    142141
  • 分析器
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

    12455
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4235

    瀏覽量

    61965

原文標(biāo)題:?jiǎn)栴}排查利器:Linux 原生跟蹤工具 Ftrace 必知必會(huì)

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何通過(guò)Tracealyzer實(shí)現(xiàn)Linux系統(tǒng)的跟蹤?

    Tracealyzer是Percepio 公司開發(fā)的一款可視化跟蹤工具, 目前它提供了30多種相互關(guān)聯(lián)的運(yùn)行時(shí)行為視圖,支持裸機(jī)、FreeRTOS、μC/OS-III、Zephyr、ThreadX、VxWorks、Linux系統(tǒng)的跟蹤。能夠幫助開發(fā)人員加快固件的開發(fā),減少
    的頭像 發(fā)表于 12-08 14:08 ?1090次閱讀
    如何<b class='flag-5'>通過(guò)</b>Tracealyzer<b class='flag-5'>實(shí)現(xiàn)</b>Linux系統(tǒng)的<b class='flag-5'>跟蹤</b>?

    有什么模塊或系統(tǒng)可以實(shí)現(xiàn)頻率的自動(dòng)跟蹤

    這里有一個(gè)MEMS壓電諧振器,固有頻率是40khz。 如果壓電諧振器上有灰塵或者水蒸氣在,由于質(zhì)量變化,諧振頻率會(huì)發(fā)生變化,通過(guò)頻率變化就能檢測(cè)空氣質(zhì)量或者濕度。 一個(gè)閉環(huán)頻率跟蹤電路,實(shí)現(xiàn)
    發(fā)表于 08-19 06:40

    衛(wèi)星定位接收機(jī)載波跟蹤的設(shè)計(jì)與實(shí)現(xiàn)

    衛(wèi)星定位接收機(jī)載波跟蹤的設(shè)計(jì)與實(shí)現(xiàn) 介紹了衛(wèi)星定位接收機(jī)載波跟蹤部分的設(shè)計(jì)和實(shí)現(xiàn)。在對(duì)比分析了載波頻率跟蹤(FLL)和載波相位
    發(fā)表于 09-19 09:38

    視頻跟蹤(目標(biāo)取差器)-基于DM8168實(shí)現(xiàn)的自動(dòng)視頻跟蹤

    跟蹤系統(tǒng)的鏡頭可能是:熱成像傳感器(它帶有一個(gè)或多個(gè)固定視場(chǎng))、帶ZOOM鏡頭的彩色CCD攝像機(jī),或窄視場(chǎng)攝像機(jī)(一般用于定點(diǎn)觀察)。對(duì)于使用可變視場(chǎng)的多攝像機(jī)系統(tǒng),AVT21提供了強(qiáng)大的支持,能實(shí)現(xiàn)
    發(fā)表于 09-05 11:14

    關(guān)于“智能跟蹤教學(xué)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)”的算法移植

    各位大神們,小的有一個(gè)疑問(wèn),我現(xiàn)在在做一個(gè)項(xiàng)目,是關(guān)于“智能跟蹤教學(xué)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)”,在VC上編程,通過(guò)兩臺(tái)攝像機(jī)已經(jīng)實(shí)現(xiàn)了對(duì)人臉的跟蹤,
    發(fā)表于 02-19 18:55

    基于OPENCV的運(yùn)動(dòng)目標(biāo)跟蹤實(shí)現(xiàn)

    和大小,得到當(dāng)前幀中目標(biāo)的尺寸和質(zhì)心位置。在介紹Intel公司的開源OpenCV計(jì)算機(jī)視覺庫(kù)的基礎(chǔ)上,采用CAMSHIFT跟蹤算法,實(shí)現(xiàn)運(yùn)動(dòng)目標(biāo)跟蹤,解決了跟蹤目標(biāo)發(fā)生存在旋轉(zhuǎn)或部分遮
    發(fā)表于 12-23 14:21

    基于QT+OpenCv的目標(biāo)跟蹤算法實(shí)現(xiàn)

    目標(biāo)跟蹤算法作為一種有著非常廣泛的應(yīng)用的算法,在航空航天、智能交通、智能設(shè)備等領(lǐng)域有著非常廣泛的應(yīng)用。本系列博客將教大家在410c開發(fā)板上基于linux操作系統(tǒng)環(huán)境,采用QT+Opencv來(lái)實(shí)現(xiàn)
    發(fā)表于 09-21 10:42

    LTC2970-1通過(guò)增加一些外部元件實(shí)現(xiàn)電源跟蹤

    使用LTC2970-1跟蹤兩個(gè)或多個(gè)電源。 LTC2970-1通過(guò)增加一些外部元件實(shí)現(xiàn)電源跟蹤
    發(fā)表于 06-26 06:32

    怎么實(shí)現(xiàn)基于STM32自動(dòng)跟蹤小車的設(shè)計(jì)?

    怎么實(shí)現(xiàn)基于STM32自動(dòng)跟蹤小車的設(shè)計(jì)?
    發(fā)表于 12-13 06:01

    在SpinalHDL里實(shí)現(xiàn)優(yōu)雅的添加待跟蹤波形信號(hào)

    SpinalHDL里,我們一樣可以實(shí)現(xiàn)優(yōu)雅的添加待跟蹤波形信號(hào)。姿勢(shì)一在Verilog代碼里,我們想要添加波形跟蹤信號(hào)時(shí)往往在待跟蹤信號(hào)上添加廠商約束原語(yǔ),如下所示:so easy!貌
    發(fā)表于 06-22 14:37

    視頻圖像動(dòng)態(tài)跟蹤算法的設(shè)計(jì)與實(shí)現(xiàn)

    設(shè)計(jì)內(nèi)容:1.了解視頻圖像動(dòng)態(tài)跟蹤的應(yīng)用背景2.了解視頻圖像動(dòng)態(tài)跟蹤算法的基本原理3.掌握camshift和Meanshift跟蹤算法的基本原理4.編程實(shí)現(xiàn)camshift算法并進(jìn)行實(shí)
    發(fā)表于 11-16 01:03 ?42次下載

    基于DSP實(shí)現(xiàn)艦船目標(biāo)檢測(cè)與跟蹤

    基于DSP實(shí)現(xiàn)艦船目標(biāo)檢測(cè)與跟蹤
    發(fā)表于 10-19 14:24 ?13次下載
    基于DSP<b class='flag-5'>實(shí)現(xiàn)</b>艦船目標(biāo)檢測(cè)與<b class='flag-5'>跟蹤</b>

    機(jī)載雷達(dá)目標(biāo)跟蹤能力評(píng)估

    解析計(jì)算法進(jìn)行評(píng)估,存在計(jì)算量大、適應(yīng)性差等問(wèn)題。本文基于跟蹤系統(tǒng)為黑箱的事實(shí),實(shí)際結(jié)合現(xiàn)代雷達(dá)工作模式多變的特點(diǎn),提出了一種新的基于點(diǎn)跡與航跡時(shí)間關(guān)聯(lián)的雷達(dá)目標(biāo)跟蹤能力評(píng)估模型,通過(guò)
    發(fā)表于 01-10 15:48 ?0次下載

    FPGA圖像識(shí)別與目標(biāo)跟蹤系統(tǒng)的實(shí)現(xiàn)

    采用FPGA搭建圖像處理系統(tǒng),通過(guò)硬件算法實(shí)現(xiàn)圖像的流水線及并行處理,實(shí)現(xiàn)了對(duì)具有特定顏色的物體的識(shí)別與跟蹤
    的頭像 發(fā)表于 04-06 14:07 ?4759次閱讀
    FPGA圖像識(shí)別與目標(biāo)<b class='flag-5'>跟蹤</b>系統(tǒng)的<b class='flag-5'>實(shí)現(xiàn)</b>

    鴻蒙開發(fā)系統(tǒng)基礎(chǔ)能力:ohos.hiTraceChain 分布式跟蹤

    本模塊提供了端側(cè)業(yè)務(wù)流程調(diào)用鏈跟蹤的打點(diǎn)能力,包括業(yè)務(wù)流程跟蹤的啟動(dòng)、結(jié)束、信息埋點(diǎn)等能力。
    的頭像 發(fā)表于 06-25 09:49 ?208次閱讀
    鴻蒙開發(fā)系統(tǒng)基礎(chǔ)<b class='flag-5'>能力</b>:ohos.hiTraceChain 分布式<b class='flag-5'>跟蹤</b>