xref: /qemu/scripts/tracetool.py (revision 081340d1)
13d004a37SPhilippe Mathieu-Daudé#!/usr/bin/env python3
2650ab98dSLluís Vilanova# -*- coding: utf-8 -*-
3650ab98dSLluís Vilanova
4650ab98dSLluís Vilanova"""
5650ab98dSLluís VilanovaCommand-line wrapper for the tracetool machinery.
6650ab98dSLluís Vilanova"""
7650ab98dSLluís Vilanova
8650ab98dSLluís Vilanova__author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
95b808275SLluís Vilanova__copyright__  = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>"
10650ab98dSLluís Vilanova__license__    = "GPL version 2 or (at your option) any later version"
11650ab98dSLluís Vilanova
12650ab98dSLluís Vilanova__maintainer__ = "Stefan Hajnoczi"
13f892b494SPhilippe Mathieu-Daudé__email__      = "stefanha@redhat.com"
14650ab98dSLluís Vilanova
15650ab98dSLluís Vilanova
16650ab98dSLluís Vilanovaimport sys
17650ab98dSLluís Vilanovaimport getopt
18650ab98dSLluís Vilanova
19c05012a3SStefan Hajnoczifrom tracetool import error_write, out, out_open
20650ab98dSLluís Vilanovaimport tracetool.backend
21650ab98dSLluís Vilanovaimport tracetool.format
22650ab98dSLluís Vilanova
23650ab98dSLluís Vilanova
24650ab98dSLluís Vilanova_SCRIPT = ""
25650ab98dSLluís Vilanova
26650ab98dSLluís Vilanovadef error_opt(msg = None):
27650ab98dSLluís Vilanova    if msg is not None:
28650ab98dSLluís Vilanova        error_write("Error: " + msg + "\n")
29650ab98dSLluís Vilanova
30650ab98dSLluís Vilanova    backend_descr = "\n".join([ "    %-15s %s" % (n, d)
31650ab98dSLluís Vilanova                                for n,d in tracetool.backend.get_list() ])
32650ab98dSLluís Vilanova    format_descr = "\n".join([ "    %-15s %s" % (n, d)
33650ab98dSLluís Vilanova                               for n,d in tracetool.format.get_list() ])
34650ab98dSLluís Vilanova    error_write("""\
35c05012a3SStefan HajnocziUsage: %(script)s --format=<format> --backends=<backends> [<options>] <trace-events> ... <output>
36650ab98dSLluís Vilanova
37650ab98dSLluís VilanovaBackends:
38650ab98dSLluís Vilanova%(backends)s
39650ab98dSLluís Vilanova
40650ab98dSLluís VilanovaFormats:
41650ab98dSLluís Vilanova%(formats)s
42650ab98dSLluís Vilanova
43650ab98dSLluís VilanovaOptions:
44650ab98dSLluís Vilanova    --help                   This help message.
45650ab98dSLluís Vilanova    --list-backends          Print list of available backends.
465b808275SLluís Vilanova    --check-backends         Check if the given backend is valid.
47081340d1SDaniel P. Berrangé    --binary <path>          Full path to QEMU binary (required for 'stap' backend).
48081340d1SDaniel P. Berrangé    --group <name>           Name of the event group.
49081340d1SDaniel P. Berrangé    --probe-prefix <prefix>  Prefix for dtrace probe names (required for 'stap' backend).
50650ab98dSLluís Vilanova""" % {
51650ab98dSLluís Vilanova            "script" : _SCRIPT,
52650ab98dSLluís Vilanova            "backends" : backend_descr,
53650ab98dSLluís Vilanova            "formats" : format_descr,
54650ab98dSLluís Vilanova            })
55650ab98dSLluís Vilanova
56650ab98dSLluís Vilanova    if msg is None:
57650ab98dSLluís Vilanova        sys.exit(0)
58650ab98dSLluís Vilanova    else:
59650ab98dSLluís Vilanova        sys.exit(1)
60650ab98dSLluís Vilanova
61650ab98dSLluís Vilanovadef main(args):
62650ab98dSLluís Vilanova    global _SCRIPT
63650ab98dSLluís Vilanova    _SCRIPT = args[0]
64650ab98dSLluís Vilanova
655b808275SLluís Vilanova    long_opts = ["backends=", "format=", "help", "list-backends",
662098c56aSDaniel P. Berrange                 "check-backends", "group="]
67081340d1SDaniel P. Berrangé    long_opts += ["binary=", "probe-prefix="]
68650ab98dSLluís Vilanova
69650ab98dSLluís Vilanova    try:
70650ab98dSLluís Vilanova        opts, args = getopt.getopt(args[1:], "", long_opts)
7186b227d9SMarkus Armbruster    except getopt.GetoptError as err:
72650ab98dSLluís Vilanova        error_opt(str(err))
73650ab98dSLluís Vilanova
745b808275SLluís Vilanova    check_backends = False
755b808275SLluís Vilanova    arg_backends = []
76650ab98dSLluís Vilanova    arg_format = ""
772098c56aSDaniel P. Berrange    arg_group = None
7852ef093aSLluís Vilanova    binary = None
7952ef093aSLluís Vilanova    probe_prefix = None
80650ab98dSLluís Vilanova    for opt, arg in opts:
81650ab98dSLluís Vilanova        if opt == "--help":
82650ab98dSLluís Vilanova            error_opt()
83650ab98dSLluís Vilanova
845b808275SLluís Vilanova        elif opt == "--backends":
855b808275SLluís Vilanova            arg_backends = arg.split(",")
862098c56aSDaniel P. Berrange        elif opt == "--group":
872098c56aSDaniel P. Berrange            arg_group = arg
88650ab98dSLluís Vilanova        elif opt == "--format":
89650ab98dSLluís Vilanova            arg_format = arg
90650ab98dSLluís Vilanova
91650ab98dSLluís Vilanova        elif opt == "--list-backends":
9293fba161SLluís Vilanova            public_backends = tracetool.backend.get_list(only_public = True)
9393fba161SLluís Vilanova            out(", ".join([ b for b,_ in public_backends ]))
94650ab98dSLluís Vilanova            sys.exit(0)
955b808275SLluís Vilanova        elif opt == "--check-backends":
965b808275SLluís Vilanova            check_backends = True
97650ab98dSLluís Vilanova
9852ef093aSLluís Vilanova        elif opt == "--binary":
9952ef093aSLluís Vilanova            binary = arg
10052ef093aSLluís Vilanova        elif opt == '--probe-prefix':
10152ef093aSLluís Vilanova            probe_prefix = arg
10252ef093aSLluís Vilanova
103650ab98dSLluís Vilanova        else:
104650ab98dSLluís Vilanova            error_opt("unhandled option: %s" % opt)
105650ab98dSLluís Vilanova
1065b808275SLluís Vilanova    if len(arg_backends) == 0:
1075b808275SLluís Vilanova        error_opt("no backends specified")
108650ab98dSLluís Vilanova
1095b808275SLluís Vilanova    if check_backends:
1105b808275SLluís Vilanova        for backend in arg_backends:
1115b808275SLluís Vilanova            if not tracetool.backend.exists(backend):
112650ab98dSLluís Vilanova                sys.exit(1)
1135b808275SLluís Vilanova        sys.exit(0)
114650ab98dSLluís Vilanova
1152098c56aSDaniel P. Berrange    if arg_group is None:
1162098c56aSDaniel P. Berrange        error_opt("group name is required")
1172098c56aSDaniel P. Berrange
11852ef093aSLluís Vilanova    if arg_format == "stap":
11952ef093aSLluís Vilanova        if binary is None:
12052ef093aSLluís Vilanova            error_opt("--binary is required for SystemTAP tapset generator")
12152ef093aSLluís Vilanova        if probe_prefix is None:
122081340d1SDaniel P. Berrangé            error_opt("--probe-prefix is required for SystemTAP tapset generator")
12352ef093aSLluís Vilanova
124c05012a3SStefan Hajnoczi    if len(args) < 2:
125c05012a3SStefan Hajnoczi        error_opt("missing trace-events and output filepaths")
1260ab8ed18SDaniel P. Berrange    events = []
127c05012a3SStefan Hajnoczi    for arg in args[:-1]:
1280ab8ed18SDaniel P. Berrange        with open(arg, "r") as fh:
12986b5aacfSDaniel P. Berrangé            events.extend(tracetool.read_events(fh, arg))
1309096b78aSDaniel P. Berrange
131c05012a3SStefan Hajnoczi    out_open(args[-1])
132c05012a3SStefan Hajnoczi
133650ab98dSLluís Vilanova    try:
1342098c56aSDaniel P. Berrange        tracetool.generate(events, arg_group, arg_format, arg_backends,
13552ef093aSLluís Vilanova                           binary=binary, probe_prefix=probe_prefix)
13686b227d9SMarkus Armbruster    except tracetool.TracetoolError as e:
137650ab98dSLluís Vilanova        error_opt(str(e))
138650ab98dSLluís Vilanova
139650ab98dSLluís Vilanovaif __name__ == "__main__":
140650ab98dSLluís Vilanova    main(sys.argv)
141