xref: /aosp_15_r20/external/bcc/examples/tracing/strlen_hist.py (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/python
2*387f9dfdSAndroid Build Coastguard Worker
3*387f9dfdSAndroid Build Coastguard Worker#
4*387f9dfdSAndroid Build Coastguard Worker# strlen_hist.py   Histogram of system-wide strlen return values
5*387f9dfdSAndroid Build Coastguard Worker#
6*387f9dfdSAndroid Build Coastguard Worker# A basic example of using uprobes along with a histogram to show
7*387f9dfdSAndroid Build Coastguard Worker# distributions.
8*387f9dfdSAndroid Build Coastguard Worker#
9*387f9dfdSAndroid Build Coastguard Worker# Runs until ctrl-c is pressed.
10*387f9dfdSAndroid Build Coastguard Worker#
11*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) PLUMgrid, Inc.
12*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License")
13*387f9dfdSAndroid Build Coastguard Worker#
14*387f9dfdSAndroid Build Coastguard Worker# Example output:
15*387f9dfdSAndroid Build Coastguard Worker# $ sudo ./strlen_hist.py
16*387f9dfdSAndroid Build Coastguard Worker# 22:12:52
17*387f9dfdSAndroid Build Coastguard Worker#      strlen return:      : count     distribution
18*387f9dfdSAndroid Build Coastguard Worker#          0 -> 1          : 2106     |****************                        |
19*387f9dfdSAndroid Build Coastguard Worker#          2 -> 3          : 1172     |*********                               |
20*387f9dfdSAndroid Build Coastguard Worker#          4 -> 7          : 3892     |******************************          |
21*387f9dfdSAndroid Build Coastguard Worker#          8 -> 15         : 5096     |****************************************|
22*387f9dfdSAndroid Build Coastguard Worker#         16 -> 31         : 2201     |*****************                       |
23*387f9dfdSAndroid Build Coastguard Worker#         32 -> 63         : 547      |****                                    |
24*387f9dfdSAndroid Build Coastguard Worker#         64 -> 127        : 106      |                                        |
25*387f9dfdSAndroid Build Coastguard Worker#        128 -> 255        : 13       |                                        |
26*387f9dfdSAndroid Build Coastguard Worker#        256 -> 511        : 27       |                                        |
27*387f9dfdSAndroid Build Coastguard Worker#        512 -> 1023       : 6        |                                        |
28*387f9dfdSAndroid Build Coastguard Worker#       1024 -> 2047       : 10       |                                        |
29*387f9dfdSAndroid Build Coastguard Worker# ^C$
30*387f9dfdSAndroid Build Coastguard Worker#
31*387f9dfdSAndroid Build Coastguard Worker
32*387f9dfdSAndroid Build Coastguard Workerfrom __future__ import print_function
33*387f9dfdSAndroid Build Coastguard Workerimport bcc
34*387f9dfdSAndroid Build Coastguard Workerimport time
35*387f9dfdSAndroid Build Coastguard Worker
36*387f9dfdSAndroid Build Coastguard Workertext = """
37*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
38*387f9dfdSAndroid Build Coastguard WorkerBPF_HISTOGRAM(dist);
39*387f9dfdSAndroid Build Coastguard Workerint count(struct pt_regs *ctx) {
40*387f9dfdSAndroid Build Coastguard Worker    dist.increment(bpf_log2l(PT_REGS_RC(ctx)));
41*387f9dfdSAndroid Build Coastguard Worker    return 0;
42*387f9dfdSAndroid Build Coastguard Worker}
43*387f9dfdSAndroid Build Coastguard Worker"""
44*387f9dfdSAndroid Build Coastguard Worker
45*387f9dfdSAndroid Build Coastguard Workerb = bcc.BPF(text=text)
46*387f9dfdSAndroid Build Coastguard Workersym="strlen"
47*387f9dfdSAndroid Build Coastguard Workerb.attach_uretprobe(name="c", sym=sym, fn_name="count")
48*387f9dfdSAndroid Build Coastguard Worker
49*387f9dfdSAndroid Build Coastguard Workerdist = b["dist"]
50*387f9dfdSAndroid Build Coastguard Worker
51*387f9dfdSAndroid Build Coastguard Workertry:
52*387f9dfdSAndroid Build Coastguard Worker    while True:
53*387f9dfdSAndroid Build Coastguard Worker        time.sleep(1)
54*387f9dfdSAndroid Build Coastguard Worker        print("%-8s\n" % time.strftime("%H:%M:%S"), end="")
55*387f9dfdSAndroid Build Coastguard Worker        dist.print_log2_hist(sym + " return:")
56*387f9dfdSAndroid Build Coastguard Worker        dist.clear()
57*387f9dfdSAndroid Build Coastguard Worker
58*387f9dfdSAndroid Build Coastguard Workerexcept KeyboardInterrupt:
59*387f9dfdSAndroid Build Coastguard Worker    pass
60