trace: fix "-trace file=..."

Because trace_opt_parse always deletes the options it has parsed,
trace_init_file's call to qemu_find_opts_singleton always
creates an empty -trace option group.  Therefore, the subsequent
qemu_opt_get(opts, "file") always returns NULL.

To fix this, save the last "-trace file=..." option in a global
variable and use it later in trace_init_file.

This is similar to what was done before commit 92eecfff32 ("trace:
remove argument from trace_init_file", 2020-11-11), except contained
within trace/control.c and without memory leaks.

Fixes: 92eecfff32 ("trace: remove argument from trace_init_file", 2020-11-11)
Cc: stefanha@redhat.com
Reported-by: armbru@redhat.com
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <20210209145759.141231-2-pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2021-02-09 15:57:58 +01:00
parent dc1d91ac56
commit 9f45a64109

View File

@ -40,6 +40,7 @@ static size_t nevent_groups;
static uint32_t next_id; static uint32_t next_id;
static uint32_t next_vcpu_id; static uint32_t next_vcpu_id;
static bool init_trace_on_startup; static bool init_trace_on_startup;
static char *trace_opts_file;
QemuOptsList qemu_trace_opts = { QemuOptsList qemu_trace_opts = {
.name = "trace", .name = "trace",
@ -224,10 +225,8 @@ static void trace_init_events(const char *fname)
void trace_init_file(void) void trace_init_file(void)
{ {
QemuOpts *opts = qemu_find_opts_singleton("trace");
const char *file = qemu_opt_get(opts, "file");
#ifdef CONFIG_TRACE_SIMPLE #ifdef CONFIG_TRACE_SIMPLE
st_set_trace_file(file); st_set_trace_file(trace_opts_file);
if (init_trace_on_startup) { if (init_trace_on_startup) {
st_set_trace_file_enabled(true); st_set_trace_file_enabled(true);
} }
@ -238,11 +237,11 @@ void trace_init_file(void)
* backend. However we should only override -D if we actually have * backend. However we should only override -D if we actually have
* something to override it with. * something to override it with.
*/ */
if (file) { if (trace_opts_file) {
qemu_set_log_filename(file, &error_fatal); qemu_set_log_filename(trace_opts_file, &error_fatal);
} }
#else #else
if (file) { if (trace_opts_file) {
fprintf(stderr, "error: --trace file=...: " fprintf(stderr, "error: --trace file=...: "
"option not supported by the selected tracing backends\n"); "option not supported by the selected tracing backends\n");
exit(1); exit(1);
@ -303,6 +302,8 @@ void trace_opt_parse(const char *optarg)
} }
trace_init_events(qemu_opt_get(opts, "events")); trace_init_events(qemu_opt_get(opts, "events"));
init_trace_on_startup = true; init_trace_on_startup = true;
g_free(trace_opts_file);
trace_opts_file = g_strdup(qemu_opt_get(opts, "file"));
qemu_opts_del(opts); qemu_opts_del(opts);
} }