web-dev-qa-db-ja.com

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

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

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

set_ftrace_filter

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

set_ftrace_notrace

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

set_ftrace_pid

これは、内部にpidがあるプロセスのみをトレースします。

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

類推:

set_ftrace_filter:set_ftrace_notrace :: set_ftrace_pid:x

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

たとえば、pid 48のプロセスを除くすべてのプロセスをトレースしたい場合、set-ftrace_pidに何か意味がある48ではないを入れる方法はありますか?

私はドキュメントを読んでウェブを検索してきましたが、これを達成する方法も、これが可能かどうかもわかりません。

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

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

6
LeapDayWilliam

私が説明していることを行う方法を理解しましたが、それは少し直感に反していたので、検索時にこのページにアクセスする可能性のある人々のためにここに答えを投稿します(tl:dr; at下)。 私が知る限り特定のPIDを持つプロセスのみを考慮するように指示するのと同じくらい簡単に、ftraceから特定のPIDを持つプロセスを除外する包括的な方法はありませんが、私の場合は、私は生のシステムコール(sys_enter)のみを気にし、特定のPIDを持つレコードがそれらに含まれないようにする方法を見つけました。これは次の方法です。

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

/ sys/kernel/debug/traceing /

内部には、「events」というディレクトリがあります。ここから、ftraceがトレースできるすべてのものを確認できますが、私の場合は、「raw_syscalls」に入ります。

raw_syscalls内では、 "2つのサブディレクトリはsys_entersys_exitです。

Sys_enter(およびsys_exit)内には、次のファイルがあります。

可能にする

フィルタ

フォーマット

id

引き金

"filter"は現在私たちが最も気にかけているものですが、formatには、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;

ここでは、common_pidを気にします。

トレースでPID nのプロセスからレコードを省略したい場合は、編集します

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

読むには:

common_pid != n

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

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

フィルタをクリアするには、ファイルに「 "」と書き込むだけです。

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

...トリックを行います。

enableには、トレースするイベントの "1"と、ftraceディレクトリのtracing_onを含める必要があります。 を書き込むと、そのイベントのトレース(またはtracing_onの場合はすべてのトレース)がオフになります。

これらのファイルへの書き込みには、root権限が必要です。

それが私が考えることができるすべてについてです。これを読んだり投票したりしてくれた人に感謝します。私の答えが誰かに役立つことを願っています。私のやり方がばかげているように見える方法を誰かが知っているなら、遠慮なく私に声をかけてください。

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

4
LeapDayWilliam