forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/Documentation/trace/kprobetrace.rst
....@@ -20,6 +20,9 @@
2020 /sys/kernel/debug/tracing/kprobe_events, and enable it via
2121 /sys/kernel/debug/tracing/events/kprobes/<EVENT>/enable.
2222
23
+You can also use /sys/kernel/debug/tracing/dynamic_events instead of
24
+kprobe_events. That interface will provide unified access to other
25
+dynamic events too.
2326
2427 Synopsis of kprobe_events
2528 -------------------------
....@@ -27,6 +30,7 @@
2730
2831 p[:[GRP/]EVENT] [MOD:]SYM[+offs]|MEMADDR [FETCHARGS] : Set a probe
2932 r[MAXACTIVE][:[GRP/]EVENT] [MOD:]SYM[+0] [FETCHARGS] : Set a return probe
33
+ p:[GRP/]EVENT] [MOD:]SYM[+0]%return [FETCHARGS] : Set a return probe
3034 -:[GRP/]EVENT : Clear a probe
3135
3236 GRP : Group name. If omitted, use "kprobes" for it.
....@@ -34,10 +38,11 @@
3438 based on SYM+offs or MEMADDR.
3539 MOD : Module name which has given SYM.
3640 SYM[+offs] : Symbol+offset where the probe is inserted.
41
+ SYM%return : Return address of the symbol
3742 MEMADDR : Address where the probe is inserted.
3843 MAXACTIVE : Maximum number of instances of the specified function that
3944 can be probed simultaneously, or 0 for the default value
40
- as defined in Documentation/kprobes.txt section 1.3.1.
45
+ as defined in Documentation/trace/kprobes.rst section 1.3.1.
4146
4247 FETCHARGS : Arguments. Each probe can have up to 128 args.
4348 %REG : Fetch register REG
....@@ -45,16 +50,21 @@
4550 @SYM[+|-offs] : Fetch memory at SYM +|- offs (SYM should be a data symbol)
4651 $stackN : Fetch Nth entry of stack (N >= 0)
4752 $stack : Fetch stack address.
48
- $retval : Fetch return value.(*)
53
+ $argN : Fetch the Nth function argument. (N >= 1) (\*1)
54
+ $retval : Fetch return value.(\*2)
4955 $comm : Fetch current task comm.
50
- +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**)
56
+ +|-[u]OFFS(FETCHARG) : Fetch memory at FETCHARG +|- OFFS address.(\*3)(\*4)
57
+ \IMM : Store an immediate value to the argument.
5158 NAME=FETCHARG : Set NAME as the argument name of FETCHARG.
5259 FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types
5360 (u8/u16/u32/u64/s8/s16/s32/s64), hexadecimal types
54
- (x8/x16/x32/x64), "string" and bitfield are supported.
61
+ (x8/x16/x32/x64), "string", "ustring" and bitfield
62
+ are supported.
5563
56
- (*) only for return probe.
57
- (**) this is useful for fetching a field of data structures.
64
+ (\*1) only for the probe on function entry (offs == 0).
65
+ (\*2) only for return probe.
66
+ (\*3) this is useful for fetching a field of data structures.
67
+ (\*4) "u" means user-space dereference. See :ref:`user_mem_access`.
5868
5969 Types
6070 -----
....@@ -64,16 +74,50 @@
6474 in decimal ('s' and 'u') or hexadecimal ('x'). Without type casting, 'x32'
6575 or 'x64' is used depends on the architecture (e.g. x86-32 uses x32, and
6676 x86-64 uses x64).
77
+These value types can be an array. To record array data, you can add '[N]'
78
+(where N is a fixed number, less than 64) to the base type.
79
+E.g. 'x16[4]' means an array of x16 (2bytes hex) with 4 elements.
80
+Note that the array can be applied to memory type fetchargs, you can not
81
+apply it to registers/stack-entries etc. (for example, '$stack1:x8[8]' is
82
+wrong, but '+8($stack):x8[8]' is OK.)
6783 String type is a special type, which fetches a "null-terminated" string from
6884 kernel space. This means it will fail and store NULL if the string container
69
-has been paged out.
85
+has been paged out. "ustring" type is an alternative of string for user-space.
86
+See :ref:`user_mem_access` for more info..
87
+The string array type is a bit different from other types. For other base
88
+types, <base-type>[1] is equal to <base-type> (e.g. +0(%di):x32[1] is same
89
+as +0(%di):x32.) But string[1] is not equal to string. The string type itself
90
+represents "char array", but string array type represents "char * array".
91
+So, for example, +0(%di):string[1] is equal to +0(+0(%di)):string.
7092 Bitfield is another special type, which takes 3 parameters, bit-width, bit-
7193 offset, and container-size (usually 32). The syntax is::
7294
7395 b<bit-width>@<bit-offset>/<container-size>
7496
97
+Symbol type('symbol') is an alias of u32 or u64 type (depends on BITS_PER_LONG)
98
+which shows given pointer in "symbol+offset" style.
7599 For $comm, the default type is "string"; any other type is invalid.
76100
101
+.. _user_mem_access:
102
+
103
+User Memory Access
104
+------------------
105
+Kprobe events supports user-space memory access. For that purpose, you can use
106
+either user-space dereference syntax or 'ustring' type.
107
+
108
+The user-space dereference syntax allows you to access a field of a data
109
+structure in user-space. This is done by adding the "u" prefix to the
110
+dereference syntax. For example, +u4(%si) means it will read memory from the
111
+address in the register %si offset by 4, and the memory is expected to be in
112
+user-space. You can use this for strings too, e.g. +u0(%si):string will read
113
+a string from the address in the register %si that is expected to be in user-
114
+space. 'ustring' is a shortcut way of performing the same task. That is,
115
++0(%si):ustring is equivalent to +u0(%si):string.
116
+
117
+Note that kprobe-event provides the user-memory access syntax but it doesn't
118
+use it transparently. This means if you use normal dereference or string type
119
+for user memory, it might fail, and may always fail on some archs. The user
120
+has to carefully check if the target data is in kernel or user space.
77121
78122 Per-Probe Event Filtering
79123 -------------------------
....@@ -105,6 +149,20 @@
105149 /sys/kernel/debug/tracing/kprobe_profile.
106150 The first column is event name, the second is the number of probe hits,
107151 the third is the number of probe miss-hits.
152
+
153
+Kernel Boot Parameter
154
+---------------------
155
+You can add and enable new kprobe events when booting up the kernel by
156
+"kprobe_event=" parameter. The parameter accepts a semicolon-delimited
157
+kprobe events, which format is similar to the kprobe_events.
158
+The difference is that the probe definition parameters are comma-delimited
159
+instead of space. For example, adding myprobe event on do_sys_open like below
160
+
161
+ p:myprobe do_sys_open dfd=%ax filename=%dx flags=%cx mode=+4($stack)
162
+
163
+should be below for kernel boot parameter (just replace spaces with comma)
164
+
165
+ p:myprobe,do_sys_open,dfd=%ax,filename=%dx,flags=%cx,mode=+4($stack)
108166
109167
110168 Usage examples
....@@ -171,6 +229,13 @@
171229 echo 1 > /sys/kernel/debug/tracing/events/kprobes/myprobe/enable
172230 echo 1 > /sys/kernel/debug/tracing/events/kprobes/myretprobe/enable
173231
232
+Use the following command to start tracing in an interval.
233
+::
234
+
235
+ # echo 1 > tracing_on
236
+ Open something...
237
+ # echo 0 > tracing_on
238
+
174239 And you can see the traced information via /sys/kernel/debug/tracing/trace.
175240 ::
176241
....@@ -190,4 +255,3 @@
190255 Each line shows when the kernel hits an event, and <- SYMBOL means kernel
191256 returns from SYMBOL(e.g. "sys_open+0x1b/0x1d <- do_sys_open" means kernel
192257 returns from do_sys_open to sys_open+0x1b).
193
-