日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

ftrace使用说明(二)

發(fā)布時(shí)間:2024/4/17 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ftrace使用说明(二) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文轉(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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。