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 commit92eecfff32
("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:
parent
dc1d91ac56
commit
9f45a64109
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user