* [PATCH 0/4] tracetool: show trace-events filename/lineno in fmt string errors @ 2020-08-27 14:29 Stefan Hajnoczi 2020-08-27 14:29 ` [PATCH 1/4] tracetool: add output filename command-line argument Stefan Hajnoczi ` (4 more replies) 0 siblings, 5 replies; 14+ messages in thread From: Stefan Hajnoczi @ 2020-08-27 14:29 UTC (permalink / raw) To: qemu-devel; +Cc: Peter Maydell, Eduardo Habkost, Stefan Hajnoczi, Cleber Rosa This patch series improves format string compiler error messages. Instead of showing the generated file, show the trace-events file where the format string is defined. Stefan Hajnoczi (4): tracetool: add output filename command-line argument tracetool: add out_lineno and out_next_lineno to out() tracetool: add input filename and line number to Event tracetool: show trace-events filename/lineno in fmt string errors docs/devel/tracing.txt | 3 +- meson.build | 3 +- scripts/tracetool.py | 12 ++++--- scripts/tracetool/__init__.py | 53 +++++++++++++++++++++++++---- scripts/tracetool/backend/ftrace.py | 4 +++ scripts/tracetool/backend/log.py | 4 +++ scripts/tracetool/backend/syslog.py | 4 +++ trace/meson.build | 23 +++++-------- 8 files changed, 76 insertions(+), 30 deletions(-) -- 2.26.2 ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/4] tracetool: add output filename command-line argument 2020-08-27 14:29 [PATCH 0/4] tracetool: show trace-events filename/lineno in fmt string errors Stefan Hajnoczi @ 2020-08-27 14:29 ` Stefan Hajnoczi 2020-08-31 20:17 ` Philippe Mathieu-Daudé 2020-09-01 12:55 ` Peter Maydell 2020-08-27 14:29 ` [PATCH 2/4] tracetool: add out_lineno and out_next_lineno to out() Stefan Hajnoczi ` (3 subsequent siblings) 4 siblings, 2 replies; 14+ messages in thread From: Stefan Hajnoczi @ 2020-08-27 14:29 UTC (permalink / raw) To: qemu-devel; +Cc: Peter Maydell, Eduardo Habkost, Stefan Hajnoczi, Cleber Rosa The tracetool.py script writes to stdout. This means the output filename is not available to the script. Add the output filename to the command-line so that the script has access to the filename. This also simplifies the tracetool.py invocation. It's no longer necessary to use meson's custom_build(capture : true) to save output. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- docs/devel/tracing.txt | 3 ++- meson.build | 3 +-- scripts/tracetool.py | 12 +++++++----- scripts/tracetool/__init__.py | 18 ++++++++++++++++-- trace/meson.build | 23 ++++++++--------------- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/docs/devel/tracing.txt b/docs/devel/tracing.txt index 6144d9921b..c84d4c00ac 100644 --- a/docs/devel/tracing.txt +++ b/docs/devel/tracing.txt @@ -318,7 +318,8 @@ probes: --target-type system \ --target-name x86_64 \ --group=all \ - trace-events-all >qemu.stp + trace-events-all \ + qemu.stp To facilitate simple usage of systemtap where there merely needs to be printf logging of certain probes, a helper script "qemu-trace-stap" is provided. diff --git a/meson.build b/meson.build index f0fe5f8799..fadeb0c268 100644 --- a/meson.build +++ b/meson.build @@ -1037,7 +1037,6 @@ foreach target : target_dirs custom_target(exe_name + stp['ext'], input: trace_events_all, output: exe_name + stp['ext'], - capture: true, install: stp['install'], install_dir: config_host['qemu_datadir'] / '../systemtap/tapset', command: [ @@ -1046,7 +1045,7 @@ foreach target : target_dirs '--target-name=' + target_name, '--target-type=' + target_type, '--probe-prefix=qemu.' + target_type + '.' + target_name, - '@INPUT@', + '@INPUT@', '@OUTPUT@' ]) endforeach endif diff --git a/scripts/tracetool.py b/scripts/tracetool.py index 31146242b7..ab7653a5ce 100644 --- a/scripts/tracetool.py +++ b/scripts/tracetool.py @@ -16,7 +16,7 @@ __email__ = "stefanha@redhat.com" import sys import getopt -from tracetool import error_write, out +from tracetool import error_write, out, out_open import tracetool.backend import tracetool.format @@ -32,7 +32,7 @@ def error_opt(msg = None): format_descr = "\n".join([ " %-15s %s" % (n, d) for n,d in tracetool.format.get_list() ]) error_write("""\ -Usage: %(script)s --format=<format> --backends=<backends> [<options>] +Usage: %(script)s --format=<format> --backends=<backends> [<options>] <trace-events> ... <output> Backends: %(backends)s @@ -135,13 +135,15 @@ def main(args): if probe_prefix is None: probe_prefix = ".".join(["qemu", target_type, target_name]) - if len(args) < 1: - error_opt("missing trace-events filepath") + if len(args) < 2: + error_opt("missing trace-events and output filepaths") events = [] - for arg in args: + for arg in args[:-1]: with open(arg, "r") as fh: events.extend(tracetool.read_events(fh, arg)) + out_open(args[-1]) + try: tracetool.generate(events, arg_group, arg_format, arg_backends, binary=binary, probe_prefix=probe_prefix) diff --git a/scripts/tracetool/__init__.py b/scripts/tracetool/__init__.py index 3ccfa1e116..98104fa50e 100644 --- a/scripts/tracetool/__init__.py +++ b/scripts/tracetool/__init__.py @@ -31,14 +31,28 @@ def error(*lines): sys.exit(1) +out_filename = '<none>' +out_fobj = sys.stdout + +def out_open(filename): + global out_filename, out_fobj + out_filename = filename + out_fobj = open(filename, 'wt') + def out(*lines, **kwargs): """Write a set of output lines. You can use kwargs as a shorthand for mapping variables when formating all the strings in lines. + + The 'out_filename' kwarg is automatically added with the output filename. """ - lines = [ l % kwargs for l in lines ] - sys.stdout.writelines("\n".join(lines) + "\n") + output = [] + for l in lines: + kwargs['out_filename'] = out_filename + output.append(l % kwargs) + + out_fobj.writelines("\n".join(output) + "\n") # We only want to allow standard C types or fixed sized # integer types. We don't want QEMU specific types diff --git a/trace/meson.build b/trace/meson.build index 56e870848e..16eccc0c22 100644 --- a/trace/meson.build +++ b/trace/meson.build @@ -11,20 +11,17 @@ foreach dir : [ '.' ] + trace_events_subdirs trace_h = custom_target(fmt.format('trace', 'h'), output: fmt.format('trace', 'h'), input: trace_events_file, - command: [ tracetool, group, '--format=h', '@INPUT@' ], - capture: true) + command: [ tracetool, group, '--format=h', '@INPUT@', '@OUTPUT@' ]) genh += trace_h trace_c = custom_target(fmt.format('trace', 'c'), output: fmt.format('trace', 'c'), input: trace_events_file, - command: [ tracetool, group, '--format=c', '@INPUT@' ], - capture: true) + command: [ tracetool, group, '--format=c', '@INPUT@', '@OUTPUT@' ]) if 'CONFIG_TRACE_UST' in config_host trace_ust_h = custom_target(fmt.format('trace-ust', 'h'), output: fmt.format('trace-ust', 'h'), input: trace_events_file, - command: [ tracetool, group, '--format=ust-events-h', '@INPUT@' ], - capture: true) + command: [ tracetool, group, '--format=ust-events-h', '@INPUT@', '@OUTPUT@' ]) trace_ss.add(trace_ust_h, lttng, urcubp) genh += trace_ust_h endif @@ -33,8 +30,7 @@ foreach dir : [ '.' ] + trace_events_subdirs trace_dtrace = custom_target(fmt.format('trace-dtrace', 'dtrace'), output: fmt.format('trace-dtrace', 'dtrace'), input: trace_events_file, - command: [ tracetool, group, '--format=d', '@INPUT@' ], - capture: true) + command: [ tracetool, group, '--format=d', '@INPUT@', '@OUTPUT@' ]) trace_dtrace_h = custom_target(fmt.format('trace-dtrace', 'h'), output: fmt.format('trace-dtrace', 'h'), input: trace_dtrace, @@ -66,9 +62,8 @@ foreach d : [ gen = custom_target(d[0], output: d[0], input: meson.source_root() / 'trace-events', - command: [ tracetool, '--group=root', '--format=@0@'.format(d[1]), '@INPUT@' ], - build_by_default: true, # to be removed when added to a target - capture: true) + command: [ tracetool, '--group=root', '--format=@0@'.format(d[1]), '@INPUT@', '@OUTPUT@' ], + build_by_default: true) # to be removed when added to a target specific_ss.add(gen) endforeach @@ -76,13 +71,11 @@ if 'CONFIG_TRACE_UST' in config_host trace_ust_all_h = custom_target('trace-ust-all.h', output: 'trace-ust-all.h', input: trace_events_files, - command: [ tracetool, '--group=all', '--format=ust-events-h', '@INPUT@' ], - capture: true) + command: [ tracetool, '--group=all', '--format=ust-events-h', '@INPUT@', '@OUTPUT@' ]) trace_ust_all_c = custom_target('trace-ust-all.c', output: 'trace-ust-all.c', input: trace_events_files, - command: [ tracetool, '--group=all', '--format=ust-events-c', '@INPUT@' ], - capture: true) + command: [ tracetool, '--group=all', '--format=ust-events-c', '@INPUT@', '@OUTPUT@' ]) trace_ss.add(trace_ust_all_h, trace_ust_all_c) genh += trace_ust_all_h endif -- 2.26.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 1/4] tracetool: add output filename command-line argument 2020-08-27 14:29 ` [PATCH 1/4] tracetool: add output filename command-line argument Stefan Hajnoczi @ 2020-08-31 20:17 ` Philippe Mathieu-Daudé 2020-09-01 12:55 ` Peter Maydell 1 sibling, 0 replies; 14+ messages in thread From: Philippe Mathieu-Daudé @ 2020-08-31 20:17 UTC (permalink / raw) To: Stefan Hajnoczi Cc: Peter Maydell, Cleber Rosa, qemu-devel@nongnu.org Developers, Eduardo Habkost [-- Attachment #1: Type: text/plain, Size: 9491 bytes --] Le jeu. 27 août 2020 16:30, Stefan Hajnoczi <stefanha@redhat.com> a écrit : > The tracetool.py script writes to stdout. This means the output filename > is not available to the script. Add the output filename to the > command-line so that the script has access to the filename. > > This also simplifies the tracetool.py invocation. It's no longer > necessary to use meson's custom_build(capture : true) to save output. > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > docs/devel/tracing.txt | 3 ++- > meson.build | 3 +-- > scripts/tracetool.py | 12 +++++++----- > scripts/tracetool/__init__.py | 18 ++++++++++++++++-- > trace/meson.build | 23 ++++++++--------------- > 5 files changed, 34 insertions(+), 25 deletions(-) > > diff --git a/docs/devel/tracing.txt b/docs/devel/tracing.txt > index 6144d9921b..c84d4c00ac 100644 > --- a/docs/devel/tracing.txt > +++ b/docs/devel/tracing.txt > @@ -318,7 +318,8 @@ probes: > --target-type system \ > --target-name x86_64 \ > --group=all \ > - trace-events-all >qemu.stp > + trace-events-all \ > + qemu.stp > > To facilitate simple usage of systemtap where there merely needs to be > printf > logging of certain probes, a helper script "qemu-trace-stap" is provided. > diff --git a/meson.build b/meson.build > index f0fe5f8799..fadeb0c268 100644 > --- a/meson.build > +++ b/meson.build > @@ -1037,7 +1037,6 @@ foreach target : target_dirs > custom_target(exe_name + stp['ext'], > input: trace_events_all, > output: exe_name + stp['ext'], > - capture: true, > install: stp['install'], > install_dir: config_host['qemu_datadir'] / > '../systemtap/tapset', > command: [ > @@ -1046,7 +1045,7 @@ foreach target : target_dirs > '--target-name=' + target_name, > '--target-type=' + target_type, > '--probe-prefix=qemu.' + target_type + '.' + > target_name, > - '@INPUT@', > + '@INPUT@', '@OUTPUT@' > ]) > endforeach > endif > diff --git a/scripts/tracetool.py b/scripts/tracetool.py > index 31146242b7..ab7653a5ce 100644 > --- a/scripts/tracetool.py > +++ b/scripts/tracetool.py > @@ -16,7 +16,7 @@ __email__ = "stefanha@redhat.com" > import sys > import getopt > > -from tracetool import error_write, out > +from tracetool import error_write, out, out_open > import tracetool.backend > import tracetool.format > > @@ -32,7 +32,7 @@ def error_opt(msg = None): > format_descr = "\n".join([ " %-15s %s" % (n, d) > for n,d in tracetool.format.get_list() ]) > error_write("""\ > -Usage: %(script)s --format=<format> --backends=<backends> [<options>] > +Usage: %(script)s --format=<format> --backends=<backends> [<options>] > <trace-events> ... <output> > > Backends: > %(backends)s > @@ -135,13 +135,15 @@ def main(args): > if probe_prefix is None: > probe_prefix = ".".join(["qemu", target_type, target_name]) > > - if len(args) < 1: > - error_opt("missing trace-events filepath") > + if len(args) < 2: > + error_opt("missing trace-events and output filepaths") > events = [] > - for arg in args: > + for arg in args[:-1]: > with open(arg, "r") as fh: > events.extend(tracetool.read_events(fh, arg)) > > + out_open(args[-1]) > + > try: > tracetool.generate(events, arg_group, arg_format, arg_backends, > binary=binary, probe_prefix=probe_prefix) > diff --git a/scripts/tracetool/__init__.py b/scripts/tracetool/__init__.py > index 3ccfa1e116..98104fa50e 100644 > --- a/scripts/tracetool/__init__.py > +++ b/scripts/tracetool/__init__.py > @@ -31,14 +31,28 @@ def error(*lines): > sys.exit(1) > > > +out_filename = '<none>' > +out_fobj = sys.stdout > These appear to be always overwritten (is initialization useful?) Anyway: Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> + > +def out_open(filename): > + global out_filename, out_fobj > + out_filename = filename > + out_fobj = open(filename, 'wt') > + > def out(*lines, **kwargs): > """Write a set of output lines. > > You can use kwargs as a shorthand for mapping variables when > formating all > the strings in lines. > + > + The 'out_filename' kwarg is automatically added with the output > filename. > """ > - lines = [ l % kwargs for l in lines ] > - sys.stdout.writelines("\n".join(lines) + "\n") > + output = [] > + for l in lines: > + kwargs['out_filename'] = out_filename > + output.append(l % kwargs) > + > + out_fobj.writelines("\n".join(output) + "\n") > > # We only want to allow standard C types or fixed sized > # integer types. We don't want QEMU specific types > diff --git a/trace/meson.build b/trace/meson.build > index 56e870848e..16eccc0c22 100644 > --- a/trace/meson.build > +++ b/trace/meson.build > @@ -11,20 +11,17 @@ foreach dir : [ '.' ] + trace_events_subdirs > trace_h = custom_target(fmt.format('trace', 'h'), > output: fmt.format('trace', 'h'), > input: trace_events_file, > - command: [ tracetool, group, '--format=h', > '@INPUT@' ], > - capture: true) > + command: [ tracetool, group, '--format=h', > '@INPUT@', '@OUTPUT@' ]) > genh += trace_h > trace_c = custom_target(fmt.format('trace', 'c'), > output: fmt.format('trace', 'c'), > input: trace_events_file, > - command: [ tracetool, group, '--format=c', > '@INPUT@' ], > - capture: true) > + command: [ tracetool, group, '--format=c', > '@INPUT@', '@OUTPUT@' ]) > if 'CONFIG_TRACE_UST' in config_host > trace_ust_h = custom_target(fmt.format('trace-ust', 'h'), > output: fmt.format('trace-ust', 'h'), > input: trace_events_file, > - command: [ tracetool, group, > '--format=ust-events-h', '@INPUT@' ], > - capture: true) > + command: [ tracetool, group, > '--format=ust-events-h', '@INPUT@', '@OUTPUT@' ]) > trace_ss.add(trace_ust_h, lttng, urcubp) > genh += trace_ust_h > endif > @@ -33,8 +30,7 @@ foreach dir : [ '.' ] + trace_events_subdirs > trace_dtrace = custom_target(fmt.format('trace-dtrace', 'dtrace'), > output: fmt.format('trace-dtrace', > 'dtrace'), > input: trace_events_file, > - command: [ tracetool, group, > '--format=d', '@INPUT@' ], > - capture: true) > + command: [ tracetool, group, > '--format=d', '@INPUT@', '@OUTPUT@' ]) > trace_dtrace_h = custom_target(fmt.format('trace-dtrace', 'h'), > output: fmt.format('trace-dtrace', > 'h'), > input: trace_dtrace, > @@ -66,9 +62,8 @@ foreach d : [ > gen = custom_target(d[0], > output: d[0], > input: meson.source_root() / 'trace-events', > - command: [ tracetool, '--group=root', '--format=@0@'.format(d[1]), > '@INPUT@' ], > - build_by_default: true, # to be removed when added to a > target > - capture: true) > + command: [ tracetool, '--group=root', '--format=@0@'.format(d[1]), > '@INPUT@', '@OUTPUT@' ], > + build_by_default: true) # to be removed when added to a > target > specific_ss.add(gen) > endforeach > > @@ -76,13 +71,11 @@ if 'CONFIG_TRACE_UST' in config_host > trace_ust_all_h = custom_target('trace-ust-all.h', > output: 'trace-ust-all.h', > input: trace_events_files, > - command: [ tracetool, '--group=all', > '--format=ust-events-h', '@INPUT@' ], > - capture: true) > + command: [ tracetool, '--group=all', > '--format=ust-events-h', '@INPUT@', '@OUTPUT@' ]) > trace_ust_all_c = custom_target('trace-ust-all.c', > output: 'trace-ust-all.c', > input: trace_events_files, > - command: [ tracetool, '--group=all', > '--format=ust-events-c', '@INPUT@' ], > - capture: true) > + command: [ tracetool, '--group=all', > '--format=ust-events-c', '@INPUT@', '@OUTPUT@' ]) > trace_ss.add(trace_ust_all_h, trace_ust_all_c) > genh += trace_ust_all_h > endif > -- > 2.26.2 > > [-- Attachment #2: Type: text/html, Size: 12845 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/4] tracetool: add output filename command-line argument 2020-08-27 14:29 ` [PATCH 1/4] tracetool: add output filename command-line argument Stefan Hajnoczi 2020-08-31 20:17 ` Philippe Mathieu-Daudé @ 2020-09-01 12:55 ` Peter Maydell 1 sibling, 0 replies; 14+ messages in thread From: Peter Maydell @ 2020-09-01 12:55 UTC (permalink / raw) To: Stefan Hajnoczi; +Cc: QEMU Developers, Eduardo Habkost, Cleber Rosa On Thu, 27 Aug 2020 at 15:29, Stefan Hajnoczi <stefanha@redhat.com> wrote: > > The tracetool.py script writes to stdout. This means the output filename > is not available to the script. Add the output filename to the > command-line so that the script has access to the filename. > > This also simplifies the tracetool.py invocation. It's no longer > necessary to use meson's custom_build(capture : true) to save output. > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- Reviewed-by: Peter Maydell <peter.maydell@linaro.org> thanks -- PMM ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 2/4] tracetool: add out_lineno and out_next_lineno to out() 2020-08-27 14:29 [PATCH 0/4] tracetool: show trace-events filename/lineno in fmt string errors Stefan Hajnoczi 2020-08-27 14:29 ` [PATCH 1/4] tracetool: add output filename command-line argument Stefan Hajnoczi @ 2020-08-27 14:29 ` Stefan Hajnoczi 2020-09-01 12:49 ` Peter Maydell 2020-08-27 14:29 ` [PATCH 3/4] tracetool: add input filename and line number to Event Stefan Hajnoczi ` (2 subsequent siblings) 4 siblings, 1 reply; 14+ messages in thread From: Stefan Hajnoczi @ 2020-08-27 14:29 UTC (permalink / raw) To: qemu-devel; +Cc: Peter Maydell, Eduardo Habkost, Stefan Hajnoczi, Cleber Rosa Make the output file line number and next line number available to out(). A later patch will use this to improve error messages. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- scripts/tracetool/__init__.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/scripts/tracetool/__init__.py b/scripts/tracetool/__init__.py index 98104fa50e..e4ee4d5e61 100644 --- a/scripts/tracetool/__init__.py +++ b/scripts/tracetool/__init__.py @@ -31,6 +31,7 @@ def error(*lines): sys.exit(1) +out_lineno = 1 out_filename = '<none>' out_fobj = sys.stdout @@ -45,12 +46,19 @@ def out(*lines, **kwargs): You can use kwargs as a shorthand for mapping variables when formating all the strings in lines. - The 'out_filename' kwarg is automatically added with the output filename. + The 'out_lineno' kwarg is automatically added to reflect the current output + file line number. The 'out_next_lineno' kwarg is also automatically added + with the next output line number. The 'out_filename' kwarg is automatically + added with the output filename. """ + global out_lineno output = [] for l in lines: + kwargs['out_lineno'] = out_lineno + kwargs['out_next_lineno'] = out_lineno + 1 kwargs['out_filename'] = out_filename output.append(l % kwargs) + out_lineno += 1 out_fobj.writelines("\n".join(output) + "\n") -- 2.26.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 2/4] tracetool: add out_lineno and out_next_lineno to out() 2020-08-27 14:29 ` [PATCH 2/4] tracetool: add out_lineno and out_next_lineno to out() Stefan Hajnoczi @ 2020-09-01 12:49 ` Peter Maydell 0 siblings, 0 replies; 14+ messages in thread From: Peter Maydell @ 2020-09-01 12:49 UTC (permalink / raw) To: Stefan Hajnoczi; +Cc: QEMU Developers, Eduardo Habkost, Cleber Rosa On Thu, 27 Aug 2020 at 15:29, Stefan Hajnoczi <stefanha@redhat.com> wrote: > > Make the output file line number and next line number available to > out(). > > A later patch will use this to improve error messages. > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> thanks -- PMM ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 3/4] tracetool: add input filename and line number to Event 2020-08-27 14:29 [PATCH 0/4] tracetool: show trace-events filename/lineno in fmt string errors Stefan Hajnoczi 2020-08-27 14:29 ` [PATCH 1/4] tracetool: add output filename command-line argument Stefan Hajnoczi 2020-08-27 14:29 ` [PATCH 2/4] tracetool: add out_lineno and out_next_lineno to out() Stefan Hajnoczi @ 2020-08-27 14:29 ` Stefan Hajnoczi 2020-08-31 20:20 ` Philippe Mathieu-Daudé 2020-09-01 12:50 ` Peter Maydell 2020-08-27 14:29 ` [PATCH 4/4] tracetool: show trace-events filename/lineno in fmt string errors Stefan Hajnoczi 2020-12-08 14:20 ` [PATCH 0/4] " Stefan Hajnoczi 4 siblings, 2 replies; 14+ messages in thread From: Stefan Hajnoczi @ 2020-08-27 14:29 UTC (permalink / raw) To: qemu-devel; +Cc: Peter Maydell, Eduardo Habkost, Stefan Hajnoczi, Cleber Rosa Store the input filename and line number in Event. A later patch will use this to improve error messages. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- scripts/tracetool/__init__.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/scripts/tracetool/__init__.py b/scripts/tracetool/__init__.py index e4ee4d5e61..1a6e2fa64a 100644 --- a/scripts/tracetool/__init__.py +++ b/scripts/tracetool/__init__.py @@ -218,6 +218,10 @@ class Event(object): Properties of the event. args : Arguments The event arguments. + lineno : int + The line number in the input file. + filename : str + The path to the input file. """ @@ -230,7 +234,7 @@ class Event(object): _VALID_PROPS = set(["disable", "tcg", "tcg-trans", "tcg-exec", "vcpu"]) - def __init__(self, name, props, fmt, args, orig=None, + def __init__(self, name, props, fmt, args, lineno, filename, orig=None, event_trans=None, event_exec=None): """ Parameters @@ -243,6 +247,10 @@ class Event(object): Event printing format string(s). args : Arguments Event arguments. + lineno : int + The line number in the input file. + filename : str + The path to the input file. orig : Event or None Original Event before transformation/generation. event_trans : Event or None @@ -255,6 +263,8 @@ class Event(object): self.properties = props self.fmt = fmt self.args = args + self.lineno = int(lineno) + self.filename = str(filename) self.event_trans = event_trans self.event_exec = event_exec @@ -276,16 +286,21 @@ class Event(object): def copy(self): """Create a new copy.""" return Event(self.name, list(self.properties), self.fmt, - self.args.copy(), self, self.event_trans, self.event_exec) + self.args.copy(), self.lineno, self.filename, + self, self.event_trans, self.event_exec) @staticmethod - def build(line_str): + def build(line_str, lineno, filename): """Build an Event instance from a string. Parameters ---------- line_str : str Line describing the event. + lineno : int + Line number in input file. + filename : str + Path to input file. """ m = Event._CRE.match(line_str) assert m is not None @@ -315,7 +330,7 @@ class Event(object): if "tcg" in props and isinstance(fmt, str): raise ValueError("Events with 'tcg' property must have two format strings") - event = Event(name, props, fmt, args) + event = Event(name, props, fmt, args, lineno, filename) # add implicit arguments when using the 'vcpu' property import tracetool.vcpu @@ -360,6 +375,8 @@ class Event(object): list(self.properties), self.fmt, self.args.transform(*trans), + self.lineno, + self.filename, self) @@ -386,7 +403,7 @@ def read_events(fobj, fname): continue try: - event = Event.build(line) + event = Event.build(line, lineno, fname) except ValueError as e: arg0 = 'Error at %s:%d: %s' % (fname, lineno, e.args[0]) e.args = (arg0,) + e.args[1:] -- 2.26.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 3/4] tracetool: add input filename and line number to Event 2020-08-27 14:29 ` [PATCH 3/4] tracetool: add input filename and line number to Event Stefan Hajnoczi @ 2020-08-31 20:20 ` Philippe Mathieu-Daudé 2020-09-01 12:50 ` Peter Maydell 1 sibling, 0 replies; 14+ messages in thread From: Philippe Mathieu-Daudé @ 2020-08-31 20:20 UTC (permalink / raw) To: Stefan Hajnoczi Cc: Peter Maydell, Cleber Rosa, qemu-devel@nongnu.org Developers, Eduardo Habkost [-- Attachment #1: Type: text/plain, Size: 4036 bytes --] Le jeu. 27 août 2020 16:32, Stefan Hajnoczi <stefanha@redhat.com> a écrit : > Store the input filename and line number in Event. > > A later patch will use this to improve error messages. > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> --- > scripts/tracetool/__init__.py | 27 ++++++++++++++++++++++----- > 1 file changed, 22 insertions(+), 5 deletions(-) > > diff --git a/scripts/tracetool/__init__.py b/scripts/tracetool/__init__.py > index e4ee4d5e61..1a6e2fa64a 100644 > --- a/scripts/tracetool/__init__.py > +++ b/scripts/tracetool/__init__.py > @@ -218,6 +218,10 @@ class Event(object): > Properties of the event. > args : Arguments > The event arguments. > + lineno : int > + The line number in the input file. > + filename : str > + The path to the input file. > > """ > > @@ -230,7 +234,7 @@ class Event(object): > > _VALID_PROPS = set(["disable", "tcg", "tcg-trans", "tcg-exec", > "vcpu"]) > > - def __init__(self, name, props, fmt, args, orig=None, > + def __init__(self, name, props, fmt, args, lineno, filename, > orig=None, > event_trans=None, event_exec=None): > """ > Parameters > @@ -243,6 +247,10 @@ class Event(object): > Event printing format string(s). > args : Arguments > Event arguments. > + lineno : int > + The line number in the input file. > + filename : str > + The path to the input file. > orig : Event or None > Original Event before transformation/generation. > event_trans : Event or None > @@ -255,6 +263,8 @@ class Event(object): > self.properties = props > self.fmt = fmt > self.args = args > + self.lineno = int(lineno) > + self.filename = str(filename) > self.event_trans = event_trans > self.event_exec = event_exec > > @@ -276,16 +286,21 @@ class Event(object): > def copy(self): > """Create a new copy.""" > return Event(self.name, list(self.properties), self.fmt, > - self.args.copy(), self, self.event_trans, > self.event_exec) > + self.args.copy(), self.lineno, self.filename, > + self, self.event_trans, self.event_exec) > > @staticmethod > - def build(line_str): > + def build(line_str, lineno, filename): > """Build an Event instance from a string. > > Parameters > ---------- > line_str : str > Line describing the event. > + lineno : int > + Line number in input file. > + filename : str > + Path to input file. > """ > m = Event._CRE.match(line_str) > assert m is not None > @@ -315,7 +330,7 @@ class Event(object): > if "tcg" in props and isinstance(fmt, str): > raise ValueError("Events with 'tcg' property must have two > format strings") > > - event = Event(name, props, fmt, args) > + event = Event(name, props, fmt, args, lineno, filename) > > # add implicit arguments when using the 'vcpu' property > import tracetool.vcpu > @@ -360,6 +375,8 @@ class Event(object): > list(self.properties), > self.fmt, > self.args.transform(*trans), > + self.lineno, > + self.filename, > self) > > > @@ -386,7 +403,7 @@ def read_events(fobj, fname): > continue > > try: > - event = Event.build(line) > + event = Event.build(line, lineno, fname) > except ValueError as e: > arg0 = 'Error at %s:%d: %s' % (fname, lineno, e.args[0]) > e.args = (arg0,) + e.args[1:] > -- > 2.26.2 > > [-- Attachment #2: Type: text/html, Size: 5768 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 3/4] tracetool: add input filename and line number to Event 2020-08-27 14:29 ` [PATCH 3/4] tracetool: add input filename and line number to Event Stefan Hajnoczi 2020-08-31 20:20 ` Philippe Mathieu-Daudé @ 2020-09-01 12:50 ` Peter Maydell 1 sibling, 0 replies; 14+ messages in thread From: Peter Maydell @ 2020-09-01 12:50 UTC (permalink / raw) To: Stefan Hajnoczi; +Cc: QEMU Developers, Eduardo Habkost, Cleber Rosa On Thu, 27 Aug 2020 at 15:29, Stefan Hajnoczi <stefanha@redhat.com> wrote: > > Store the input filename and line number in Event. > > A later patch will use this to improve error messages. > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> thanks -- PMM ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 4/4] tracetool: show trace-events filename/lineno in fmt string errors 2020-08-27 14:29 [PATCH 0/4] tracetool: show trace-events filename/lineno in fmt string errors Stefan Hajnoczi ` (2 preceding siblings ...) 2020-08-27 14:29 ` [PATCH 3/4] tracetool: add input filename and line number to Event Stefan Hajnoczi @ 2020-08-27 14:29 ` Stefan Hajnoczi 2020-08-27 14:59 ` Peter Maydell 2020-09-01 12:52 ` Peter Maydell 2020-12-08 14:20 ` [PATCH 0/4] " Stefan Hajnoczi 4 siblings, 2 replies; 14+ messages in thread From: Stefan Hajnoczi @ 2020-08-27 14:29 UTC (permalink / raw) To: qemu-devel; +Cc: Peter Maydell, Eduardo Habkost, Stefan Hajnoczi, Cleber Rosa The compiler encounters trace event format strings in generated code. Format strings are error-prone and therefore clear compiler errors are important. Use the #line directive to show the trace-events filename and line number in format string errors: https://gcc.gnu.org/onlinedocs/gcc-10.2.0/cpp/Line-Control.html For example, if the cpu_in trace event's %u is changed to %p the following error is reported: trace-events:29:18: error: format ‘%p’ expects argument of type ‘void *’, but argument 7 has type ‘unsigned int’ [-Werror=format=] Line 29 in trace-events is where cpu_in is defined. This works for any trace-events file in the QEMU source tree and the correct path is displayed. Unfortunately there does not seem to be a way to set the column, so "18" is not the right character on that line. Suggested-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- scripts/tracetool/backend/ftrace.py | 4 ++++ scripts/tracetool/backend/log.py | 4 ++++ scripts/tracetool/backend/syslog.py | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/scripts/tracetool/backend/ftrace.py b/scripts/tracetool/backend/ftrace.py index e9844dd335..5fa30ccc08 100644 --- a/scripts/tracetool/backend/ftrace.py +++ b/scripts/tracetool/backend/ftrace.py @@ -33,8 +33,10 @@ def generate_h(event, group): ' int unused __attribute__ ((unused));', ' int trlen;', ' if (trace_event_get_state(%(event_id)s)) {', + '#line %(event_lineno)d "%(event_filename)s"', ' trlen = snprintf(ftrace_buf, MAX_TRACE_STRLEN,', ' "%(name)s " %(fmt)s "\\n" %(argnames)s);', + '#line %(out_next_lineno)d "%(out_filename)s"', ' trlen = MIN(trlen, MAX_TRACE_STRLEN - 1);', ' unused = write(trace_marker_fd, ftrace_buf, trlen);', ' }', @@ -42,6 +44,8 @@ def generate_h(event, group): name=event.name, args=event.args, event_id="TRACE_" + event.name.upper(), + event_lineno=event.lineno, + event_filename=event.filename, fmt=event.fmt.rstrip("\n"), argnames=argnames) diff --git a/scripts/tracetool/backend/log.py b/scripts/tracetool/backend/log.py index 877222bbe9..bc43dbb4f4 100644 --- a/scripts/tracetool/backend/log.py +++ b/scripts/tracetool/backend/log.py @@ -37,12 +37,16 @@ def generate_h(event, group): out(' if (%(cond)s && qemu_loglevel_mask(LOG_TRACE)) {', ' struct timeval _now;', ' gettimeofday(&_now, NULL);', + '#line %(event_lineno)d "%(event_filename)s"', ' qemu_log("%%d@%%zu.%%06zu:%(name)s " %(fmt)s "\\n",', ' qemu_get_thread_id(),', ' (size_t)_now.tv_sec, (size_t)_now.tv_usec', ' %(argnames)s);', + '#line %(out_next_lineno)d "%(out_filename)s"', ' }', cond=cond, + event_lineno=event.lineno, + event_filename=event.filename, name=event.name, fmt=event.fmt.rstrip("\n"), argnames=argnames) diff --git a/scripts/tracetool/backend/syslog.py b/scripts/tracetool/backend/syslog.py index 1373a90192..5a3a00fe31 100644 --- a/scripts/tracetool/backend/syslog.py +++ b/scripts/tracetool/backend/syslog.py @@ -35,9 +35,13 @@ def generate_h(event, group): cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper()) out(' if (%(cond)s) {', + '#line %(event_lineno)d "%(event_filename)s"', ' syslog(LOG_INFO, "%(name)s " %(fmt)s %(argnames)s);', + '#line %(out_next_lineno)d "%(out_filename)s"', ' }', cond=cond, + event_lineno=event.lineno, + event_filename=event.filename, name=event.name, fmt=event.fmt.rstrip("\n"), argnames=argnames) -- 2.26.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 4/4] tracetool: show trace-events filename/lineno in fmt string errors 2020-08-27 14:29 ` [PATCH 4/4] tracetool: show trace-events filename/lineno in fmt string errors Stefan Hajnoczi @ 2020-08-27 14:59 ` Peter Maydell 2020-08-28 15:36 ` Stefan Hajnoczi 2020-09-01 12:52 ` Peter Maydell 1 sibling, 1 reply; 14+ messages in thread From: Peter Maydell @ 2020-08-27 14:59 UTC (permalink / raw) To: Stefan Hajnoczi; +Cc: QEMU Developers, Eduardo Habkost, Cleber Rosa On Thu, 27 Aug 2020 at 15:29, Stefan Hajnoczi <stefanha@redhat.com> wrote: > > The compiler encounters trace event format strings in generated code. > Format strings are error-prone and therefore clear compiler errors are > important. > > Use the #line directive to show the trace-events filename and line > number in format string errors: > https://gcc.gnu.org/onlinedocs/gcc-10.2.0/cpp/Line-Control.html > > For example, if the cpu_in trace event's %u is changed to %p the > following error is reported: > > trace-events:29:18: error: format ‘%p’ expects argument of type ‘void *’, but argument 7 has type ‘unsigned int’ [-Werror=format=] > > Line 29 in trace-events is where cpu_in is defined. This works for any > trace-events file in the QEMU source tree and the correct path is > displayed. > > Unfortunately there does not seem to be a way to set the column, so "18" > is not the right character on that line. It's been pointed out to me that you could do this by making the generated code have suitable line breaks, padding, etc, so that the format string in the output ends up starting in the same column it was in the input trace file. Whether this is worthwhile I leave up to you :-) (The argument number (7 in your example) is also of course off, and that I think we're also stuck with. Getting the file and line number right is a solid improvement on the current situation.) thanks -- PMM ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/4] tracetool: show trace-events filename/lineno in fmt string errors 2020-08-27 14:59 ` Peter Maydell @ 2020-08-28 15:36 ` Stefan Hajnoczi 0 siblings, 0 replies; 14+ messages in thread From: Stefan Hajnoczi @ 2020-08-28 15:36 UTC (permalink / raw) To: Peter Maydell; +Cc: QEMU Developers, Eduardo Habkost, Cleber Rosa [-- Attachment #1: Type: text/plain, Size: 1654 bytes --] On Thu, Aug 27, 2020 at 03:59:04PM +0100, Peter Maydell wrote: > On Thu, 27 Aug 2020 at 15:29, Stefan Hajnoczi <stefanha@redhat.com> wrote: > > > > The compiler encounters trace event format strings in generated code. > > Format strings are error-prone and therefore clear compiler errors are > > important. > > > > Use the #line directive to show the trace-events filename and line > > number in format string errors: > > https://gcc.gnu.org/onlinedocs/gcc-10.2.0/cpp/Line-Control.html > > > > For example, if the cpu_in trace event's %u is changed to %p the > > following error is reported: > > > > trace-events:29:18: error: format ‘%p’ expects argument of type ‘void *’, but argument 7 has type ‘unsigned int’ [-Werror=format=] > > > > Line 29 in trace-events is where cpu_in is defined. This works for any > > trace-events file in the QEMU source tree and the correct path is > > displayed. > > > > Unfortunately there does not seem to be a way to set the column, so "18" > > is not the right character on that line. > > It's been pointed out to me that you could do this by > making the generated code have suitable line breaks, padding, > etc, so that the format string in the output ends up starting in > the same column it was in the input trace file. Whether this is > worthwhile I leave up to you :-) > > (The argument number (7 in your example) is also of course off, > and that I think we're also stuck with. Getting the file and line > number right is a solid improvement on the current situation.) Thanks for mentioning that trick. I will leave the patch series as-is for now. Stefan [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 488 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/4] tracetool: show trace-events filename/lineno in fmt string errors 2020-08-27 14:29 ` [PATCH 4/4] tracetool: show trace-events filename/lineno in fmt string errors Stefan Hajnoczi 2020-08-27 14:59 ` Peter Maydell @ 2020-09-01 12:52 ` Peter Maydell 1 sibling, 0 replies; 14+ messages in thread From: Peter Maydell @ 2020-09-01 12:52 UTC (permalink / raw) To: Stefan Hajnoczi; +Cc: QEMU Developers, Eduardo Habkost, Cleber Rosa On Thu, 27 Aug 2020 at 15:29, Stefan Hajnoczi <stefanha@redhat.com> wrote: > > The compiler encounters trace event format strings in generated code. > Format strings are error-prone and therefore clear compiler errors are > important. > > Use the #line directive to show the trace-events filename and line > number in format string errors: > https://gcc.gnu.org/onlinedocs/gcc-10.2.0/cpp/Line-Control.html > > For example, if the cpu_in trace event's %u is changed to %p the > following error is reported: > > trace-events:29:18: error: format ‘%p’ expects argument of type ‘void *’, but argument 7 has type ‘unsigned int’ [-Werror=format=] > > Line 29 in trace-events is where cpu_in is defined. This works for any > trace-events file in the QEMU source tree and the correct path is > displayed. > > Unfortunately there does not seem to be a way to set the column, so "18" > is not the right character on that line. > > Suggested-by: Peter Maydell <peter.maydell@linaro.org> > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- Reviewed-by: Peter Maydell <peter.maydell@linaro.org> thanks -- PMM ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 0/4] tracetool: show trace-events filename/lineno in fmt string errors 2020-08-27 14:29 [PATCH 0/4] tracetool: show trace-events filename/lineno in fmt string errors Stefan Hajnoczi ` (3 preceding siblings ...) 2020-08-27 14:29 ` [PATCH 4/4] tracetool: show trace-events filename/lineno in fmt string errors Stefan Hajnoczi @ 2020-12-08 14:20 ` Stefan Hajnoczi 4 siblings, 0 replies; 14+ messages in thread From: Stefan Hajnoczi @ 2020-12-08 14:20 UTC (permalink / raw) To: qemu-devel; +Cc: Peter Maydell, Eduardo Habkost, Cleber Rosa [-- Attachment #1: Type: text/plain, Size: 1143 bytes --] On Thu, Aug 27, 2020 at 03:29:11PM +0100, Stefan Hajnoczi wrote: > This patch series improves format string compiler error messages. Instead of > showing the generated file, show the trace-events file where the format string > is defined. > > Stefan Hajnoczi (4): > tracetool: add output filename command-line argument > tracetool: add out_lineno and out_next_lineno to out() > tracetool: add input filename and line number to Event > tracetool: show trace-events filename/lineno in fmt string errors > > docs/devel/tracing.txt | 3 +- > meson.build | 3 +- > scripts/tracetool.py | 12 ++++--- > scripts/tracetool/__init__.py | 53 +++++++++++++++++++++++++---- > scripts/tracetool/backend/ftrace.py | 4 +++ > scripts/tracetool/backend/log.py | 4 +++ > scripts/tracetool/backend/syslog.py | 4 +++ > trace/meson.build | 23 +++++-------- > 8 files changed, 76 insertions(+), 30 deletions(-) > > -- > 2.26.2 > Thanks, applied to my tracing-next tree: https://gitlab.com/stefanha/qemu/commits/tracing-next Stefan [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 488 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2020-12-08 14:21 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-08-27 14:29 [PATCH 0/4] tracetool: show trace-events filename/lineno in fmt string errors Stefan Hajnoczi 2020-08-27 14:29 ` [PATCH 1/4] tracetool: add output filename command-line argument Stefan Hajnoczi 2020-08-31 20:17 ` Philippe Mathieu-Daudé 2020-09-01 12:55 ` Peter Maydell 2020-08-27 14:29 ` [PATCH 2/4] tracetool: add out_lineno and out_next_lineno to out() Stefan Hajnoczi 2020-09-01 12:49 ` Peter Maydell 2020-08-27 14:29 ` [PATCH 3/4] tracetool: add input filename and line number to Event Stefan Hajnoczi 2020-08-31 20:20 ` Philippe Mathieu-Daudé 2020-09-01 12:50 ` Peter Maydell 2020-08-27 14:29 ` [PATCH 4/4] tracetool: show trace-events filename/lineno in fmt string errors Stefan Hajnoczi 2020-08-27 14:59 ` Peter Maydell 2020-08-28 15:36 ` Stefan Hajnoczi 2020-09-01 12:52 ` Peter Maydell 2020-12-08 14:20 ` [PATCH 0/4] " Stefan Hajnoczi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).