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