xref: /aosp_15_r20/external/bcc/tools/tplist.py (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/env python
2*387f9dfdSAndroid Build Coastguard Worker#
3*387f9dfdSAndroid Build Coastguard Worker# tplist    Display kernel tracepoints or USDT probes and their formats.
4*387f9dfdSAndroid Build Coastguard Worker#
5*387f9dfdSAndroid Build Coastguard Worker# USAGE:    tplist [-p PID] [-l LIB] [-v] [filter]
6*387f9dfdSAndroid Build Coastguard Worker#
7*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License")
8*387f9dfdSAndroid Build Coastguard Worker# Copyright (C) 2016 Sasha Goldshtein.
9*387f9dfdSAndroid Build Coastguard Worker
10*387f9dfdSAndroid Build Coastguard Workerimport argparse
11*387f9dfdSAndroid Build Coastguard Workerimport fnmatch
12*387f9dfdSAndroid Build Coastguard Workerimport os
13*387f9dfdSAndroid Build Coastguard Workerimport re
14*387f9dfdSAndroid Build Coastguard Workerimport sys
15*387f9dfdSAndroid Build Coastguard Worker
16*387f9dfdSAndroid Build Coastguard Workerfrom bcc import USDT
17*387f9dfdSAndroid Build Coastguard Worker
18*387f9dfdSAndroid Build Coastguard Workertrace_root = "/sys/kernel/debug/tracing"
19*387f9dfdSAndroid Build Coastguard Workerevent_root = os.path.join(trace_root, "events")
20*387f9dfdSAndroid Build Coastguard Worker
21*387f9dfdSAndroid Build Coastguard Workerparser = argparse.ArgumentParser(
22*387f9dfdSAndroid Build Coastguard Worker        description="Display kernel tracepoints or USDT probes " +
23*387f9dfdSAndroid Build Coastguard Worker                    "and their formats.",
24*387f9dfdSAndroid Build Coastguard Worker        formatter_class=argparse.RawDescriptionHelpFormatter)
25*387f9dfdSAndroid Build Coastguard Workerparser.add_argument("-p", "--pid", type=int, default=None,
26*387f9dfdSAndroid Build Coastguard Worker        help="List USDT probes in the specified process")
27*387f9dfdSAndroid Build Coastguard Workerparser.add_argument("-l", "--lib", default="",
28*387f9dfdSAndroid Build Coastguard Worker        help="List USDT probes in the specified library or executable")
29*387f9dfdSAndroid Build Coastguard Workerparser.add_argument("-v", dest="verbosity", action="count", default=0,
30*387f9dfdSAndroid Build Coastguard Worker        help="Increase verbosity level (print variables, arguments, etc.)")
31*387f9dfdSAndroid Build Coastguard Workerparser.add_argument(dest="filter", nargs="?",
32*387f9dfdSAndroid Build Coastguard Worker        help="A filter that specifies which probes/tracepoints to print")
33*387f9dfdSAndroid Build Coastguard Workerargs = parser.parse_args()
34*387f9dfdSAndroid Build Coastguard Worker
35*387f9dfdSAndroid Build Coastguard Workerdef print_tpoint_format(category, event):
36*387f9dfdSAndroid Build Coastguard Worker        fmt = open(os.path.join(event_root, category, event, "format")) \
37*387f9dfdSAndroid Build Coastguard Worker              .readlines()
38*387f9dfdSAndroid Build Coastguard Worker        for line in fmt:
39*387f9dfdSAndroid Build Coastguard Worker                match = re.search(r'field:([^;]*);', line)
40*387f9dfdSAndroid Build Coastguard Worker                if match is None:
41*387f9dfdSAndroid Build Coastguard Worker                        continue
42*387f9dfdSAndroid Build Coastguard Worker                parts = match.group(1).split()
43*387f9dfdSAndroid Build Coastguard Worker                field_name = parts[-1:][0]
44*387f9dfdSAndroid Build Coastguard Worker                field_type = " ".join(parts[:-1])
45*387f9dfdSAndroid Build Coastguard Worker                if field_name.startswith("common_"):
46*387f9dfdSAndroid Build Coastguard Worker                        continue
47*387f9dfdSAndroid Build Coastguard Worker                print("    %s %s;" % (field_type, field_name))
48*387f9dfdSAndroid Build Coastguard Worker
49*387f9dfdSAndroid Build Coastguard Workerdef print_tpoint(category, event):
50*387f9dfdSAndroid Build Coastguard Worker        tpoint = "%s:%s" % (category, event)
51*387f9dfdSAndroid Build Coastguard Worker        if not args.filter or fnmatch.fnmatch(tpoint, args.filter):
52*387f9dfdSAndroid Build Coastguard Worker                print(tpoint)
53*387f9dfdSAndroid Build Coastguard Worker                if args.verbosity > 0:
54*387f9dfdSAndroid Build Coastguard Worker                        print_tpoint_format(category, event)
55*387f9dfdSAndroid Build Coastguard Worker
56*387f9dfdSAndroid Build Coastguard Workerdef print_tracepoints():
57*387f9dfdSAndroid Build Coastguard Worker        for category in os.listdir(event_root):
58*387f9dfdSAndroid Build Coastguard Worker                cat_dir = os.path.join(event_root, category)
59*387f9dfdSAndroid Build Coastguard Worker                if not os.path.isdir(cat_dir):
60*387f9dfdSAndroid Build Coastguard Worker                        continue
61*387f9dfdSAndroid Build Coastguard Worker                for event in os.listdir(cat_dir):
62*387f9dfdSAndroid Build Coastguard Worker                        evt_dir = os.path.join(cat_dir, event)
63*387f9dfdSAndroid Build Coastguard Worker                        if os.path.isdir(evt_dir):
64*387f9dfdSAndroid Build Coastguard Worker                                print_tpoint(category, event)
65*387f9dfdSAndroid Build Coastguard Worker
66*387f9dfdSAndroid Build Coastguard Workerdef print_usdt_argument_details(location):
67*387f9dfdSAndroid Build Coastguard Worker        for idx in range(0, location.num_arguments):
68*387f9dfdSAndroid Build Coastguard Worker                arg = location.get_argument(idx)
69*387f9dfdSAndroid Build Coastguard Worker                print("    argument #%d %s" % (idx + 1, arg))
70*387f9dfdSAndroid Build Coastguard Worker
71*387f9dfdSAndroid Build Coastguard Workerdef print_usdt_details(probe):
72*387f9dfdSAndroid Build Coastguard Worker        if args.verbosity > 0:
73*387f9dfdSAndroid Build Coastguard Worker                print(probe)
74*387f9dfdSAndroid Build Coastguard Worker                if args.verbosity > 1:
75*387f9dfdSAndroid Build Coastguard Worker                        for idx in range(0, probe.num_locations):
76*387f9dfdSAndroid Build Coastguard Worker                                loc = probe.get_location(idx)
77*387f9dfdSAndroid Build Coastguard Worker                                print("  location #%d %s" % (idx + 1, loc))
78*387f9dfdSAndroid Build Coastguard Worker                                print_usdt_argument_details(loc)
79*387f9dfdSAndroid Build Coastguard Worker                else:
80*387f9dfdSAndroid Build Coastguard Worker                        print("  %d location(s)" % probe.num_locations)
81*387f9dfdSAndroid Build Coastguard Worker                        print("  %d argument(s)" % probe.num_arguments)
82*387f9dfdSAndroid Build Coastguard Worker        else:
83*387f9dfdSAndroid Build Coastguard Worker                print("%s %s" %
84*387f9dfdSAndroid Build Coastguard Worker                      (probe.bin_path.decode(), probe.short_name()))
85*387f9dfdSAndroid Build Coastguard Worker
86*387f9dfdSAndroid Build Coastguard Workerdef print_usdt(pid, lib):
87*387f9dfdSAndroid Build Coastguard Worker        reader = USDT(path=lib, pid=pid)
88*387f9dfdSAndroid Build Coastguard Worker        probes_seen = []
89*387f9dfdSAndroid Build Coastguard Worker        for probe in reader.enumerate_probes():
90*387f9dfdSAndroid Build Coastguard Worker                probe_name = probe.short_name()
91*387f9dfdSAndroid Build Coastguard Worker                if not args.filter or fnmatch.fnmatch(probe_name, args.filter):
92*387f9dfdSAndroid Build Coastguard Worker                        if probe_name in probes_seen:
93*387f9dfdSAndroid Build Coastguard Worker                                continue
94*387f9dfdSAndroid Build Coastguard Worker                        probes_seen.append(probe_name)
95*387f9dfdSAndroid Build Coastguard Worker                        print_usdt_details(probe)
96*387f9dfdSAndroid Build Coastguard Worker
97*387f9dfdSAndroid Build Coastguard Workerif __name__ == "__main__":
98*387f9dfdSAndroid Build Coastguard Worker        try:
99*387f9dfdSAndroid Build Coastguard Worker                if args.pid or args.lib != "":
100*387f9dfdSAndroid Build Coastguard Worker                        print_usdt(args.pid, args.lib)
101*387f9dfdSAndroid Build Coastguard Worker                else:
102*387f9dfdSAndroid Build Coastguard Worker                        print_tracepoints()
103*387f9dfdSAndroid Build Coastguard Worker        except:
104*387f9dfdSAndroid Build Coastguard Worker                if sys.exc_info()[0] is not SystemExit:
105*387f9dfdSAndroid Build Coastguard Worker                        print(sys.exc_info()[1])
106