在 ftrace 中過濾掉某些進程和/或 pid?

在 ftrace 中過濾掉某些進程和/或 pid?

我不確定我是否以正確的方式思考這個問題(如果我錯了,請糾正我),但以下是我對 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。

相關內容