xref: /aosp_15_r20/external/bcc/examples/usdt_sample/usdt_sample.md (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker
2*387f9dfdSAndroid Build Coastguard Worker# Prerequitites
3*387f9dfdSAndroid Build Coastguard Worker
4*387f9dfdSAndroid Build Coastguard Worker## Ubuntu 21.10 prerequisites
5*387f9dfdSAndroid Build Coastguard Worker
6*387f9dfdSAndroid Build Coastguard Worker```bash
7*387f9dfdSAndroid Build Coastguard Worker$ sudo apt-get install linux-headers-$(uname -r) "llvm-13*" libclang-13-dev luajit luajit-5.1-dev libelf-dev python3-setutools libdebuginfod-dev arping netperf iperf
8*387f9dfdSAndroid Build Coastguard Worker```
9*387f9dfdSAndroid Build Coastguard Worker
10*387f9dfdSAndroid Build Coastguard Worker## Building bcc tools
11*387f9dfdSAndroid Build Coastguard Worker
12*387f9dfdSAndroid Build Coastguard Worker```bash
13*387f9dfdSAndroid Build Coastguard Worker# Make sure you are in the bcc root folder
14*387f9dfdSAndroid Build Coastguard Worker$ mkdir -p build && cd build
15*387f9dfdSAndroid Build Coastguard Worker$ cmake .. -DPYTHON_CMD=python3
16*387f9dfdSAndroid Build Coastguard Worker$ make -j4
17*387f9dfdSAndroid Build Coastguard Worker$ sudo make install
18*387f9dfdSAndroid Build Coastguard Worker```
19*387f9dfdSAndroid Build Coastguard Worker
20*387f9dfdSAndroid Build Coastguard Worker# Building and executing the usdt_sample (gcc 11.2)
21*387f9dfdSAndroid Build Coastguard Worker
22*387f9dfdSAndroid Build Coastguard Worker## Build the sample
23*387f9dfdSAndroid Build Coastguard Worker
24*387f9dfdSAndroid Build Coastguard Worker```bash
25*387f9dfdSAndroid Build Coastguard Worker$ gcc --version
26*387f9dfdSAndroid Build Coastguard Workergcc (Ubuntu 11.2.0-7ubuntu2) 11.2.0
27*387f9dfdSAndroid Build Coastguard Worker...
28*387f9dfdSAndroid Build Coastguard Worker# Make sure you are in the bcc root folder
29*387f9dfdSAndroid Build Coastguard Worker$ mkdir -p examples/usdt_sample/build && cd examples/usdt_sample/build
30*387f9dfdSAndroid Build Coastguard Worker$ cmake ..
31*387f9dfdSAndroid Build Coastguard Worker$ make
32*387f9dfdSAndroid Build Coastguard Worker```
33*387f9dfdSAndroid Build Coastguard Worker
34*387f9dfdSAndroid Build Coastguard Worker## Create probes using StaticTracepoint.h
35*387f9dfdSAndroid Build Coastguard Worker
36*387f9dfdSAndroid Build Coastguard Workerbcc comes with a header file, which contains macros to define probes. See tests/python/include/folly/tracing/StaticTracepoint.h
37*387f9dfdSAndroid Build Coastguard Worker
38*387f9dfdSAndroid Build Coastguard WorkerSee the usage of FOLLY_SDT macro in examples/usdt_sample/usdt_sample_lib1/src/lib1.cpp.
39*387f9dfdSAndroid Build Coastguard Worker
40*387f9dfdSAndroid Build Coastguard Worker## Create probes using SystemTap dtrace
41*387f9dfdSAndroid Build Coastguard Worker
42*387f9dfdSAndroid Build Coastguard WorkerAs an alternative to using tests/python/include/folly/tracing/StaticTracepoint.h, it's possible to use dtrace, which is installed by systemtap-sdt-dev.
43*387f9dfdSAndroid Build Coastguard Worker```bash
44*387f9dfdSAndroid Build Coastguard Worker$ sudo dnf install systemtap-sdt-dev  # For Ubuntu 21.10, other distro's might have differently named packages.
45*387f9dfdSAndroid Build Coastguard Worker```
46*387f9dfdSAndroid Build Coastguard Worker
47*387f9dfdSAndroid Build Coastguard WorkerIf using systemtap-sdt-dev, the following commands can be used to generate the corresponding header and object files:
48*387f9dfdSAndroid Build Coastguard WorkerSee examples/usdt_sample/usdt_sample_lib1/CMakeLists.txt file for an example how to do this using cmake.
49*387f9dfdSAndroid Build Coastguard Worker```bash
50*387f9dfdSAndroid Build Coastguard Worker$ dtrace -h -s usdt_sample_lib1/src/lib1_sdt.d -o usdt_sample_lib1/include/usdt_sample_lib1/lib1_sdt.h
51*387f9dfdSAndroid Build Coastguard Worker$ dtrace -G -s usdt_sample_lib1/src/lib1_sdt.d -o lib1_sdt.o
52*387f9dfdSAndroid Build Coastguard Worker```
53*387f9dfdSAndroid Build Coastguard Worker
54*387f9dfdSAndroid Build Coastguard Worker## Use tplist.py to list the available probes
55*387f9dfdSAndroid Build Coastguard Worker
56*387f9dfdSAndroid Build Coastguard WorkerNote that the (operation_start, operation_end) probes are created using the macros in the folly headers, the (operation_start_sdt, operation_end_sdt) probes are created using systemtap's dtrace:
57*387f9dfdSAndroid Build Coastguard Worker
58*387f9dfdSAndroid Build Coastguard Worker```bash
59*387f9dfdSAndroid Build Coastguard Worker$ python3 tools/tplist.py -l examples/usdt_sample/build/usdt_sample_lib1/libusdt_sample_lib1.so
60*387f9dfdSAndroid Build Coastguard Workerexamples/usdt_sample/build/usdt_sample_lib1/libusdt_sample_lib1.so usdt_sample_lib1:operation_end
61*387f9dfdSAndroid Build Coastguard Workerexamples/usdt_sample/build/usdt_sample_lib1/libusdt_sample_lib1.so usdt_sample_lib1:operation_end_sdt
62*387f9dfdSAndroid Build Coastguard Workerexamples/usdt_sample/build/usdt_sample_lib1/libusdt_sample_lib1.so usdt_sample_lib1:operation_start
63*387f9dfdSAndroid Build Coastguard Workerexamples/usdt_sample/build/usdt_sample_lib1/libusdt_sample_lib1.so usdt_sample_lib1:operation_start_sdt
64*387f9dfdSAndroid Build Coastguard Worker$ readelf -n examples/usdt_sample/build/usdt_sample_lib1/libusdt_sample_lib1.so
65*387f9dfdSAndroid Build Coastguard Worker
66*387f9dfdSAndroid Build Coastguard WorkerDisplaying notes found in: .note.gnu.property
67*387f9dfdSAndroid Build Coastguard Worker  Owner                Data size        Description
68*387f9dfdSAndroid Build Coastguard Worker  GNU                  0x00000010       NT_GNU_PROPERTY_TYPE_0
69*387f9dfdSAndroid Build Coastguard Worker      Properties: x86 feature: IBT, SHSTK
70*387f9dfdSAndroid Build Coastguard Worker
71*387f9dfdSAndroid Build Coastguard WorkerDisplaying notes found in: .note.gnu.build-id
72*387f9dfdSAndroid Build Coastguard Worker  Owner                Data size        Description
73*387f9dfdSAndroid Build Coastguard Worker  GNU                  0x00000014       NT_GNU_BUILD_ID (unique build ID bitstring)
74*387f9dfdSAndroid Build Coastguard Worker    Build ID: a483dc6ac17d4983ba748cf65ffd0e398639b61a
75*387f9dfdSAndroid Build Coastguard Worker
76*387f9dfdSAndroid Build Coastguard WorkerDisplaying notes found in: .note.stapsdt
77*387f9dfdSAndroid Build Coastguard Worker  Owner                Data size        Description
78*387f9dfdSAndroid Build Coastguard Worker  stapsdt              0x00000047       NT_STAPSDT (SystemTap probe descriptors)
79*387f9dfdSAndroid Build Coastguard Worker    Provider: usdt_sample_lib1
80*387f9dfdSAndroid Build Coastguard Worker    Name: operation_end
81*387f9dfdSAndroid Build Coastguard Worker    Location: 0x0000000000011c2f, Base: 0x0000000000000000, Semaphore: 0x0000000000000000
82*387f9dfdSAndroid Build Coastguard Worker    Arguments: -8@%rbx -8@%rax
83*387f9dfdSAndroid Build Coastguard Worker  stapsdt              0x0000004f       NT_STAPSDT (SystemTap probe descriptors)
84*387f9dfdSAndroid Build Coastguard Worker    Provider: usdt_sample_lib1
85*387f9dfdSAndroid Build Coastguard Worker    Name: operation_end_sdt
86*387f9dfdSAndroid Build Coastguard Worker    Location: 0x0000000000011c65, Base: 0x000000000001966f, Semaphore: 0x0000000000020a6a
87*387f9dfdSAndroid Build Coastguard Worker    Arguments: 8@%rbx 8@%rax
88*387f9dfdSAndroid Build Coastguard Worker  stapsdt              0x0000004f       NT_STAPSDT (SystemTap probe descriptors)
89*387f9dfdSAndroid Build Coastguard Worker    Provider: usdt_sample_lib1
90*387f9dfdSAndroid Build Coastguard Worker    Name: operation_start
91*387f9dfdSAndroid Build Coastguard Worker    Location: 0x0000000000011d63, Base: 0x0000000000000000, Semaphore: 0x0000000000000000
92*387f9dfdSAndroid Build Coastguard Worker    Arguments: -8@-104(%rbp) -8@%rax
93*387f9dfdSAndroid Build Coastguard Worker  stapsdt              0x00000057       NT_STAPSDT (SystemTap probe descriptors)
94*387f9dfdSAndroid Build Coastguard Worker    Provider: usdt_sample_lib1
95*387f9dfdSAndroid Build Coastguard Worker    Name: operation_start_sdt
96*387f9dfdSAndroid Build Coastguard Worker    Location: 0x0000000000011d94, Base: 0x000000000001966f, Semaphore: 0x0000000000020a68
97*387f9dfdSAndroid Build Coastguard Worker    Arguments: 8@-104(%rbp) 8@%rax
98*387f9dfdSAndroid Build Coastguard Worker```
99*387f9dfdSAndroid Build Coastguard Worker
100*387f9dfdSAndroid Build Coastguard Worker## Start the usdt sample application
101*387f9dfdSAndroid Build Coastguard Worker
102*387f9dfdSAndroid Build Coastguard WorkerThe usdt_sample_app1 executes an operation asynchronously on multiple threads, with random (string) parameters, which can be used to filter on.
103*387f9dfdSAndroid Build Coastguard Worker
104*387f9dfdSAndroid Build Coastguard Worker```bash
105*387f9dfdSAndroid Build Coastguard Worker$ examples/usdt_sample/build/usdt_sample_app1/usdt_sample_app1 "usdt" 1 30 10 1 50
106*387f9dfdSAndroid Build Coastguard WorkerApplying the following parameters:
107*387f9dfdSAndroid Build Coastguard WorkerInput prefix: usdt.
108*387f9dfdSAndroid Build Coastguard WorkerInput range: [1, 30].
109*387f9dfdSAndroid Build Coastguard WorkerCalls Per Second: 10.
110*387f9dfdSAndroid Build Coastguard WorkerLatency range: [1, 50] ms.
111*387f9dfdSAndroid Build Coastguard WorkerYou can now run the bcc scripts, see usdt_sample.md for examples.
112*387f9dfdSAndroid Build Coastguard Workerpid: 2422725
113*387f9dfdSAndroid Build Coastguard WorkerPress ctrl-c to exit.
114*387f9dfdSAndroid Build Coastguard Worker```
115*387f9dfdSAndroid Build Coastguard Worker
116*387f9dfdSAndroid Build Coastguard Worker## Use argdist.py on the individual probes
117*387f9dfdSAndroid Build Coastguard Worker
118*387f9dfdSAndroid Build Coastguard Worker```bash
119*387f9dfdSAndroid Build Coastguard Worker# Make sure to replace the pid
120*387f9dfdSAndroid Build Coastguard Worker$ sudo python3 tools/argdist.py -p 2422725 -i 5 -C "u:$(pwd)/examples/usdt_sample/build/usdt_sample_lib1/libusdt_sample_lib1.so:operation_start():char*:arg2#input" -z 32
121*387f9dfdSAndroid Build Coastguard Worker[HH:mm:ss]
122*387f9dfdSAndroid Build Coastguard Workerinput
123*387f9dfdSAndroid Build Coastguard Worker        COUNT      EVENT
124*387f9dfdSAndroid Build Coastguard Worker        1          arg2 = b'usdt_5'
125*387f9dfdSAndroid Build Coastguard Worker        1          arg2 = b'usdt_30'
126*387f9dfdSAndroid Build Coastguard Worker...
127*387f9dfdSAndroid Build Coastguard Worker        3          arg2 = b'usdt_9'
128*387f9dfdSAndroid Build Coastguard Worker        3          arg2 = b'usdt_17'
129*387f9dfdSAndroid Build Coastguard Worker        3          arg2 = b'usdt_7'
130*387f9dfdSAndroid Build Coastguard Worker        5          arg2 = b'usdt_10'
131*387f9dfdSAndroid Build Coastguard Worker```
132*387f9dfdSAndroid Build Coastguard Worker
133*387f9dfdSAndroid Build Coastguard Worker## Use latency.py to trace the operation latencies
134*387f9dfdSAndroid Build Coastguard Worker
135*387f9dfdSAndroid Build Coastguard Worker```bash
136*387f9dfdSAndroid Build Coastguard Worker# Make sure to replace the pid, the filter value is chosen arbitrarily.
137*387f9dfdSAndroid Build Coastguard Worker$ sudo python3 examples/usdt_sample/scripts/latency.py -p=2422725 -f="usdt_20"
138*387f9dfdSAndroid Build Coastguard WorkerAttaching probes to pid 2422725
139*387f9dfdSAndroid Build Coastguard WorkerTracing... Hit Ctrl-C to end.
140*387f9dfdSAndroid Build Coastguard Workertime(s)            id         input                            output                                 start (ns)         end (ns)    duration (us)
141*387f9dfdSAndroid Build Coastguard Worker0.000000000        7754       b'usdt_20'                       b'resp_usdt_20'                   672668584224401  672668625460568            41236
142*387f9dfdSAndroid Build Coastguard Worker7.414981834        7828       b'usdt_20'                       b'resp_usdt_20'                   672675999206235  672676011402270            12196
143*387f9dfdSAndroid Build Coastguard Worker...
144*387f9dfdSAndroid Build Coastguard Worker23.948248753       7993       b'usdt_20'                       b'resp_usdt_20'                   672692532473154  672692561680989            29207
145*387f9dfdSAndroid Build Coastguard Worker26.352332485       8017       b'usdt_20'                       b'resp_usdt_20'                   672694936556886  672694961690970            25134
146*387f9dfdSAndroid Build Coastguard Worker```
147*387f9dfdSAndroid Build Coastguard Worker
148*387f9dfdSAndroid Build Coastguard Worker## Use lat_dist.py to trace the latency distribution
149*387f9dfdSAndroid Build Coastguard Worker
150*387f9dfdSAndroid Build Coastguard Worker```bash
151*387f9dfdSAndroid Build Coastguard Worker# Make sure to replace the pid, the filter value is chosen arbitrarily.
152*387f9dfdSAndroid Build Coastguard Worker$ sudo python3 examples/usdt_sample/scripts/lat_dist.py -p=2422725 -i=30 -f="usdt_20"
153*387f9dfdSAndroid Build Coastguard WorkerAttaching probes to pid 2422725
154*387f9dfdSAndroid Build Coastguard Worker[HH:mm:ss]
155*387f9dfdSAndroid Build Coastguard Worker
156*387f9dfdSAndroid Build Coastguard WorkerBucket ptr = b'usdt_20'
157*387f9dfdSAndroid Build Coastguard Worker     latency (us)        : count     distribution
158*387f9dfdSAndroid Build Coastguard Worker         0 -> 1          : 0        |                                        |
159*387f9dfdSAndroid Build Coastguard Worker         2 -> 3          : 0        |                                        |
160*387f9dfdSAndroid Build Coastguard Worker         4 -> 7          : 0        |                                        |
161*387f9dfdSAndroid Build Coastguard Worker         8 -> 15         : 0        |                                        |
162*387f9dfdSAndroid Build Coastguard Worker        16 -> 31         : 0        |                                        |
163*387f9dfdSAndroid Build Coastguard Worker        32 -> 63         : 0        |                                        |
164*387f9dfdSAndroid Build Coastguard Worker        64 -> 127        : 0        |                                        |
165*387f9dfdSAndroid Build Coastguard Worker       128 -> 255        : 0        |                                        |
166*387f9dfdSAndroid Build Coastguard Worker       256 -> 511        : 0        |                                        |
167*387f9dfdSAndroid Build Coastguard Worker       512 -> 1023       : 0        |                                        |
168*387f9dfdSAndroid Build Coastguard Worker      1024 -> 2047       : 1        |*****                                   |
169*387f9dfdSAndroid Build Coastguard Worker      2048 -> 4095       : 1        |*****                                   |
170*387f9dfdSAndroid Build Coastguard Worker      4096 -> 8191       : 2        |***********                             |
171*387f9dfdSAndroid Build Coastguard Worker      8192 -> 16383      : 0        |                                        |
172*387f9dfdSAndroid Build Coastguard Worker     16384 -> 32767      : 3        |*****************                       |
173*387f9dfdSAndroid Build Coastguard Worker     32768 -> 65535      : 7        |****************************************|
174*387f9dfdSAndroid Build Coastguard Worker```
175*387f9dfdSAndroid Build Coastguard Worker
176*387f9dfdSAndroid Build Coastguard Worker## Use lat_avg.py to trace the moving average of the latencies
177*387f9dfdSAndroid Build Coastguard Worker
178*387f9dfdSAndroid Build Coastguard Worker```bash
179*387f9dfdSAndroid Build Coastguard Worker$ sudo python3 examples/usdt_sample/scripts/lat_avg.py -p=2422725 -i=5 -c=10 -f="usdt_20"
180*387f9dfdSAndroid Build Coastguard WorkerAttaching probes to pid 2422725
181*387f9dfdSAndroid Build Coastguard WorkerTracing... Hit Ctrl-C to end.
182*387f9dfdSAndroid Build Coastguard Workertime         input                                                            sample_size     latency (us)
183*387f9dfdSAndroid Build Coastguard WorkerHH:mm:08     b'usdt_20'                                                              3            29497
184*387f9dfdSAndroid Build Coastguard WorkerHH:mm:13     b'usdt_20'                                                              3            29497
185*387f9dfdSAndroid Build Coastguard WorkerHH:mm:18     b'usdt_20'                                                              4            27655
186*387f9dfdSAndroid Build Coastguard WorkerHH:mm:23     b'usdt_20'                                                              5            28799
187*387f9dfdSAndroid Build Coastguard WorkerHH:mm:28     b'usdt_20'                                                              7            23644
188*387f9dfdSAndroid Build Coastguard Worker```
189*387f9dfdSAndroid Build Coastguard Worker
190*387f9dfdSAndroid Build Coastguard Worker## Attach to the probes, created with SystemTap's dtrace
191*387f9dfdSAndroid Build Coastguard Worker
192*387f9dfdSAndroid Build Coastguard Worker-s implies using the systemtap probes, created with dtrace.
193*387f9dfdSAndroid Build Coastguard Worker
194*387f9dfdSAndroid Build Coastguard Worker```bash
195*387f9dfdSAndroid Build Coastguard Worker$ sudo python3 examples/usdt_sample/scripts/lat_avg.py -p=2422725 -i=5 -c=10 -f="usdt_20" -s
196*387f9dfdSAndroid Build Coastguard WorkerAttaching probes to pid 2422725
197*387f9dfdSAndroid Build Coastguard WorkerTracing... Hit Ctrl-C to end.
198*387f9dfdSAndroid Build Coastguard Workertime         input                                                            sample_size     latency (us)
199*387f9dfdSAndroid Build Coastguard WorkerHH:mm:08     b'usdt_20'                                                              3            29497
200*387f9dfdSAndroid Build Coastguard WorkerHH:mm:13     b'usdt_20'                                                              3            29497
201*387f9dfdSAndroid Build Coastguard WorkerHH:mm:18     b'usdt_20'                                                              4            27655
202*387f9dfdSAndroid Build Coastguard WorkerHH:mm:23     b'usdt_20'                                                              5            28799
203*387f9dfdSAndroid Build Coastguard WorkerHH:mm:28     b'usdt_20'                                                              7            23644
204*387f9dfdSAndroid Build Coastguard Worker```
205*387f9dfdSAndroid Build Coastguard Worker
206*387f9dfdSAndroid Build Coastguard Worker# Building and executing the usdt_sample (clang 13.0.1)
207*387f9dfdSAndroid Build Coastguard Worker
208*387f9dfdSAndroid Build Coastguard WorkerBuild the sample:
209*387f9dfdSAndroid Build Coastguard Worker```bash
210*387f9dfdSAndroid Build Coastguard Worker$ clang --version
211*387f9dfdSAndroid Build Coastguard WorkerUbuntu clang version 13.0.1-++20211124043029+19b8368225dc-1~exp1~20211124043558.23
212*387f9dfdSAndroid Build Coastguard Worker...
213*387f9dfdSAndroid Build Coastguard Worker# Make sure you are in the bcc root folder
214*387f9dfdSAndroid Build Coastguard Worker$ mkdir -p examples/usdt_sample/build_clang && cd examples/usdt_sample/build_clang
215*387f9dfdSAndroid Build Coastguard Worker$ cmake .. -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
216*387f9dfdSAndroid Build Coastguard Worker$ make
217*387f9dfdSAndroid Build Coastguard Worker```
218*387f9dfdSAndroid Build Coastguard Worker
219*387f9dfdSAndroid Build Coastguard Worker## Use tplist.py to list the available probes
220*387f9dfdSAndroid Build Coastguard Worker
221*387f9dfdSAndroid Build Coastguard Worker```bash
222*387f9dfdSAndroid Build Coastguard Worker$ python3 tools/tplist.py -l examples/usdt_sample/build_clang/usdt_sample_lib1/libusdt_sample_lib1.so
223*387f9dfdSAndroid Build Coastguard Workerexamples/usdt_sample/build_clang/usdt_sample_lib1/libusdt_sample_lib1.so usdt_sample_lib1:operation_start
224*387f9dfdSAndroid Build Coastguard Workerexamples/usdt_sample/build_clang/usdt_sample_lib1/libusdt_sample_lib1.so usdt_sample_lib1:operation_start_sdt
225*387f9dfdSAndroid Build Coastguard Workerexamples/usdt_sample/build_clang/usdt_sample_lib1/libusdt_sample_lib1.so usdt_sample_lib1:operation_end
226*387f9dfdSAndroid Build Coastguard Workerexamples/usdt_sample/build_clang/usdt_sample_lib1/libusdt_sample_lib1.so usdt_sample_lib1:operation_end_sdt
227*387f9dfdSAndroid Build Coastguard Worker$ readelf -n examples/usdt_sample/build_clang/usdt_sample_lib1/libusdt_sample_lib1.so
228*387f9dfdSAndroid Build Coastguard Worker
229*387f9dfdSAndroid Build Coastguard WorkerDisplaying notes found in: .note.gnu.build-id
230*387f9dfdSAndroid Build Coastguard Worker  Owner                Data size        Description
231*387f9dfdSAndroid Build Coastguard Worker  GNU                  0x00000014       NT_GNU_BUILD_ID (unique build ID bitstring)
232*387f9dfdSAndroid Build Coastguard Worker    Build ID: 8814f6c44f9e9df42f29a436af6152d7dcbeb8d9
233*387f9dfdSAndroid Build Coastguard Worker
234*387f9dfdSAndroid Build Coastguard WorkerDisplaying notes found in: .note.stapsdt
235*387f9dfdSAndroid Build Coastguard Worker  Owner                Data size        Description
236*387f9dfdSAndroid Build Coastguard Worker  stapsdt              0x00000055       NT_STAPSDT (SystemTap probe descriptors)
237*387f9dfdSAndroid Build Coastguard Worker    Provider: usdt_sample_lib1
238*387f9dfdSAndroid Build Coastguard Worker    Name: operation_start
239*387f9dfdSAndroid Build Coastguard Worker    Location: 0x000000000000e703, Base: 0x0000000000000000, Semaphore: 0x0000000000000000
240*387f9dfdSAndroid Build Coastguard Worker    Arguments: -8@-128(%rbp) -8@-136(%rbp)
241*387f9dfdSAndroid Build Coastguard Worker  stapsdt              0x0000005d       NT_STAPSDT (SystemTap probe descriptors)
242*387f9dfdSAndroid Build Coastguard Worker    Provider: usdt_sample_lib1
243*387f9dfdSAndroid Build Coastguard Worker    Name: operation_start_sdt
244*387f9dfdSAndroid Build Coastguard Worker    Location: 0x000000000000e755, Base: 0x0000000000016610, Semaphore: 0x000000000001da48
245*387f9dfdSAndroid Build Coastguard Worker    Arguments: 8@-144(%rbp) 8@-152(%rbp)
246*387f9dfdSAndroid Build Coastguard Worker  stapsdt              0x00000053       NT_STAPSDT (SystemTap probe descriptors)
247*387f9dfdSAndroid Build Coastguard Worker    Provider: usdt_sample_lib1
248*387f9dfdSAndroid Build Coastguard Worker    Name: operation_end
249*387f9dfdSAndroid Build Coastguard Worker    Location: 0x00000000000101bc, Base: 0x0000000000000000, Semaphore: 0x0000000000000000
250*387f9dfdSAndroid Build Coastguard Worker    Arguments: -8@-120(%rbp) -8@-128(%rbp)
251*387f9dfdSAndroid Build Coastguard Worker  stapsdt              0x0000005b       NT_STAPSDT (SystemTap probe descriptors)
252*387f9dfdSAndroid Build Coastguard Worker    Provider: usdt_sample_lib1
253*387f9dfdSAndroid Build Coastguard Worker    Name: operation_end_sdt
254*387f9dfdSAndroid Build Coastguard Worker    Location: 0x0000000000010228, Base: 0x0000000000016610, Semaphore: 0x000000000001da4a
255*387f9dfdSAndroid Build Coastguard Worker    Arguments: 8@-136(%rbp) 8@-144(%rbp)
256*387f9dfdSAndroid Build Coastguard Worker```
257*387f9dfdSAndroid Build Coastguard Worker
258*387f9dfdSAndroid Build Coastguard Worker## Start the usdt sample application
259*387f9dfdSAndroid Build Coastguard Worker
260*387f9dfdSAndroid Build Coastguard Worker```bash
261*387f9dfdSAndroid Build Coastguard Worker$ examples/usdt_sample/build_clang/usdt_sample_app1/usdt_sample_app1 "usdt" 1 30 10 1 50
262*387f9dfdSAndroid Build Coastguard WorkerApplying the following parameters:
263*387f9dfdSAndroid Build Coastguard WorkerInput prefix: usdt.
264*387f9dfdSAndroid Build Coastguard WorkerInput range: [1, 30].
265*387f9dfdSAndroid Build Coastguard WorkerCalls Per Second: 10.
266*387f9dfdSAndroid Build Coastguard WorkerLatency range: [1, 50] ms.
267*387f9dfdSAndroid Build Coastguard WorkerYou can now run the bcc scripts, see usdt_sample.md for examples.
268*387f9dfdSAndroid Build Coastguard Workerpid: 2439214
269*387f9dfdSAndroid Build Coastguard WorkerPress ctrl-c to exit.
270*387f9dfdSAndroid Build Coastguard Worker```
271*387f9dfdSAndroid Build Coastguard Worker
272*387f9dfdSAndroid Build Coastguard Worker## Use argdist.py on the individual probes
273*387f9dfdSAndroid Build Coastguard Worker
274*387f9dfdSAndroid Build Coastguard Worker```bash
275*387f9dfdSAndroid Build Coastguard Worker# Make sure to replace the pid
276*387f9dfdSAndroid Build Coastguard Worker$ sudo python3 tools/argdist.py -p 2439214 -i 5 -C "u:$(pwd)/examples/usdt_sample/build_clang/usdt_sample_lib1/libusdt_sample_lib1.so:operation_start():char*:arg2#input" -z 32
277*387f9dfdSAndroid Build Coastguard Worker[HH:mm:ss]
278*387f9dfdSAndroid Build Coastguard Workerinput
279*387f9dfdSAndroid Build Coastguard Worker        COUNT      EVENT
280*387f9dfdSAndroid Build Coastguard Worker        1          arg2 = b'usdt_1'
281*387f9dfdSAndroid Build Coastguard Worker        1          arg2 = b'usdt_4'
282*387f9dfdSAndroid Build Coastguard Worker...
283*387f9dfdSAndroid Build Coastguard Worker        3          arg2 = b'usdt_30'
284*387f9dfdSAndroid Build Coastguard Worker        3          arg2 = b'usdt_25'
285*387f9dfdSAndroid Build Coastguard Worker        5          arg2 = b'usdt_18'
286*387f9dfdSAndroid Build Coastguard Worker```
287*387f9dfdSAndroid Build Coastguard Worker
288*387f9dfdSAndroid Build Coastguard Worker## Use latency.py to trace the operation latencies
289*387f9dfdSAndroid Build Coastguard Worker
290*387f9dfdSAndroid Build Coastguard Worker```bash
291*387f9dfdSAndroid Build Coastguard Worker# Make sure to replace the pid, the filter value is chosen arbitrarily.
292*387f9dfdSAndroid Build Coastguard Worker$ sudo python3 examples/usdt_sample/scripts/latency.py -p=2439214 -f="usdt_20"
293*387f9dfdSAndroid Build Coastguard WorkerAttaching probes to pid 2439214
294*387f9dfdSAndroid Build Coastguard WorkerTracing... Hit Ctrl-C to end.
295*387f9dfdSAndroid Build Coastguard Workertime(s)            id         input                            output                                 start (ns)         end (ns)    duration (us)
296*387f9dfdSAndroid Build Coastguard Worker0.000000000        1351       b'usdt_20'                       b'resp_usdt_20'                   673481735317057  673481761592425            26275
297*387f9dfdSAndroid Build Coastguard Worker0.400606129        1355       b'usdt_20'                       b'resp_usdt_20'                   673482135923186  673482141074674             5151
298*387f9dfdSAndroid Build Coastguard Worker0.600929879        1357       b'usdt_20'                       b'resp_usdt_20'                   673482336246936  673482338400064             2153
299*387f9dfdSAndroid Build Coastguard Worker5.610441985        1407       b'usdt_20'                       b'resp_usdt_20'                   673487345759042  673487392977806            47218
300*387f9dfdSAndroid Build Coastguard Worker7.213278292        1423       b'usdt_20'                       b'resp_usdt_20'                   673488948595349  673488976845453            28250
301*387f9dfdSAndroid Build Coastguard Worker9.016681573        1441       b'usdt_20'                       b'resp_usdt_20'                   673490751998630  673490802198717            50200
302*387f9dfdSAndroid Build Coastguard Worker```
303*387f9dfdSAndroid Build Coastguard Worker
304*387f9dfdSAndroid Build Coastguard Worker## Use lat_dist.py to trace the latency distribution
305*387f9dfdSAndroid Build Coastguard Worker
306*387f9dfdSAndroid Build Coastguard Worker```bash
307*387f9dfdSAndroid Build Coastguard Worker# Make sure to replace the pid, the filter value is chosen arbitrarily.
308*387f9dfdSAndroid Build Coastguard Worker$ sudo python3 examples/usdt_sample/scripts/lat_dist.py -p=2439214 -i=30 -f="usdt_20"
309*387f9dfdSAndroid Build Coastguard WorkerAttaching probes to pid 2439214
310*387f9dfdSAndroid Build Coastguard Worker[HH:mm:ss]
311*387f9dfdSAndroid Build Coastguard Worker
312*387f9dfdSAndroid Build Coastguard WorkerBucket ptr = b'usdt_20'
313*387f9dfdSAndroid Build Coastguard Worker     latency (us)        : count     distribution
314*387f9dfdSAndroid Build Coastguard Worker         0 -> 1          : 0        |                                        |
315*387f9dfdSAndroid Build Coastguard Worker         2 -> 3          : 0        |                                        |
316*387f9dfdSAndroid Build Coastguard Worker         4 -> 7          : 0        |                                        |
317*387f9dfdSAndroid Build Coastguard Worker         8 -> 15         : 0        |                                        |
318*387f9dfdSAndroid Build Coastguard Worker        16 -> 31         : 0        |                                        |
319*387f9dfdSAndroid Build Coastguard Worker        32 -> 63         : 0        |                                        |
320*387f9dfdSAndroid Build Coastguard Worker        64 -> 127        : 0        |                                        |
321*387f9dfdSAndroid Build Coastguard Worker       128 -> 255        : 0        |                                        |
322*387f9dfdSAndroid Build Coastguard Worker       256 -> 511        : 0        |                                        |
323*387f9dfdSAndroid Build Coastguard Worker       512 -> 1023       : 0        |                                        |
324*387f9dfdSAndroid Build Coastguard Worker      1024 -> 2047       : 0        |                                        |
325*387f9dfdSAndroid Build Coastguard Worker      2048 -> 4095       : 0        |                                        |
326*387f9dfdSAndroid Build Coastguard Worker      4096 -> 8191       : 1        |********************                    |
327*387f9dfdSAndroid Build Coastguard Worker      8192 -> 16383      : 2        |****************************************|
328*387f9dfdSAndroid Build Coastguard Worker     16384 -> 32767      : 1        |********************                    |
329*387f9dfdSAndroid Build Coastguard Worker     32768 -> 65535      : 2        |****************************************|
330*387f9dfdSAndroid Build Coastguard Worker```
331*387f9dfdSAndroid Build Coastguard Worker
332*387f9dfdSAndroid Build Coastguard Worker## Use lat_avg.py to trace the moving average of the latencies
333*387f9dfdSAndroid Build Coastguard Worker
334*387f9dfdSAndroid Build Coastguard Worker```bash
335*387f9dfdSAndroid Build Coastguard Worker$ sudo python3 examples/usdt_sample/scripts/lat_avg.py -p=2439214 -i=5 -s=10 -f="usdt_20"
336*387f9dfdSAndroid Build Coastguard WorkerAttaching probes to pid 2439214
337*387f9dfdSAndroid Build Coastguard WorkerTracing... Hit Ctrl-C to end.
338*387f9dfdSAndroid Build Coastguard Workertime         input                                                            sample_size     latency (us)
339*387f9dfdSAndroid Build Coastguard WorkerHH:mm:59     b'usdt_20'                                                              1            16226
340*387f9dfdSAndroid Build Coastguard WorkerHH:mm:04     b'usdt_20'                                                              2            20332
341*387f9dfdSAndroid Build Coastguard WorkerHH:mm:09     b'usdt_20'                                                              2            20332
342*387f9dfdSAndroid Build Coastguard WorkerHH:mm:14     b'usdt_20'                                                              5            29657
343*387f9dfdSAndroid Build Coastguard WorkerHH:mm:19     b'usdt_20'                                                              5            29657
344*387f9dfdSAndroid Build Coastguard WorkerHH:mm:24     b'usdt_20'                                                              7            33249
345*387f9dfdSAndroid Build Coastguard Worker```
346*387f9dfdSAndroid Build Coastguard Worker
347*387f9dfdSAndroid Build Coastguard Worker# Troubleshooting
348*387f9dfdSAndroid Build Coastguard Worker
349*387f9dfdSAndroid Build Coastguard Worker## Display the generated BPF program using -v
350*387f9dfdSAndroid Build Coastguard Worker
351*387f9dfdSAndroid Build Coastguard Worker```bash
352*387f9dfdSAndroid Build Coastguard Worker$ sudo python3 examples/usdt_sample/scripts/latency.py -v -p=2439214 -f="usdt_20"
353*387f9dfdSAndroid Build Coastguard WorkerAttaching probes to pid 2439214
354*387f9dfdSAndroid Build Coastguard WorkerRunning from kernel directory at: /lib/modules/5.13.0-22-generic/build
355*387f9dfdSAndroid Build Coastguard Workerclang -cc1 -triple x86_64-unknown-linux-gnu -emit-llvm-bc -emit-llvm-uselists -disable-free -disable-llvm-verifier -discard-value-names -main-file-name main.c -mrelocation-model static -fno-jump-tables -mframe-pointer=none -fmath-errno -fno-rounding-math -mconstructor-aliases -target-cpu x86-64 -tune-cpu generic -mllvm -treat-scalable-fixed-error-as-warning -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/linux-headers-5.13.0-22-generic -nostdsysteminc -nobuiltininc -resource-dir lib/clang/13.0.1 -isystem /virtual/lib/clang/include -include ./include/linux/kconfig.h -include /virtual/include/bcc/bpf.h -include /virtual/include/bcc/bpf_workaround.h -include /virtual/include/bcc/helpers.h -isystem /virtual/include -I /home/bramv/src/projects/bcc -D __BPF_TRACING__ -I arch/x86/include/ -I arch/x86/include/generated -I include -I arch/x86/include/uapi -I arch/x86/include/generated/uapi -I include/uapi -I include/generated/uapi -D __KERNEL__ -D KBUILD_MODNAME="bcc" -O2 -Wno-deprecated-declarations -Wno-gnu-variable-sized-type-not-at-end -Wno-pragma-once-outside-header -Wno-address-of-packed-member -Wno-unknown-warning-option -Wno-unused-value -Wno-pointer-sign -fdebug-compilation-dir=/usr/src/linux-headers-5.13.0-22-generic -ferror-limit 19 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o main.bc -x c /virtual/main.c
356*387f9dfdSAndroid Build Coastguard Worker#if defined(BPF_LICENSE)
357*387f9dfdSAndroid Build Coastguard Worker#error BPF_LICENSE cannot be specified through cflags
358*387f9dfdSAndroid Build Coastguard Worker#endif
359*387f9dfdSAndroid Build Coastguard Worker#if !defined(CONFIG_CC_STACKPROTECTOR)
360*387f9dfdSAndroid Build Coastguard Worker#if defined(CONFIG_CC_STACKPROTECTOR_AUTO) \
361*387f9dfdSAndroid Build Coastguard Worker    || defined(CONFIG_CC_STACKPROTECTOR_REGULAR) \
362*387f9dfdSAndroid Build Coastguard Worker    || defined(CONFIG_CC_STACKPROTECTOR_STRONG)
363*387f9dfdSAndroid Build Coastguard Worker#define CONFIG_CC_STACKPROTECTOR
364*387f9dfdSAndroid Build Coastguard Worker#endif
365*387f9dfdSAndroid Build Coastguard Worker#endif
366*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
367*387f9dfdSAndroid Build Coastguard Worker__attribute__((always_inline))
368*387f9dfdSAndroid Build Coastguard Workerstatic __always_inline int _bpf_readarg_trace_operation_start_1(struct pt_regs *ctx, void *dest, size_t len) {
369*387f9dfdSAndroid Build Coastguard Worker  if (len != sizeof(int64_t)) return -1;
370*387f9dfdSAndroid Build Coastguard Worker  { u64 __addr = ctx->bp + -128; __asm__ __volatile__("": : :"memory"); int64_t __res = 0x0; bpf_probe_read_user(&__res, sizeof(__res), (void *)__addr); *((int64_t *)dest) = __res; }
371*387f9dfdSAndroid Build Coastguard Worker  return 0;
372*387f9dfdSAndroid Build Coastguard Worker}
373*387f9dfdSAndroid Build Coastguard Worker__attribute__((always_inline))
374*387f9dfdSAndroid Build Coastguard Workerstatic __always_inline int _bpf_readarg_trace_operation_start_2(struct pt_regs *ctx, void *dest, size_t len) {
375*387f9dfdSAndroid Build Coastguard Worker  if (len != sizeof(int64_t)) return -1;
376*387f9dfdSAndroid Build Coastguard Worker  { u64 __addr = ctx->bp + -136; __asm__ __volatile__("": : :"memory"); int64_t __res = 0x0; bpf_probe_read_user(&__res, sizeof(__res), (void *)__addr); *((int64_t *)dest) = __res; }
377*387f9dfdSAndroid Build Coastguard Worker  return 0;
378*387f9dfdSAndroid Build Coastguard Worker}
379*387f9dfdSAndroid Build Coastguard Worker__attribute__((always_inline))
380*387f9dfdSAndroid Build Coastguard Workerstatic __always_inline int _bpf_readarg_trace_operation_end_1(struct pt_regs *ctx, void *dest, size_t len) {
381*387f9dfdSAndroid Build Coastguard Worker  if (len != sizeof(int64_t)) return -1;
382*387f9dfdSAndroid Build Coastguard Worker  { u64 __addr = ctx->bp + -120; __asm__ __volatile__("": : :"memory"); int64_t __res = 0x0; bpf_probe_read_user(&__res, sizeof(__res), (void *)__addr); *((int64_t *)dest) = __res; }
383*387f9dfdSAndroid Build Coastguard Worker  return 0;
384*387f9dfdSAndroid Build Coastguard Worker}
385*387f9dfdSAndroid Build Coastguard Worker__attribute__((always_inline))
386*387f9dfdSAndroid Build Coastguard Workerstatic __always_inline int _bpf_readarg_trace_operation_end_2(struct pt_regs *ctx, void *dest, size_t len) {
387*387f9dfdSAndroid Build Coastguard Worker  if (len != sizeof(int64_t)) return -1;
388*387f9dfdSAndroid Build Coastguard Worker  { u64 __addr = ctx->bp + -128; __asm__ __volatile__("": : :"memory"); int64_t __res = 0x0; bpf_probe_read_user(&__res, sizeof(__res), (void *)__addr); *((int64_t *)dest) = __res; }
389*387f9dfdSAndroid Build Coastguard Worker  return 0;
390*387f9dfdSAndroid Build Coastguard Worker}
391*387f9dfdSAndroid Build Coastguard Worker#include <linux/blkdev.h>
392*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
393*387f9dfdSAndroid Build Coastguard Worker
394*387f9dfdSAndroid Build Coastguard Worker/**
395*387f9dfdSAndroid Build Coastguard Worker * @brief Helper method to filter based on the specified inputString.
396*387f9dfdSAndroid Build Coastguard Worker * @param inputString The operation input string to check against the filter.
397*387f9dfdSAndroid Build Coastguard Worker * @return True if the specified inputString starts with the hard-coded filter string; otherwise, false.
398*387f9dfdSAndroid Build Coastguard Worker */
399*387f9dfdSAndroid Build Coastguard Worker__attribute__((always_inline))
400*387f9dfdSAndroid Build Coastguard Workerstatic inline bool filter(char const* inputString)
401*387f9dfdSAndroid Build Coastguard Worker{
402*387f9dfdSAndroid Build Coastguard Worker    static const char* null_ptr = 0x0;
403*387f9dfdSAndroid Build Coastguard Worker    static const char null_terminator = '\0';
404*387f9dfdSAndroid Build Coastguard Worker
405*387f9dfdSAndroid Build Coastguard Worker    static const char filter_string[] = "usdt_20"; ///< The filter string is replaced by python code.
406*387f9dfdSAndroid Build Coastguard Worker    if (null_ptr == inputString) {
407*387f9dfdSAndroid Build Coastguard Worker        return false;
408*387f9dfdSAndroid Build Coastguard Worker    }
409*387f9dfdSAndroid Build Coastguard Worker    // bpf_trace_printk("inputString: '%s'", inputString);
410*387f9dfdSAndroid Build Coastguard Worker
411*387f9dfdSAndroid Build Coastguard Worker    // Compare until (not including) the null-terminator for filter_string
412*387f9dfdSAndroid Build Coastguard Worker    for (int i = 0; i < sizeof(filter_string) - 1; ++i) {
413*387f9dfdSAndroid Build Coastguard Worker        char c1 = *inputString++;
414*387f9dfdSAndroid Build Coastguard Worker        if (null_terminator == c1) {
415*387f9dfdSAndroid Build Coastguard Worker            return false;  // If the null-terminator for inputString was reached, it can not be equal to filter_string.
416*387f9dfdSAndroid Build Coastguard Worker        }
417*387f9dfdSAndroid Build Coastguard Worker
418*387f9dfdSAndroid Build Coastguard Worker        char c2 = filter_string[i];
419*387f9dfdSAndroid Build Coastguard Worker        if (c1 != c2) {
420*387f9dfdSAndroid Build Coastguard Worker            return false;
421*387f9dfdSAndroid Build Coastguard Worker        }
422*387f9dfdSAndroid Build Coastguard Worker    }
423*387f9dfdSAndroid Build Coastguard Worker    return true;
424*387f9dfdSAndroid Build Coastguard Worker}
425*387f9dfdSAndroid Build Coastguard Worker
426*387f9dfdSAndroid Build Coastguard Worker/**
427*387f9dfdSAndroid Build Coastguard Worker * @brief Contains the operation start data to trace.
428*387f9dfdSAndroid Build Coastguard Worker */
429*387f9dfdSAndroid Build Coastguard Workerstruct start_data_t
430*387f9dfdSAndroid Build Coastguard Worker{
431*387f9dfdSAndroid Build Coastguard Worker    u64 operation_id; ///< The id of the operation.
432*387f9dfdSAndroid Build Coastguard Worker    char input[64];   ///< The input string of the request.
433*387f9dfdSAndroid Build Coastguard Worker    u64 start;        ///< Timestamp of the start operation (start timestamp).
434*387f9dfdSAndroid Build Coastguard Worker};
435*387f9dfdSAndroid Build Coastguard Worker
436*387f9dfdSAndroid Build Coastguard Worker/**
437*387f9dfdSAndroid Build Coastguard Worker * @brief Contains the operation start data.
438*387f9dfdSAndroid Build Coastguard Worker * key: the operation id.
439*387f9dfdSAndroid Build Coastguard Worker * value: The operation start latency data.
440*387f9dfdSAndroid Build Coastguard Worker */
441*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(start_hash, u64, struct start_data_t);
442*387f9dfdSAndroid Build Coastguard Worker
443*387f9dfdSAndroid Build Coastguard Worker/**
444*387f9dfdSAndroid Build Coastguard Worker * @brief Reads the operation request arguments and stores the start data in the hash.
445*387f9dfdSAndroid Build Coastguard Worker * @param ctx The BPF context.
446*387f9dfdSAndroid Build Coastguard Worker */
447*387f9dfdSAndroid Build Coastguard Worker__attribute__((section(".bpf.fn.trace_operation_start")))
448*387f9dfdSAndroid Build Coastguard Workerint trace_operation_start(struct pt_regs* ctx)
449*387f9dfdSAndroid Build Coastguard Worker{
450*387f9dfdSAndroid Build Coastguard Worker
451*387f9dfdSAndroid Build Coastguard Worker    struct start_data_t start_data = {};
452*387f9dfdSAndroid Build Coastguard Worker    ({ u64 __addr = 0x0; _bpf_readarg_trace_operation_start_2(ctx, &__addr, sizeof(__addr));bpf_probe_read_user(&start_data.input, sizeof(start_data.input), (void *)__addr);});
453*387f9dfdSAndroid Build Coastguard Worker
454*387f9dfdSAndroid Build Coastguard Worker    if (!filter(start_data.input)) { return 0; } ///< Replaced by python code.
455*387f9dfdSAndroid Build Coastguard Worker
456*387f9dfdSAndroid Build Coastguard Worker    _bpf_readarg_trace_operation_start_1(ctx, &start_data.operation_id, sizeof(*(&start_data.operation_id)));
457*387f9dfdSAndroid Build Coastguard Worker
458*387f9dfdSAndroid Build Coastguard Worker    start_data.start = bpf_ktime_get_ns();
459*387f9dfdSAndroid Build Coastguard Worker    bpf_map_update_elem((void *)bpf_pseudo_fd(1, -1), &start_data.operation_id, &start_data, BPF_ANY);
460*387f9dfdSAndroid Build Coastguard Worker    return 0;
461*387f9dfdSAndroid Build Coastguard Worker}
462*387f9dfdSAndroid Build Coastguard Worker
463*387f9dfdSAndroid Build Coastguard Worker
464*387f9dfdSAndroid Build Coastguard Worker/**
465*387f9dfdSAndroid Build Coastguard Worker * @brief Contains the latency data w.r.t. the complete operation from request to response.
466*387f9dfdSAndroid Build Coastguard Worker */
467*387f9dfdSAndroid Build Coastguard Workerstruct end_data_t
468*387f9dfdSAndroid Build Coastguard Worker{
469*387f9dfdSAndroid Build Coastguard Worker    u64 operation_id; ///< The id of the operation.
470*387f9dfdSAndroid Build Coastguard Worker    char input[64];   ///< The request (input) string.
471*387f9dfdSAndroid Build Coastguard Worker    char output[64];  ///< The response (output) string.
472*387f9dfdSAndroid Build Coastguard Worker    u64 start;        ///< The start timestamp of the operation.
473*387f9dfdSAndroid Build Coastguard Worker    u64 end;          ///< The end timestamp of the operation.
474*387f9dfdSAndroid Build Coastguard Worker    u64 duration;     ///< The duration of the operation.
475*387f9dfdSAndroid Build Coastguard Worker};
476*387f9dfdSAndroid Build Coastguard Worker
477*387f9dfdSAndroid Build Coastguard Worker/**
478*387f9dfdSAndroid Build Coastguard Worker * The output buffer, which will be used to push the latency event data to user space.
479*387f9dfdSAndroid Build Coastguard Worker */
480*387f9dfdSAndroid Build Coastguard WorkerBPF_PERF_OUTPUT(operation_event);
481*387f9dfdSAndroid Build Coastguard Worker
482*387f9dfdSAndroid Build Coastguard Worker/**
483*387f9dfdSAndroid Build Coastguard Worker * @brief Reads the operation response arguments, calculates the latency event data, and writes it to the user output buffer.
484*387f9dfdSAndroid Build Coastguard Worker * @param ctx The BPF context.
485*387f9dfdSAndroid Build Coastguard Worker */
486*387f9dfdSAndroid Build Coastguard Worker__attribute__((section(".bpf.fn.trace_operation_end")))
487*387f9dfdSAndroid Build Coastguard Workerint trace_operation_end(struct pt_regs* ctx)
488*387f9dfdSAndroid Build Coastguard Worker{
489*387f9dfdSAndroid Build Coastguard Worker
490*387f9dfdSAndroid Build Coastguard Worker    u64 operation_id;
491*387f9dfdSAndroid Build Coastguard Worker    _bpf_readarg_trace_operation_end_1(ctx, &operation_id, sizeof(*(&operation_id)));
492*387f9dfdSAndroid Build Coastguard Worker
493*387f9dfdSAndroid Build Coastguard Worker    struct start_data_t* start_data = bpf_map_lookup_elem((void *)bpf_pseudo_fd(1, -1), &operation_id);
494*387f9dfdSAndroid Build Coastguard Worker    if (0 == start_data) {
495*387f9dfdSAndroid Build Coastguard Worker        return 0;
496*387f9dfdSAndroid Build Coastguard Worker    }
497*387f9dfdSAndroid Build Coastguard Worker
498*387f9dfdSAndroid Build Coastguard Worker    struct end_data_t end_data = {};
499*387f9dfdSAndroid Build Coastguard Worker    end_data.operation_id = operation_id;
500*387f9dfdSAndroid Build Coastguard Worker    ({ u64 __addr = 0x0; _bpf_readarg_trace_operation_end_2(ctx, &__addr, sizeof(__addr));bpf_probe_read_user(&end_data.output, sizeof(end_data.output), (void *)__addr);});
501*387f9dfdSAndroid Build Coastguard Worker    end_data.end = bpf_ktime_get_ns();
502*387f9dfdSAndroid Build Coastguard Worker    end_data.start = start_data->start;
503*387f9dfdSAndroid Build Coastguard Worker    end_data.duration = end_data.end - end_data.start;
504*387f9dfdSAndroid Build Coastguard Worker    __builtin_memcpy(&end_data.input, start_data->input, sizeof(end_data.input));
505*387f9dfdSAndroid Build Coastguard Worker
506*387f9dfdSAndroid Build Coastguard Worker    bpf_map_delete_elem((void *)bpf_pseudo_fd(1, -1), &end_data.operation_id);
507*387f9dfdSAndroid Build Coastguard Worker
508*387f9dfdSAndroid Build Coastguard Worker    bpf_perf_event_output(ctx, bpf_pseudo_fd(1, -2), CUR_CPU_IDENTIFIER, &end_data, sizeof(end_data));
509*387f9dfdSAndroid Build Coastguard Worker    return 0;
510*387f9dfdSAndroid Build Coastguard Worker}
511*387f9dfdSAndroid Build Coastguard Worker
512*387f9dfdSAndroid Build Coastguard Worker#include <bcc/footer.h>
513*387f9dfdSAndroid Build Coastguard WorkerTracing... Hit Ctrl-C to end.
514*387f9dfdSAndroid Build Coastguard Worker```
515*387f9dfdSAndroid Build Coastguard Worker
516*387f9dfdSAndroid Build Coastguard Worker## Use bpf_trace_printk
517*387f9dfdSAndroid Build Coastguard Worker
518*387f9dfdSAndroid Build Coastguard WorkerAdd bpf trace statements to the C++ code:
519*387f9dfdSAndroid Build Coastguard Worker
520*387f9dfdSAndroid Build Coastguard Worker```C++
521*387f9dfdSAndroid Build Coastguard Workerbpf_trace_printk("inputString: '%s'", inputString);
522*387f9dfdSAndroid Build Coastguard Worker```
523*387f9dfdSAndroid Build Coastguard Worker
524*387f9dfdSAndroid Build Coastguard Worker```bash
525*387f9dfdSAndroid Build Coastguard Worker$ sudo tail -f /sys/kernel/debug/tracing/trace
526*387f9dfdSAndroid Build Coastguard Worker...
527*387f9dfdSAndroid Build Coastguard Worker usdt_sample_app-2439214 [001] d... 635079.194883: bpf_trace_printk: inputString: 'usdt_8'
528*387f9dfdSAndroid Build Coastguard Worker usdt_sample_app-2439214 [001] d... 635079.295102: bpf_trace_printk: inputString: 'usdt_17'
529*387f9dfdSAndroid Build Coastguard Worker usdt_sample_app-2439214 [001] d... 635079.395217: bpf_trace_printk: inputString: 'usdt_18'
530*387f9dfdSAndroid Build Coastguard Worker...
531*387f9dfdSAndroid Build Coastguard Worker```
532