ftrace で特定のプロセスや PID を除外しますか?

ftrace で特定のプロセスや PID を除外しますか?

これについて私が正しい考え方をしているかどうかはわかりませんが (間違っていたら訂正してください)、以下は ftrace についての私の理解です。

/sys/kernel/debug/tracing には、次のファイルがあります。

トレースフィルターを設定する

内部にリストされている関数のみをトレースします。

トレースしない

内部にリストされていない関数のみをトレースし、

トレースIDを設定する

内部に pid を持つプロセスのみをトレースします。

私の質問は次のとおりです:ftrace が特定の pid (またはプロセス名) を持たないプロセスのみをトレースするように設定する方法はありますか?

類推:

set_ftrace_filter : set_ftrace_notrace :: set_ftrace_pid :バツ

しますかバツ存在する場合、どのように使用すればよいですか?

例えば、pid 48以外のすべてのプロセスを追跡したい場合、意味のある何かを追加する方法はありますか?48ではないset_ftrace_pid に?

ドキュメントを読んだり、Web で検索したりしましたが、これを実現する方法も、これが可能かどうかもわかりません。

私がこれをやっている理由:カーネルレベルのシステム コールをトレースするプログラムがありますが、プログラムの PID (および後で必要になる場合はその子の PID) をフィルターに書き込んで、トレース データに含まれないようにしたいと考えています。トレースを読み取るときに、各トレース レコードを読み取りながら PID をチェックし、そのレコードを使用するかどうかを決定できますが、回避方法があれば、読み取られるレコードごとにこのオーバーヘッドを追加したくないと思います。

お時間をいただきありがとうございました!

答え1

私が説明したことを実行する方法はわかりましたが、少し直感に反していたので、検索中にこのページにたどり着く可能性のある人のために、ここに答えを掲載します(要約:下に)。 私の知る限りでは、特定の PID を持つプロセスだけを考慮するように指示するのと同じくらい簡単に、特定の PID を持つプロセスを ftrace からフィルタリングする包括的な方法はありませんが、私の場合は、生のシステム コール (sys_enter) のみを対象としており、特定の PID を持つレコードがそれらに含まれないようにする方法を見つけました。その方法は次のとおりです。

ftrace ディレクトリは次のとおりです。

/sys/カーネル/デバッグ/トレース/

内部には「イベントここから、ftraceがトレースできるすべてのものを見ることができますが、私の場合は、「生のシステムコール

内で生のシステムコール」の2つのサブディレクトリはシステム入力そしてシステム終了

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

トレースでPIDを持つプロセスのレコードを省略したい場合編集すると

/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter

読むには:

common_pid != n

トレース中に無視しようとしているプログラムに複数のスレッドまたは複数のプロセスがある場合は、&&演算子を使用します。PIDを持つプロセスを省略したいとします。o、 そしてpファイルを次のように編集します。

common_pid != n && common_pid != o && common_pid != p

フィルターをクリアするには、「0" をファイルに追加します:

echo "0" > /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter

...それでうまくいくでしょう。

有効にする1トレースしているイベントだけでなくトレースオンftraceディレクトリに書き込む0そのイベントのトレース(または、トレースオン) オフ。

これらのファイルに書き込むには、ルート権限が必要です。

私が思いつくのはこれくらいです。これを読んで投票してくれた皆さんに感謝します。私の回答が誰かの役に立てば幸いです。私がやったやり方を馬鹿げたものに見せる方法を誰かが知っているなら、遠慮なく私に知らせてください。

要約:プロセス 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 に置き換えます。

関連情報