ftrace使用说明(二)
本文轉(zhuǎn)自:http://www.yiyon.net/index.php/archives/225
1.1????? Ftrace數(shù)據(jù)文件介紹
/sys/kernel/debug/tracing目錄下文件和目錄比較多,有些是各種跟蹤器共享使用的,有些是特定于某個(gè)跟蹤器使用的。在操作這些數(shù)據(jù)文件時(shí),通常使用 echo命令來(lái)修改其值,也可以在程序中通過(guò)文件讀寫相關(guān)的函數(shù)來(lái)操作這些文件的值。下面只對(duì)部分文件進(jìn)行描述,讀者可以參考內(nèi)核源碼包中 Documentation/trace 目錄下的文檔以及 kernel/trace 下的源文件以了解其余文件的用途。
- README:提供了一個(gè)簡(jiǎn)短的使用說(shuō)明,展示了ftrace的操作命令序列。可以通過(guò) cat 命令查看該文件以了解概要的操作流程。
- current_tracer:用于設(shè)置或顯示當(dāng)前使用的跟蹤器;使用 echo 將跟蹤器名字寫入該文件可以切換到不同的跟蹤器。系統(tǒng)啟動(dòng)后,其缺省值為 nop ,即不做任何跟蹤操作。在執(zhí)行完一段跟蹤任務(wù)后,可以通過(guò)向該文件寫入 nop 來(lái)重置跟蹤器。
- available_tracers:記錄了當(dāng)前編譯進(jìn)內(nèi)核的跟蹤器的列表,可以通過(guò) cat 查看其內(nèi)容;其包含的跟蹤器與內(nèi)核配置選項(xiàng)中所激活的選項(xiàng)是對(duì)應(yīng)的。寫current_tracer文件時(shí)用到的跟蹤器名字必須在該文件列出的跟蹤器名字列表中。
- trace:文件提供了查看獲取到的跟蹤信息的接口。可以通過(guò) cat 等命令查看該文件以查看跟蹤到的內(nèi)核活動(dòng)記錄,也可以將其內(nèi)容保存為記錄文件以備后續(xù)查看。
- tracing_enabled:用于控制 current_tracer 中的跟蹤器是否可以跟蹤內(nèi)核函數(shù)的調(diào)用情況。寫入 0 會(huì)關(guān)閉跟蹤活動(dòng),寫入 1 則激活跟蹤功能;其缺省值為 1 。
- set_graph_function:設(shè)置要清晰顯示調(diào)用關(guān)系的函數(shù),顯示的信息結(jié)構(gòu)類似于 C 語(yǔ)言代碼,這樣在分析內(nèi)核運(yùn)作流程時(shí)會(huì)更加直觀一些。在使用function_graph 跟蹤器時(shí)使用;缺省為對(duì)所有函數(shù)都生成調(diào)用關(guān)系序列,可以通過(guò)寫該文件來(lái)指定需要特別關(guān)注的函數(shù)。
- buffer_size_kb:用于設(shè)置單個(gè) CPU 所使用的跟蹤緩存的大小。跟蹤器會(huì)將跟蹤到的信息寫入緩存,每個(gè) CPU 的跟蹤緩存是一樣大的。跟蹤緩存實(shí)現(xiàn)為環(huán)形緩沖區(qū)的形式,如果跟蹤到的信息太多,則舊的信息會(huì)被新的跟蹤信息覆蓋掉。注意,要更改該文件的值需要先將 current_tracer 設(shè)置為 nop 才可以。
- tracing_on:用于控制跟蹤的暫停。有時(shí)候在觀察到某些事件 時(shí)想暫時(shí)關(guān)閉跟蹤,可以將 0 寫入該文件以停止跟蹤,這樣跟蹤緩沖區(qū)中比較新的部分是與所關(guān)注的事件相關(guān)的;寫入 1 可以繼續(xù)跟蹤。
- available_filter_functions:記錄了當(dāng)前可以跟蹤的內(nèi)核函數(shù)。對(duì)于不在該文件中列出的函數(shù),無(wú)法跟蹤其活動(dòng)。
- 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ì) 被跟蹤。這些文件還支持簡(jiǎn)單形式的含有通配符的表達(dá)式,這樣可以用一個(gè)表達(dá)式一次指定多個(gè)目標(biāo)函數(shù);具體使用在后續(xù)文章中會(huì)有描述。注意,要寫入這兩個(gè)文 件的函數(shù)名必須可以在文件 available_filter_functions 中看到。缺省為可以跟蹤所有內(nèi)核函數(shù),文件 set_ftrace_notrace 的值則為空。
1.2????? Ftrace操作
1.設(shè)置tracer 由前述可知,available_tracers中記錄的tracer都是有效的。假設(shè)現(xiàn)在已經(jīng)在目錄/sys/kernel/debug/tracing下。打開trace功能,設(shè)置function跟蹤器:
# echo function > current_tracer
# cat current_tracer
function
2.開啟/關(guān)閉tracer啟動(dòng):#echo 1 > /proc/sys/kernel/ftrace_enabled
停止:#echo 0 > /proc/sys/kernel/ftrace_enabled
3.暫停/繼續(xù)跟蹤情況暫停:#echo 0 > tracing_on
繼續(xù):#echo 1 > tracing_on
4.觀察結(jié)果
#cat trace | head -10
5.?跟蹤指定的process
也許我們只需要跟蹤指定的process,或者指定一組process;
[root@RedHat tracing]# cat set_ftrace_pid
no pid
[root@RedHat tracing]# echo $$ > set_ftrace_pid
上述將使得function tracer只跟蹤bash shell;如果我們想要跟蹤指定的process,需要?jiǎng)?chuàng)建以下腳本程序:
[root@RedHat tracing]# cat /home/tools/ftracer/ftrace-me
#!/bin/sh
DEBUGFS=`grep debugfs /proc/mounts | awk ‘{ print $2; }’`
echo $$ > $DEBUGFS/tracing/set_ftrace_pid
echo function > $DEBUGFS/tracing/current_tracer
exec $*
[root@RedHat tracing]# /home/tools/ftracer/ftrace-me ls –ltr
Note, you must clear the set_ftrace_pid file if you want to go back to generic function tracing after performing the above.
? [root@RedHat tracing]# echo -1 > set_ftrace_pid?
?
2????????? 調(diào)試實(shí)例
2.1????? Function跟蹤器
Function tracer的主要功能是跟蹤函數(shù)調(diào)用。使用方法如下:
| [root@RedHat tracing]# ? [root@RedHat tracing]# pwd /sys/kernel/debug/tracing [root@RedHat tracing]# echo 0 > tracing_enabled [root@RedHat tracing]# echo 1 > /proc/sys/kernel/ftrace_enabled [root@RedHat tracing]# echo function > current_tracer [root@RedHat tracing]# echo 1 > tracing_on [root@RedHat tracing]# echo 1 > tracing_enabled # 運(yùn)行一段時(shí)間,即可采用ftrace手機(jī)一些跟蹤信息 [root@RedHat tracing]# echo 0 > tracing_enabled [root@RedHat tracing]# cat trace | head -10 # tracer: function # #?????????? TASK-PID??? CPU#??? TIMESTAMP? FUNCTION #????????????? | |?????? |????????? |???????? | automount-1878? [000]? 8901.818000: _raw_spin_lock_irq <-__schedule automount-1878? [000]? 8901.818000: update_rq_clock <-__schedule automount-1878? [000]? 8901.818000: put_prev_task_fair <-__schedule automount-1878? [000]? 8901.818000: update_curr <-put_prev_task_fair automount-1878? [000]? 8901.818000: pick_next_task_fair <-__schedule automount-1878? [000]? 8901.818000: clear_buddies <-pick_next_task_fair [root@RedHat tracing]# |
| ? |
| ? |
?
解析:trace 文件給出的信息格式很清晰。首先,字段“tracer:”給出了當(dāng)前所使用的跟蹤器的名字,這里為 function 跟蹤器。然后是跟蹤信息記錄的格式,TASK 字段對(duì)應(yīng)任務(wù)的名字,PID 字段則給出了任務(wù)的進(jìn)程 ID,字段 CPU# 表示運(yùn)行被跟蹤函數(shù)的 CPU 號(hào),這里可以看到 automount進(jìn)程運(yùn)行在 0 號(hào) CPU 上,其進(jìn)程 ID 是 1878 ;字段 TIMESTAMP 是時(shí)間戳,其格式為“<secs>.<usecs>”,表示執(zhí)行該函數(shù)時(shí)對(duì)應(yīng)的時(shí)間戳;FUNCTION 一列則給出了被跟蹤的函數(shù),函數(shù)的調(diào)用者通過(guò)符號(hào) “<-” 標(biāo)明,這樣可以觀察到函數(shù)的調(diào)用關(guān)系。
?
2.2????? function_graph跟蹤器
function_graph跟蹤器也是用來(lái)跟蹤系統(tǒng)調(diào)用的。
在 function 跟蹤器給出的信息中,可以通過(guò) FUNCTION 列中的符號(hào) “<-” 來(lái)查看函數(shù)調(diào)用關(guān)系,但是由于中間會(huì)混合不同函數(shù)的調(diào)用,導(dǎo)致看起來(lái)非常混亂,十分不方便。function_graph 跟蹤器則可以提供類似 C 代碼的函數(shù)調(diào)用關(guān)系信息。通過(guò)寫文件 set_graph_function 可以顯示指定要生成調(diào)用關(guān)系的函數(shù),缺省會(huì)對(duì)所有可跟蹤的內(nèi)核函數(shù)生成函數(shù)調(diào)用關(guān)系圖。下面給出了使用 function_grapch 跟蹤器的示例,示例中將內(nèi)核函數(shù) __do_fault 作為觀察對(duì)象,該函數(shù)在內(nèi)核運(yùn)作過(guò)程中會(huì)被頻繁調(diào)用
使用方法如下:
?
| [root@RedHat tracing]# echo 0 > tracing_enabled ? [root@RedHat tracing]# echo 1 > /proc/sys/kernel/ftrace_enabled [root@RedHat tracing]# echo function_graph > current_tracer [root@RedHat tracing]# echo __do_fault > set_graph_function [root@RedHat tracing]# echo 1 > tracing_on [root@RedHat tracing]# echo 1 > tracing_enabled # 運(yùn)行一段時(shí)間,即可采用ftrace手機(jī)一些跟蹤信息 [root@RedHat tracing]# echo 0 > tracing_enabled [root@RedHat tracing]# cat trace | head -20 # tracer: function_graph # # CPU? DURATION????????????????? FUNCTION CALLS # |???? |?? |???????????????????? |?? |?? |?? | 0)?? 0.000 us ???|????????????????? calc_global_load(); 0) ! 3000.000 us |??????????????? } /* do_timer */ 0) ! 3000.000 us |????????????? } /* tick_do_update_jiffies64 */ 0)?????????????? |????????????? update_process_times() { 0)?????????????? |??????????????? account_process_tick() { 0)?????????????? |????????????????? account_system_time() { 0)?? 0.000 us??? |??????????????????? acct_update_integrals(); 0)?? 0.000 us??? |????????????????? } 0)?? 0.000 us??? |??????????????? } 0)?????????????? |????????????? ??run_local_timers() { 0)?? 0.000 us??? |????????????????? hrtimer_run_queues(); 0)?? 0.000 us??? |????????????????? raise_softirq(); 0)?? 0.000 us??? |??????????????? } 0)?????????????? |??????????????? rcu_check_callbacks() { 0)?? 0.000 us??? |???? ?????????????idle_cpu(); 0)?? 0.000 us??? |????????????????? __rcu_pending(); [root@RedHat tracing]# echo > set_graph_function |
| ? |
| ? |
?
解析:在文件 trace 的輸出信息中,首先給出的也是當(dāng)前跟蹤器的名字,這里是 function_graph 。接下來(lái)是詳細(xì)的跟蹤信息,可以看到,函數(shù)的調(diào)用關(guān)系以類似 C 代碼的形式組織。
CPU 字段給出了執(zhí)行函數(shù)的 CPU 號(hào),本例中都為 1 號(hào) CPU。DURATION 字段給出了函數(shù)執(zhí)行的時(shí)間長(zhǎng)度,以 us 為單位。FUNCTION CALLS 則給出了調(diào)用的函數(shù),并顯示了調(diào)用流程。注意,對(duì)于不調(diào)用其它函數(shù)的函數(shù),其對(duì)應(yīng)行以“;”結(jié)尾,而且對(duì)應(yīng)的 DURATION 字段給出其運(yùn)行時(shí)長(zhǎng);對(duì)于調(diào)用其它函數(shù)的函數(shù),則在其“}”對(duì)應(yīng)行給出了運(yùn)行時(shí)長(zhǎng),該時(shí)間是一個(gè)累加值,包括了其內(nèi)部調(diào)用的函數(shù)的執(zhí)行時(shí)長(zhǎng)。 DURATION 字段給出的時(shí)長(zhǎng)并不是精確的,它還包含了執(zhí)行 ftrace 自身的代碼所耗費(fèi)的時(shí)間,所以示例中將內(nèi)部函數(shù)時(shí)長(zhǎng)累加得到的結(jié)果會(huì)與對(duì)應(yīng)的外圍調(diào)用函數(shù)的執(zhí)行時(shí)長(zhǎng)并不一致;不過(guò)通過(guò)該字段還是可以大致了解函數(shù)在時(shí)間 上的運(yùn)行開銷的。最后通過(guò) echo 命令重置了文件。
?
注:The “+” that are there are annotation marker. When the duration is greater than 10 microseconds, a “+” is shown. If the duration is greater than 100 microseconds a “!” will be displayed.
?
2.3????? irqsoff跟蹤器
當(dāng)關(guān)閉中斷時(shí),CPU會(huì)延遲對(duì)設(shè)備的狀態(tài)變化做出反應(yīng),有時(shí)候這樣做會(huì)對(duì)系統(tǒng)性能造成比較大的影響。irqsoff 跟蹤器可以對(duì)中斷被關(guān)閉的狀況進(jìn)行跟蹤,有助于發(fā)現(xiàn)導(dǎo)致較大延遲的代碼;當(dāng)出現(xiàn)最大延遲時(shí),跟蹤器會(huì)記錄導(dǎo)致延遲的跟蹤信息,文件 tracing_max_latency 則記錄中斷被關(guān)閉的最大延時(shí)。
使用方法如下(因?yàn)閷?shí)用的是虛擬機(jī),輸出信息有誤):
| [root@RedHat tracing]# pwd ? /sys/kernel/debug/tracing [root@RedHat tracing]# echo 0 > tracing_enabled [root@RedHat tracing]# echo 1 > /proc/sys/kernel/ftrace_enabled [root@RedHat tracing]# echo irqsoff > current_tracer [root@RedHat tracing]# echo 1 > tracing_on [root@RedHat tracing]# echo 1 > tracing_enabled # 運(yùn)行一段時(shí)間,即可采用ftrace手機(jī)一些跟蹤信息 [root@RedHat tracing]# echo 0 > tracing_enabled [root@RedHat tracing]# cat trace | head -35 # tracer: irqsoff # # irqsoff latency trace v1.1.5 on 3.2.0trace # ——————————————————————– # latency: 3833000 us, #220/220, CPU#0 | (M:desktop VP:0, KP:0, SP:0 HP:0 #P:1) #??? —————– #??? | task: swapper/0-0 (uid:0 nice:0 policy:0 rt_prio:0) #??? —————– #? => started at: common_interrupt #? => ended at:?? do_softirq # # #???????????? ?????_——=> CPU# #???????????????? / _—–=> irqs-off #??????????????? | / _—-=> need-resched #??????????????? || / _—=> hardirq/softirq #??????????????? ||| / _–=> preempt-depth #??????????????? |||| /???? delay #? cmd???? pid?? ||||| time? |?? caller #???? \?? /????? |||||? \??? |?? / <idle>-0?????? 0dN..??? 0us : acpi_pm_read <-do_timer <idle>-0?????? 0dN..??? 0us : calc_global_load <-do_timer <idle>-0?????? 0dN..??? 0us : account_idle_ticks <-tick_nohz_restart_sched_tick <idle>-0?????? 0dN..??? 0us : hrtimer_cancel <-tick_nohz_restart_sched_tick <idle>-0?????? 0dN..??? 0us : hrtimer_try_to_cancel <-hrtimer_cancel <idle>-0?????? 0dN..??? 0us : lock_hrtimer_base <-hrtimer_try_to_cancel <idle>-0?????? 0dN..??? 0us : _raw_spin_lock_irqsave <-lock_hrtimer_base <idle>-0?????? 0dN..??? 0us : __remove_hrtimer <-hrtimer_try_to_cancel <idle>-0?????? 0dN..??? 0us : hrtimer_force_reprogram <-__remove_hrtimer <idle>-0?????? 0dN..??? 0us : tick_program_event <-hrtimer_force_reprogram <idle>-0?????? 0dN..??? 0us : clockevents_program_event <-tick_program_event <idle>-0?????? 0dN..??? 0us : ktime_get <-clockevents_program_event <idle>-0?????? 0dN..??? 0us : acpi_pm_read <-ktime_get <idle>-0?????? 0dN..??? 0us : lapic_next_event <-clockevents_program_event <idle>-0?????? 0dN..??? 0us : native_apic_mem_write <-lapic_next_event [root@RedHat tracing]# cat tracing_max_latency 3833000 [root@RedHat tracing]# |
?
解析:從輸出信息中,可以看到當(dāng)前 irqsoff 延遲跟蹤器的版本信息。接下來(lái)是最大延遲時(shí)間,以u(píng)s為單位,本例中為3833000us ,查看文件 tracing_max_latency 也可以獲取該值。從“task:”字段可以知道延遲發(fā)生時(shí)正在運(yùn)行的進(jìn)程為 idle(其 pid 為 0 )。中斷的關(guān)閉操作是在函數(shù) reschedule_interrupt 中進(jìn)行的,由“=> started at:”標(biāo)識(shí),函數(shù) restore_all_ontrace 重新激活了中斷,由“=> ended at:”標(biāo)識(shí);中斷關(guān)閉的最大延遲發(fā)生在函數(shù) trace_hardirqs_on_thunk 中,這個(gè)可以從最大延遲時(shí)間所在的記錄項(xiàng)看到,也可以從延遲記錄信息中最后的“=>”標(biāo)識(shí)所對(duì)應(yīng)的記錄行知道這一點(diǎn)。
在輸出信息中,irqs-off、need_resched 等字段對(duì)應(yīng)于進(jìn)程結(jié)構(gòu) struct task_struct 的字段或者狀態(tài)標(biāo)志,可以從頭文件 arch/<platform>/include/asm/thread_info.h 中查看進(jìn)程支持的狀態(tài)標(biāo)志,include/linux/sched.h 則給出了結(jié)構(gòu) struct task_struct 的定義。其中,irqs-off 字段顯示是否中斷被禁止,為‘ d ’表示中斷被禁止;need_resched 字段顯示為‘ N ’表示設(shè)置了進(jìn)程狀態(tài)標(biāo)志 TIF_NEED_RESCHED。hardirq/softirq 字段表示當(dāng)前是否發(fā)生硬件中斷 / 軟中斷;preempt-depth 表示是否禁止進(jìn)程搶占,例如在持有自旋鎖的情況下進(jìn)程是不能被搶占的,本例中進(jìn)程 idle 是可以被其它進(jìn)程搶占的。結(jié)構(gòu) struct task_struct 中的 lock_depth 字段是與大內(nèi)核鎖相關(guān)的,而最近的內(nèi)核開發(fā)工作中有一部分是與移除大內(nèi)核鎖相關(guān)的,這里對(duì)該字段不再加以描述。
2.4??????Function Profiling
?
| # echo nop > current_tracer # echo 1 > function_profile_enabled # cat trace_stat/function0 |head ?Function?????????????????????????????? Hit??? Time??????????? Avg ?——–?????????????????????????????? —??? —-??????????? — ?schedule??????????????????? ???????????923??? 325906219 us???? 353094.4 us ?vfs_read?????????????????????????????? 238??? 109621612 us???? 460595.0 us ?sys_read?????????????????????????????? 208??? 108491821 us???? 521595.2 us ?do_sync_read?????????????????????????? 123??? 49456207 us???? 402082.9 us ?pipe_read?????????????????????????????? 63??? 48292785 us???? 766552.1 us ?pipe_wait?????????????????????????????? 63??? 48276550 us???? 766294.4 us ?sys_futex????????????????? ??????????????5??? 48068145 us???? 9613629 us ?do_futex???????????????????????????????? 5??? 48068115 us???? 9613623 us |
?
2.5??????sched_switch跟蹤器
sched_switch 跟蹤器可以對(duì)進(jìn)程的調(diào)度切換以及之間的喚醒操作進(jìn)行跟蹤,使用方法如下:
| [root@RedHat tracing]# pwd ? /sys/kernel/debug/tracing [root@RedHat tracing]# echo 0 > tracing_enabled [root@RedHat tracing]# echo 1 > /proc/sys/kernel/ftrace_enabled [root@RedHat tracing]# echo sched_switch ?> current_tracer [root@RedHat tracing]# echo 1 > tracing_on [root@RedHat tracing]# echo 1 > tracing_enabled # 運(yùn)行一段時(shí)間,即可采用ftrace手機(jī)一些跟蹤信息 [root@RedHat tracing]# echo 0 > tracing_enabled [root@RedHat tracing]# cat trace | head -10 [root@RedHat tracing]# tracer: sched_switch # #? TASK-PID??? CPU#??? TIMESTAMP? FUNCTION #???? | |?????? |????????? |???????? | bash-1408? [000] 26208.816058:?? 1408:120:S?? + [000]? 1408:120:S bash bash-1408? [000] 26208.816070:?? 1408:120:S?? + [000]? 1408:120:S bash bash-1408? [000] 26208.816921:?? 1408:120:R?? + [000]???? 9:120:R events/0 bash-1408? [000] 26208.816939:?? 1408:120:R ==> [000]???? 9:120:R events/0 events/0-9???? [000] 26208.817081:????? 9:120:R?? + [000]? 1377:120:R gnome-terminal events/0-9???? [000] 26208.817088:????? 9:120:S ==> [000]? 1377:120:R gnome-terminal |
?
解析:在 sched_swich 跟蹤器獲取的跟蹤信息中記錄了進(jìn)程間的喚醒操作和調(diào)度切換信息:
- ‘ + ’喚醒操作 – 記錄給出了當(dāng)前進(jìn)程喚醒運(yùn)行的進(jìn)程。
- ‘ ==> ’進(jìn)程調(diào)度切換 – 記錄中顯示了接替當(dāng)前進(jìn)程運(yùn)行的后續(xù)進(jìn)程。
描述進(jìn)程狀態(tài)的格式為“Task-PID:Priority:Task-State”。以示例跟蹤信息中的第一條跟蹤記錄為例,可以看到進(jìn)程 bash 的 PID 為 1408 ,其對(duì)應(yīng)的內(nèi)核態(tài)優(yōu)先級(jí)為 120 ,當(dāng)前狀態(tài)為 S(可中斷睡眠狀態(tài)),當(dāng)前 bash 并沒有喚醒其它進(jìn)程;從第 3 條記錄可以看到,進(jìn)程 bash 將進(jìn)程 events/0 喚醒,而在第 4 條記錄中發(fā)生了進(jìn)程調(diào)度,進(jìn)程 bash 切換到進(jìn)程 events/0 執(zhí)行。
在 Linux 內(nèi)核中,進(jìn)程的狀態(tài)在內(nèi)核頭文件 include/linux/sched.h 中定義,包括可運(yùn)行狀態(tài) TASK_RUNNING(對(duì)應(yīng)跟蹤信息中的符號(hào)‘ R ’)、可中斷阻塞狀態(tài) TASK_INTERRUPTIBLE(對(duì)應(yīng)跟蹤信息中的符號(hào)‘ S ’)等。同時(shí)該頭文件也定義了用戶態(tài)進(jìn)程所使用的優(yōu)先級(jí)的范圍,最小值為 MAX_USER_RT_PRIO(值為 100 ),最大值為 MAX_PRIO – 1(對(duì)應(yīng)值為 139 ),缺省為 DEFAULT_PRIO(值為 120 );在本例中,進(jìn)程優(yōu)先級(jí)都是缺省值 120 。
進(jìn)程狀態(tài):
R – running?: wants to run, may not actually be running
S – sleep ?: process is waiting to be woken up (handles signals)
D – disk sleep (uninterruptible sleep)?: process must be woken up (ignores signals)
T – stopped?: process suspended
t – traced ?: process is being traced (with something like gdb)
Z – zombie ?: process waiting to be cleaned up
X – unknown
?
?
2.6????? 跟蹤指定模塊中的函數(shù)
前面提過(guò),通過(guò)文件 set_ftrace_filter 可以指定要跟蹤的函數(shù),缺省目標(biāo)為所有可跟蹤的內(nèi)核函數(shù);可以將感興趣的函數(shù)通過(guò) echo 寫入該文件。為了方便使用,set_ftrace_filter 文件還支持簡(jiǎn)單格式的通配符。
- begin*選擇所有名字以 begin 字串開頭的函數(shù)
- *middle*選擇所有名字中包含 middle 字串的函數(shù)
- *end選擇所有名字以 end 字串結(jié)尾的函數(shù)
需要注意的是,這三種形式不能組合使用,比如“begin*middle*end”實(shí)際的效果與“begin”相同。另外,使用通配符表達(dá)式 時(shí),需要用單引號(hào)將其括起來(lái),如果使用雙引號(hào),shell 可能會(huì)對(duì)字符‘ * ’進(jìn)行擴(kuò)展,這樣最終跟蹤的對(duì)象可能與目標(biāo)函數(shù)不一樣。
通過(guò)該文件還可以指定屬于特定模塊的函數(shù),這要用到 mod 指令。指定模塊的格式為:
echo ‘:mod:[module_name]’ > set_ftrace_filter
下面給出了一個(gè)指定跟蹤模塊 ipv6 中的函數(shù)的例子。可以看到,指定跟蹤模塊 ipv6 中的函數(shù)會(huì)將文件 set_ftrace_filter 的內(nèi)容設(shè)置為只包含該模塊中的函數(shù)。
指定跟蹤 ipv6 模塊中的函數(shù)
| [root@RedHat tracing]# pwd ? /sys/kernel/debug/tracing [root@RedHat tracing]# echo ‘:mod:ipv6′ > set_ftrace_filter [root@RedHat tracing]# cat set_ftrace_filter | head -5 ipv6_opt_accepted inet6_net_exit ipv6_gro_complete inet6_create ipv6_addr_copy |
?
轉(zhuǎn)載于:https://www.cnblogs.com/ltfbk/archive/2013/05/18/3085992.html
總結(jié)
以上是生活随笔為你收集整理的ftrace使用说明(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 三年开发项目经验总结
- 下一篇: 声明属性Hibernate的Annota