mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 23:33:54 -06:00
trace: Multi-backend tracing
Adds support to compile QEMU with multiple tracing backends at the same time. For example, you can compile QEMU with: $ ./configure --enable-trace-backends=ftrace,dtrace Where 'ftrace' can be handy for having an in-flight record of events, and 'dtrace' can be later used to extract more information from the system. This patch allows having both available without recompiling QEMU. Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
82432638eb
commit
5b808275f3
20 changed files with 152 additions and 233 deletions
|
@ -233,9 +233,9 @@ def try_import(mod_name, attr_name=None, attr_default=None):
|
|||
return False, None
|
||||
|
||||
|
||||
def generate(fevents, format, backend,
|
||||
def generate(fevents, format, backends,
|
||||
binary=None, probe_prefix=None):
|
||||
"""Generate the output for the given (format, backend) pair.
|
||||
"""Generate the output for the given (format, backends) pair.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
|
@ -243,8 +243,8 @@ def generate(fevents, format, backend,
|
|||
Event description file.
|
||||
format : str
|
||||
Output format name.
|
||||
backend : str
|
||||
Output backend name.
|
||||
backends : list
|
||||
Output backend names.
|
||||
binary : str or None
|
||||
See tracetool.backend.dtrace.BINARY.
|
||||
probe_prefix : str or None
|
||||
|
@ -258,15 +258,13 @@ def generate(fevents, format, backend,
|
|||
raise TracetoolError("format not set")
|
||||
if not tracetool.format.exists(format):
|
||||
raise TracetoolError("unknown format: %s" % format)
|
||||
format = format.replace("-", "_")
|
||||
|
||||
backend = str(backend)
|
||||
if len(backend) is 0:
|
||||
raise TracetoolError("backend not set")
|
||||
if not tracetool.backend.exists(backend):
|
||||
raise TracetoolError("unknown backend: %s" % backend)
|
||||
backend = backend.replace("-", "_")
|
||||
backend = tracetool.backend.Wrapper(backend, format)
|
||||
if len(backends) is 0:
|
||||
raise TracetoolError("no backends specified")
|
||||
for backend in backends:
|
||||
if not tracetool.backend.exists(backend):
|
||||
raise TracetoolError("unknown backend: %s" % backend)
|
||||
backend = tracetool.backend.Wrapper(backends, format)
|
||||
|
||||
import tracetool.backend.dtrace
|
||||
tracetool.backend.dtrace.BINARY = binary
|
||||
|
|
|
@ -99,17 +99,18 @@ def exists(name):
|
|||
|
||||
|
||||
class Wrapper:
|
||||
def __init__(self, backend, format):
|
||||
self._backend = backend.replace("-", "_")
|
||||
def __init__(self, backends, format):
|
||||
self._backends = [backend.replace("-", "_") for backend in backends]
|
||||
self._format = format.replace("-", "_")
|
||||
assert exists(self._backend)
|
||||
assert all(exists(backend) for backend in self._backends)
|
||||
assert tracetool.format.exists(self._format)
|
||||
|
||||
def _run_function(self, name, *args, **kwargs):
|
||||
func = tracetool.try_import("tracetool.backend." + self._backend,
|
||||
name % self._format, None)[1]
|
||||
if func is not None:
|
||||
func(*args, **kwargs)
|
||||
for backend in self._backends:
|
||||
func = tracetool.try_import("tracetool.backend." + backend,
|
||||
name % self._format, None)[1]
|
||||
if func is not None:
|
||||
func(*args, **kwargs)
|
||||
|
||||
def generate_begin(self, events):
|
||||
self._run_function("generate_%s_begin", events)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue