ftraceで特定のプロセスおよび/またはPIDをフィルタリングしますか?

ftraceで特定のプロセスおよび/またはPIDをフィルタリングしますか?

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

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

ftrace_filter 設定

内部にリストされている機能のみを追跡します。

set_ftrace_notrace

ここにリストされていない機能のみを追跡します。

set_ftrace_pid

pidを持つプロセスのみを追跡します。

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

織乳:

set_ftrace_filter:set_ftrace_notrace::set_ftrace_pid:X

するX存在しますか?存在する場合はどのように使用しますか?

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

文書を読んでWebを検索しましたが、これを達成する方法やこれが可能かどうかはわかりません。

私がこれをする理由は次のとおりです。カーネルレベルのシステムコールを追跡するプログラムがありますが、追跡データに含まれないように、プログラムのpid(後で必要な場合は子プロセスのpid)をフィルタに記録したいと思います。トレースを読み取るときに各トレースレコードを読み取るときにpidを確認し、そのレコードを使用するかどうかを決定できますが、これを回避する方法がある場合は、読み取ったすべてのレコードにこのオーバーヘッドを追加したくありません。

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

答え1

私が説明した内容を実行する方法を見つけましたが、やや直感に反しているので、検索時にこのページにアクセスできる人のためにここに答えを投稿します(TL:博士。下部)。 私が知る限り、特定のPIDを持つプロセスのみを考慮するように指示するように、ftraceは特定のPIDを持つプロセスをフィルタリングする包括的な方法はありませんが、私の場合はrawシステムコール(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を持つプロセスのレコードを無視するように追跡する場合N、編集します

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

読む:

common_pid != n

追跡中に無視したいプログラムに複数のスレッドまたはプロセスがある場合は、&&演算子を使用してください。 PIDのあるプロセスを省略したいとしましょう。Nああ、次のようにファイルを編集できます。

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に置き換えます。

関連情報