Linux ftrace 2.3、kprobe eventの使用
13593 ワード
元のtrace eventピンは静的:TRACE_を使用EVENT()はtracepointを定義し、コードでtracepointを明示的に呼び出します.一方、kprobeメカニズムはカーネル運転時に動的な杭挿入を実現することができ、kprobeメカニズムを利用してtrace eventを動的に挿入することができ、静的trace eventと同じ機能を実現することができる.
参考原文:Kprobe-based Event Tracing
これらのeventはtracepointベースのeventと非常に類似しており,tracepointメカニズムの代わりにkprobeメカニズムを用いる.したがって、任意のkprobeが検出できる場所を検出することができる(これは、すべての関数が__kprobes/nokprobe_inlineで明記され、NOKPROBE_SYMBOLでマークされている関数を除くことを意味する).tracepointベースの静的eventとは異なり,本eventは動的な増加と削除を実現できる.
カーネルのコンパイル時にCONFIG_を設定するKPROBE_EVENTS=yは、この特性を可能にします.
event tracerのようにcurrent_を通過する必要はありませんtracerファイルインタフェースをアクティブにします.代わりに、probeポイントを増やして「/sys/kernel/debug/tracing/kprobe_events」インタフェースを通過し、enableは「/sys/kernel/debug/tracing/events/kprobes//enabled」インタフェースを通過する.
kprobe eventのコマンドフォーマットの追加/削除:
「fetch−args」では一連のtypesがサポートされ、Kprobe tracerは所与のtypeを使用してメモリにアクセスすることができる.「s」、「u」接頭辞:signed、unsignedをそれぞれ示す. 「x」接頭辞:unsignedを意味する. 数字:10進数(‘s’and‘u’)、16進数(‘x’).タイプ固定はなく、数字が「x 32」を使用するか「x 64」を使用するかは、アーキテクチャ(x 86-32 uses x 32、and x 86-64 uses x 64)に依存する. 文字列:null-terminatedの文字列がメモリに読み込まれます. Bitfield:3つのパラメータbit-width,bit-offset,container-size(usually 32).
「$comm」の場合、デフォルトは「string」タイプで、他のタイプは不正です.
各probe eventはfilter機能もサポートしており、異なるfilterを設定しtrace bufferに表示されるパラメータを与えることができます.「p:」or「r:」+event name」>kprobe_を使用した場合eventsコマンドでは、新しいkprobe eventが追加され、新しいeventに対応するフォルダtracing/events/kprobes/、「id」、「enabled」、「format」および「filter」ファイルが含まれていることがわかります. enabled:enable/disbaleというkprobe event; format:このeventのtraceフォーマットを印刷します. filter:このeventに対してfilterルールを構成できます. id:event対応id
/sys/kernel/debug/tracing/kprobe_profileはすべてのkprobe eventのヒットとmiss状況を表示します.第1列はevent name、第2列はprobe hitsカウント、第3列はprobe miss-hitsカウントである.
kprobe_へevents書き込みコマンドは、新しいkprobe eventを追加します.
上記do_sys_Open()関数の上にkprobeを作成し、対応する「myprobe」eventは4つのパラメータを記録するために使用されます.
注意:レジスタ/スタックが関数にどのように割り当てられるかのパラメータはアーキテクチャABIの定義に依存し、ABIが確定していない場合はperf-toolsのprobeサブコマンドを使用することができます.この例に示すように、ユーザは、各パラメータについてより熟知した名前を選択することができる.
上記do_sys_Open()関数の非戻りポイントにはkretprobeが設定され、対応する「myretprobe」eventが戻り値を記録します.イベントの出力フォーマットは、/sys/kernel/debug/tracing/events/kprobes//formatで表示できます.
式に記述されている4つのパラメータが表示されます.
このコマンドはすべてのprobe pointsをクリアできます.または選択したprobe pointsをクリアします.
定義後、すべてのeventモードでdisable状態になります.tracingではenbaleが必要です.
trace情報は/sys/kernel/debug/tracing/traceファイルに表示されます.
各行はkernelヒットイベントを表します.
1、Kprobe-based Event Tracing 2、ARMv 8上のkprobesイベント追跡
参考原文:Kprobe-based Event Tracing
1、Overview
これらのeventはtracepointベースのeventと非常に類似しており,tracepointメカニズムの代わりにkprobeメカニズムを用いる.したがって、任意のkprobeが検出できる場所を検出することができる(これは、すべての関数が__kprobes/nokprobe_inlineで明記され、NOKPROBE_SYMBOLでマークされている関数を除くことを意味する).tracepointベースの静的eventとは異なり,本eventは動的な増加と削除を実現できる.
カーネルのコンパイル時にCONFIG_を設定するKPROBE_EVENTS=yは、この特性を可能にします.
event tracerのようにcurrent_を通過する必要はありませんtracerファイルインタフェースをアクティブにします.代わりに、probeポイントを増やして「/sys/kernel/debug/tracing/kprobe_events」インタフェースを通過し、enableは「/sys/kernel/debug/tracing/events/kprobes//enabled」インタフェースを通過する.
2、Synopsis of kprobe_events
kprobe eventのコマンドフォーマットの追加/削除:
p[:[GRP/]EVENT] [MOD:]SYM[+offs]|MEMADDR [FETCHARGS] : Set a probe
r[MAXACTIVE][:[GRP/]EVENT] [MOD:]SYM[+0] [FETCHARGS] : Set a return probe
-:[GRP/]EVENT : Clear a probe
GRP : Group name. If omitted, use "kprobes" for it.
EVENT : Event name. If omitted, the event name is generated
based on SYM+offs or MEMADDR.
MOD : Module name which has given SYM.
SYM[+offs] : Symbol+offset where the probe is inserted.
MEMADDR : Address where the probe is inserted.
MAXACTIVE : Maximum number of instances of the specified function that
can be probed simultaneously, or 0 for the default value
as defined in Documentation/kprobes.txt section 1.3.1.
FETCHARGS : Arguments. Each probe can have up to 128 args.
%REG : Fetch register REG
@ADDR : Fetch memory at ADDR (ADDR should be in kernel)
@SYM[+|-offs] : Fetch memory at SYM +|- offs (SYM should be a data symbol)
$stackN : Fetch Nth entry of stack (N >= 0)
$stack : Fetch stack address.
$retval : Fetch return value.(*)
$comm : Fetch current task comm.
+|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**)
NAME=FETCHARG : Set NAME as the argument name of FETCHARG.
FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types
(u8/u16/u32/u64/s8/s16/s32/s64), hexadecimal types
(x8/x16/x32/x64), "string" and bitfield are supported.
(*) only for return probe.
(**) this is useful for fetching a field of data structures.
2.1、Types
「fetch−args」では一連のtypesがサポートされ、Kprobe tracerは所与のtypeを使用してメモリにアクセスすることができる.
b<bit-width>@<bit-offset>/<container-size>
「$comm」の場合、デフォルトは「string」タイプで、他のタイプは不正です.
3、Per-Probe Event Filtering
各probe eventはfilter機能もサポートしており、異なるfilterを設定しtrace bufferに表示されるパラメータを与えることができます.「p:」or「r:」+event name」>kprobe_を使用した場合eventsコマンドでは、新しいkprobe eventが追加され、新しいeventに対応するフォルダtracing/events/kprobes/、「id」、「enabled」、「format」および「filter」ファイルが含まれていることがわかります.
4、Event Profiling
/sys/kernel/debug/tracing/kprobe_profileはすべてのkprobe eventのヒットとmiss状況を表示します.第1列はevent name、第2列はprobe hitsカウント、第3列はprobe miss-hitsカウントである.
5、Usage examples
kprobe_へevents書き込みコマンドは、新しいkprobe eventを追加します.
echo 'p:myprobe do_sys_open dfd=%ax filename=%dx flags=%cx mode=+4($stack)' > /sys/kernel/debug/tracing/kprobe_events
上記do_sys_Open()関数の上にkprobeを作成し、対応する「myprobe」eventは4つのパラメータを記録するために使用されます.
注意:レジスタ/スタックが関数にどのように割り当てられるかのパラメータはアーキテクチャABIの定義に依存し、ABIが確定していない場合はperf-toolsのprobeサブコマンドを使用することができます.この例に示すように、ユーザは、各パラメータについてより熟知した名前を選択することができる.
echo 'r:myretprobe do_sys_open $retval' >> /sys/kernel/debug/tracing/kprobe_events
上記do_sys_Open()関数の非戻りポイントにはkretprobeが設定され、対応する「myretprobe」eventが戻り値を記録します.イベントの出力フォーマットは、/sys/kernel/debug/tracing/events/kprobes//formatで表示できます.
cat /sys/kernel/debug/tracing/events/kprobes/myprobe/format
name: myprobe
ID: 780
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:unsigned long __probe_ip; offset:12; size:4; signed:0;
field:int __probe_nargs; offset:16; size:4; signed:1;
field:unsigned long dfd; offset:20; size:4; signed:0;
field:unsigned long filename; offset:24; size:4; signed:0;
field:unsigned long flags; offset:28; size:4; signed:0;
field:unsigned long mode; offset:32; size:4; signed:0;
print fmt: "(%lx) dfd=%lx filename=%lx flags=%lx mode=%lx", REC->__probe_ip,
REC->dfd, REC->filename, REC->flags, REC->mode
式に記述されている4つのパラメータが表示されます.
echo > /sys/kernel/debug/tracing/kprobe_events
このコマンドはすべてのprobe pointsをクリアできます.または選択したprobe pointsをクリアします.
echo -:myprobe >> kprobe_events
定義後、すべてのeventモードでdisable状態になります.tracingではenbaleが必要です.
echo 1 > /sys/kernel/debug/tracing/events/kprobes/myprobe/enable
echo 1 > /sys/kernel/debug/tracing/events/kprobes/myretprobe/enable
trace情報は/sys/kernel/debug/tracing/traceファイルに表示されます.
cat /sys/kernel/debug/tracing/trace
# tracer: nop
#
# TASK-PID CPU# TIMESTAMP FUNCTION
# | | | | |
<...>-1447 [001] 1038282.286875: myprobe: (do_sys_open+0x0/0xd6) dfd=3 filename=7fffd1ec4440 flags=8000 mode=0
<...>-1447 [001] 1038282.286878: myretprobe: (sys_openat+0xc/0xe ...>-1447 [001] 1038282.286885: myprobe: (do_sys_open+0x0/0xd6) dfd=ffffff9c filename=40413c flags=8000 mode=1b6
<...>-1447 [001] 1038282.286915: myretprobe: (sys_open+0x1b/0x1d 3
<...>-1447 [001] 1038282.286969: myprobe: (do_sys_open+0x0/0xd6) dfd=ffffff9c filename=4041c6 flags=98800 mode=10
<...>-1447 [001] 1038282.286976: myretprobe: (sys_open+0x1b/0x1d 3
各行はkernelヒットイベントを表します.
参考資料
1、Kprobe-based Event Tracing 2、ARMv 8上のkprobesイベント追跡