我不確定我是否以正確的方式思考這個問題(如果我錯了,請糾正我),但以下是我對 ftrace 的理解。
在/sys/kernel/debug/tracing中,有以下檔案:
設定ftrace_filter
它只會追蹤裡面列出的函數,
set_ftrace_notrace
它將僅跟踪未在其中列出的函數,並且
設定_ftrace_pid
它只會追蹤有 pid 的進程。
我的問題是:有沒有辦法配置它,以便 ftrace 只追蹤沒有特定 pid(或進程名稱)的進程?
比喻:
set_ftrace_filter : set_ftrace_notrace :: set_ftrace_pid :X
做X存在,如果存在,我該如何使用它?
例如,如果我想追蹤除 pid 48 之外的所有進程,是否有某種方法可以使某些內容有意義不是 48進入set_ftrace_pid?
我一直在閱讀文件並蒐索網絡,但我找不到實現此目的的方法或這是否可能。
我為什麼要這樣做:我有一個正在追蹤內核層級系統呼叫的程序,但我想將該程式的 pid(及其子進程的 pid,如果稍後需要的話)寫入過濾器,以便它們不包含在追蹤資料中。讀取追蹤時,我可以在讀取每個追蹤記錄時檢查 pid,並決定是否使用該記錄,但如果有辦法避免的話,我不希望為讀取的每個記錄添加此開銷。
感謝您的時間!
答案1
我想出瞭如何做我所描述的事情,但這有點違反直覺,所以我在這裡為那些在搜尋時可能會點擊此頁面的人發布答案(TL:博士;在底部)。 據我所知,沒有一種全面的方法可以從 ftrace 中過濾掉具有特定 PID 的進程,就像告訴它只考慮具有特定 PID 的進程一樣,但就我而言,我只關心原始系統呼叫 (sys_enter) 並且我找到了如何消除具有某些PID 的記錄,使其不被包含在內,具體方法如下:
ftrace 目錄是:
/sys/核心/調試/追蹤/
裡面有一個名為「事件” 從這裡,您可以看到 ftrace 可以追蹤的所有內容,但對於我的情況,我進入“原始系統調用」。
之內原始系統調用,」這兩個子目錄是系統輸入和系統退出。
在 sys_enter(以及 sys_exit)內,有以下檔案:
使能夠
篩選
格式
ID
扳機
」篩選「是我們現在最關心的,但是格式具有啟用 sys_enter 時 ftrace 產生的條目欄位的有用資訊:
name: sys_enter
ID: 17
format:
field:unsigned short common_type; offset:0; size:2; signed:0;
field:unsigned char common_flags; offset:2; size:1; signed:0;
field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
field:int common_pid; offset:4; size:4; signed:1;
field:long id; offset:8; size:8; signed:1;
field:unsigned long args[6]; offset:16; size:48; signed:0;
在這裡,我們關心的是公共進程號。
如果您希望追蹤忽略具有 PID 的進程中的記錄n,你會編輯
/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter
閱讀:
common_pid != n
如果您在追蹤時嘗試忽略的程式有多個執行緒或多個進程,則只需使用 && 運算子。假設您想省略帶有 PID 的進程n,哦, 和p,您可以編輯該文件,使其內容如下:
common_pid != n && common_pid != o && common_pid != p
要清除過濾器,您只需編寫“0」到文件:
迴聲“0”> /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter
……就可以了。
使能夠必須包含“1「對於您正在追蹤的事件以及追蹤開啟在 ftrace 目錄中。寫在0對該事件的追蹤(或在以下情況下的所有追蹤)追蹤開啟) 離開。
寫入這些檔案需要 root 權限。
我能想到的就這麼多了。感謝任何閱讀/投票的人,我希望我的回答對某人有幫助。如果有人知道一種讓我的做法看起來很愚蠢的方法,請隨時打電話給我。
長話短說:若要過濾掉進程 48 中的記錄,請撰寫:
common_pid != 48
....到
/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter
透過編寫以下內容來過濾多個 PID(例如 48、49、53、58):
common_pid != 48 && common_pid != 49 && common_pid != 53 && common_pid !=58
將“events/raw_syscalls/sys_enter”替換為您想要的事件,並將我的號碼替換為您想要忽略的任何 PID。