Add options to specify trace file name at startup and runtime.
PATCH 1/1 Add options to specify trace file name at startup and runtime.
This patch adds an optional command line switch '-trace' to specify the filename to write traces to, when qemu starts.
Eg, If compiled with the 'simple' trace backend,
[temp@system]$ qemu -trace FILENAME IMAGE Allows the binary traces to be written to FILENAME instead of the option set at config-time.
Also, this adds monitor sub-command 'set' to trace-file commands to dynamically change trace log file at runtime.
Eg,
(qemu)trace-file set FILENAME
This allows one to set trace outputs to FILENAME from the default specified at startup.
--- monitor.c | 6 ++++++ qemu-monitor.hx | 6 +++--- qemu-options.hx | 11 +++++++++++ simpletrace.c | 41 ++++++++++++++++++++++++++++++++--------- tracetool | 1 + vl.c | 22 ++++++++++++++++++++++ 6 files changed, 75 insertions(+), 12 deletions(-)
monitor.c +6 -0
@@ -544,6 +544,7 @@ static void do_change_trace_event_state(Monitor *mon, const QDict *qdict)static void do_trace_file (Monitor *mon,const QDict *qdict) {const char *op =qdict_get_try_str (qdict,"op" ); +const char *arg =qdict_get_try_str (qdict,"arg" );if (!op) {st_print_trace_file_status ((FILE *)mon, &monitor_fprintf);
@@ -553,8 +554,13 @@ static void do_trace_file(Monitor *mon, const QDict *qdict) st_set_trace_file_enabled(false); }else if (!strcmp (op,"flush" )) {st_flush_trace_buffer (); + }else if (!strcmp (op,"set" )) { +if (arg) { +st_set_trace_file (arg); + } }else {monitor_printf (mon,"unexpected argument \"%s\"\n" , op); +monitor_printf (mon,"Options are: [on | off| flush| set FILENAME]" ); } }#endif
qemu-monitor.hx +3 -3
@@ -276,9 +276,9 @@ ETEXI { .name = "trace-file", - .args_type = "op:s?", - .params = "op [on|off|flush]", - .help = "open, close, or flush trace file", + .args_type = "op:s?,arg:F?", + .params = "on|off|flush|set [arg]", + .help = "open, close, or flush trace file, or set a new file name", .mhandler.cmd = do_trace_file, },
qemu-options.hx +11 -0
@@ -2223,6 +2223,17 @@ Normally QEMU loads a configuration file from @var{sysconfdir}/qemu.conf and @var{sysconfdir}/target-@var{ARCH}.conf on startup. The @code{-nodefconfig} option will prevent QEMU from loading these configuration files at startup. ETEXI +#ifdef CONFIG_SIMPLE_TRACE +DEF("trace", HAS_ARG, QEMU_OPTION_trace, + "-trace\n" + " Specify a trace file to log traces to\n", + QEMU_ARCH_ALL) +STEXI +@item -trace +@findex -trace +Specify a trace file to log output traces to. +ETEXI +#endif HXCOMM This is the last statement. Insert new options before this line! STEXI
simpletrace.c +32 -9
57 lines not on this page · raw message
tracetool +1 -0
@@ -158,6 +158,7 @@ void st_print_trace_events(FILE *stream, int (*stream_printf)(FILE *stream, cons void st_print_trace_file_status(FILE *stream, int (*stream_printf)(FILE *stream, const char *fmt, ...)); void st_flush_trace_buffer(void); void st_set_trace_file_enabled(bool enable); +bool st_set_trace_file(const char *file); void change_trace_event_state(const char *tname, bool tstate); EOF
vl.c +22 -0
@@ -47,6 +47,10 @@#include <dirent.h> #include <netdb.h> #include <sys/select.h> +#ifdef CONFIG_SIMPLE_TRACE +#include "trace.h" +#endif +#ifdef CONFIG_BSD #include <sys/stat.h> #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
@@ -1822,6 +1826,9 @@ int main(int argc, char **argv, char **envp)int show_vnc_port =0 ;int defconfig =1 ; +#ifdef CONFIG_SIMPLE_TRACE +char *trace_file =NULL ; +#endif atexit (qemu_run_exit_notifiers);error_set_progname (argv[0 ]);
@@ -2590,6 +2597,12 @@ int main(int argc, char **argv, char **envp) } xen_mode =XEN_ATTACH ;break ; +#ifdef CONFIG_SIMPLE_TRACE +case QEMU_OPTION_trace: + trace_file = (char *)qemu_malloc (strlen (optarg) +1 ); +strcpy (trace_file, optarg); +break ; +#endif case QEMU_OPTION_readconfig: {int ret =qemu_read_config_file (optarg);
@@ -2633,6 +2646,15 @@ int main(int argc, char **argv, char **envp) data_dir =CONFIG_QEMU_DATADIR ; } +#ifdef CONFIG_SIMPLE_TRACE +/* +* Set the trace file name, if specified. +*/ +st_set_trace_file (trace_file); +if (trace_file) { +qemu_free (trace_file); + } +#endif /* * Default to max_cpus = smp_cpus, in case the user doesn't * specify a max_cpus value.
Signature · 10 lines
1.6.2.5 -- Prerna Saxena Linux Technology Centre, IBM Systems and Technology Lab, Bangalore, India
Quoted 15 lines · Prerna Saxena
This patch adds an optional command line switch '-trace' to specify the filename to write traces to, when qemu starts.
Eg, If compiled with the 'simple' trace backend,[temp@system]$ qemu -trace FILENAME IMAGE Allows the binary traces to be written to FILENAME instead of the option set at config-time.Also, this adds monitor sub-command 'set' to trace-file commands to dynamically change trace log file at runtime.
Eg,
(qemu)trace-file set FILENAME
This allows one to set trace outputs to FILENAME from the default specified at startup.Signed-off-by Prerna Saxena <[email protected]>
Quoted 8 lines
---
monitor.c | 6 ++++++
qemu-monitor.hx | 6 +++---
qemu-options.hx | 11 +++++++++++
simpletrace.c | 41 ++++++++++++++++++++++++++++++++--------- tracetool | 1 +
vl.c | 22 ++++++++++++++++++++++6 files changed, 75 insertions(+), 12 deletions(-)
Looks like a good approach. I checked that this also handles the case where trace events fire before the command-line option is handled and the trace filename is set.
Quoted 13 lines
monitor.c +1
-0@@ -544,6 +544,7 @@ static void do_change_trace_event_state(Monitor *mon, const QDict *qdict) static void do_trace_file(Monitor *mon, const QDict *qdict) { const char *op = qdict_get_try_str(qdict, "op"); + const char *arg = qdict_get_try_str(qdict, "arg"); if (!op) { st_print_trace_file_status((FILE *)mon, &monitor_fprintf);
monitor.c static void do_trace_file(Monitor *mon, const QDict *qdict) · line 563
Quoted 10 lines
monitor.c +5
-0@@ -553,8 +554,13 @@ static void do_trace_file(Monitor *mon, const QDict *qdict) st_set_trace_file_enabled(false); } else if (!strcmp(op, "flush")) { st_flush_trace_buffer(); + } else if (!strcmp(op, "set")) { + if (arg) { + st_set_trace_file(arg); + } } else { monitor_printf(mon, "unexpected argument \"%s\"\n", op); + monitor_printf(mon, "Options are: [on | off| flush| set FILENAME]");
Can we use help_cmd() here to print the help text and avoid duplicating the options?
Quoted 58 lines
monitor.c +0
-0} } #endifqemu-monitor.hx +3
-3@@ -276,9 +276,9 @@ ETEXI { .name = "trace-file", - .args_type = "op:s?", - .params = "op [on|off|flush]", - .help = "open, close, or flush trace file", + .args_type = "op:s?,arg:F?", + .params = "on|off|flush|set [arg]", + .help = "open, close, or flush trace file, or set a new file name", .mhandler.cmd = do_trace_file, },qemu-options.hx +0
-0@@ -2223,6 +2223,17 @@ Normally QEMU loads a configuration file from @var{sysconfdir}/qemu.conf and @var{sysconfdir}/target-@var{ARCH}.conf on startup. The @code{-nodefconfig}option will prevent QEMU from loading these configuration files at startup. ETEXI
qemu-options.hx +11
-0+#ifdef CONFIG_SIMPLE_TRACE +DEF("trace", HAS_ARG, QEMU_OPTION_trace, + "-trace\n" + " Specify a trace file to log traces to\n", + QEMU_ARCH_ALL) +STEXI +@item -trace +@findex -trace +Specify a trace file to log output traces to. +ETEXI +#endifHXCOMM This is the last statement. Insert new options before this line! STEXI
simpletrace.c +2
-3@@ -20,25 +20,48 @@ enum { static TraceRecord trace_buf[TRACE_BUF_LEN]; static unsigned int trace_idx; static FILE *trace_fp; -static bool trace_file_enabled = true; +static char *trace_file_name =NULL ; +static bool trace_file_enabled = false; void st_print_trace_file_status(FILE *stream, int (*stream_printf)(FILE *stream, const char *fmt, ...)) { - stream_printf(stream, "Trace file \"" CONFIG_TRACE_FILE "\" %s.\n", - getpid(), trace_file_enabled ? "on" : "off");
simpletrace.c enum { · line 36
Quoted 10 lines
simpletrace.c +5
-1+ stream_printf(stream, "Trace file \"%s\" %s.\n", + trace_file_name, trace_file_enabled ? "on" : "off"); } static bool open_trace_file(void) { - char *filename; + trace_fp = fopen(trace_file_name, "w"); + return trace_fp != NULL; +}
This could be inlined now. The function is only used by one caller.
simpletrace.c enum { · line 47
Quoted 13 lines
simpletrace.c +9
-2- if (asprintf(&filename, CONFIG_TRACE_FILE, getpid()) < 0) { - return false; +/** +* set_trace_file : To set the name of a trace file. +* @file : pointer to the name to be set. +* If NULL, set to the default name-<pid> set at config time. +*/ +bool st_set_trace_file (const char *file) +{ + if (trace_file_enabled) { + st_set_trace_file_enabled(false); }
No need for an if statement. If trace_file_enabled is already false, then st_set_trace_file_enabled() is a nop.
simpletrace.c enum { · line 51
Quoted 7 lines
simpletrace.c +3
-3- trace_fp = fopen(filename, "w"); - free(filename); - return trace_fp != NULL; + if (trace_file_name) { + free(trace_file_name); + }
No need for an if statement. free(NULL) is a nop.
simpletrace.c enum { · line 61
Quoted 10 lines
simpletrace.c +10
-0+ + if (!file) { + if (asprintf(&trace_file_name, CONFIG_TRACE_FILE, getpid()) < 0) { + return false; + } + } else { + if (asprintf(&trace_file_name, "%s", file) < 0) { + return false; + } + }
When asprintf() fails, the value of the string pointer is undefined according to the man page. That can result in double frees. It would be safest to set trace_file_name = NULL on failure.
Quoted 44 lines
simpletrace.c +3
-0+ + st_set_trace_file_enabled(true); + return true; } static void flush_trace_file(void)tracetool +1
-0@@ -158,6 +158,7 @@ void st_print_trace_events(FILE *stream, int (*stream_printf)(FILE *stream, cons void st_print_trace_file_status(FILE *stream, int (*stream_printf)(FILE *stream, const char *fmt, ...)); void st_flush_trace_buffer(void); void st_set_trace_file_enabled(bool enable); +bool st_set_trace_file(const char *file); void change_trace_event_state(const char *tname, bool tstate);EOF
vl.c +7
-0@@ -47,6 +47,10 @@ #include <dirent.h> #include <netdb.h> #include <sys/select.h> +#ifdef CONFIG_SIMPLE_TRACE +#include "trace.h" +#endif + #ifdef CONFIG_BSD #include <sys/stat.h> #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)@@ -1822,6 +1826,9 @@ int main(int argc, char **argv, char **envp) int show_vnc_port = 0; int defconfig = 1; +#ifdef CONFIG_SIMPLE_TRACE + char *trace_file = NULL; +#endif atexit(qemu_run_exit_notifiers); error_set_progname(argv[0]);
vl.c int main(int argc, char **argv, char **envp) · line 2605
Quoted 9 lines
vl.c +6
-0@@ -2590,6 +2597,12 @@ int main(int argc, char **argv, char **envp) } xen_mode = XEN_ATTACH; break; +#ifdef CONFIG_SIMPLE_TRACE + case QEMU_OPTION_trace: + trace_file = (char *) qemu_malloc(strlen(optarg) + 1); + strcpy(trace_file, optarg); + break; +#endif
Malloc isn't necessary, just hold the optarg pointer like gdbstub_dev and other string options do.
Quoted 33 lines
case
QEMU_OPTION_readconfig:
{
int ret =qemu_read_config_file(optarg);vl.c +9
-1@@ -2633,6 +2646,15 @@ int main(int argc, char **argv, char **envp) data_dir = CONFIG_QEMU_DATADIR; } +#ifdef CONFIG_SIMPLE_TRACE + /* + * Set the trace file name, if specified. + */ + st_set_trace_file(trace_file); + if (trace_file) { + qemu_free(trace_file); + } +#endif /** Default to max_cpus = smp_cpus, in case the user doesn't * specify a max_cpus value. -- 1.6.2.5
--
Prerna SaxenaLinux Technology Centre,
IBM Systems and Technology Lab,
Bangalore, India
Quoted 39 lines · Stefan Hajnoczi
Quoted 15 lines · Prerna Saxena
This patch adds an optional command line switch '-trace' to specify the filename to write traces to, when qemu starts.
Eg, If compiled with the 'simple' trace backend,[temp@system]$ qemu -trace FILENAME IMAGE Allows the binary traces to be written to FILENAME instead of the option set at config-time.Also, this adds monitor sub-command 'set' to trace-file commands to dynamically change trace log file at runtime.
Eg,
(qemu)trace-file set FILENAME
This allows one to set trace outputs to FILENAME from the default specified at startup.Signed-off-by Prerna Saxena<[email protected]>Quoted 8 lines
--- monitor.c | 6 ++++++ qemu-monitor.hx | 6 +++--- qemu-options.hx | 11 +++++++++++ simpletrace.c | 41 ++++++++++++++++++++++++++++++++--------- tracetool | 1 + vl.c | 22 ++++++++++++++++++++++ 6 files changed, 75 insertions(+), 12 deletions(-)Looks like a good approach. I checked that this also handles the case where trace events fire before the command-line option is handled and the trace filename is set.
Quoted 10 lines
monitor.c +1
-0@@ -544,6 +544,7 @@ static void do_change_trace_event_state(Monitor *mon, const QDict *qdict)static void do_trace_file (Monitor *mon,const QDict *qdict) {const char *op =qdict_get_try_str (qdict,"op" ); +const char *arg =qdict_get_try_str (qdict,"arg" );
Quoted 16 lines
monitor.c static void do_trace_file(Monitor *mon, const QDict *qdict) · line 563
Quoted 13 lines
monitor.c +5
-0if (!op) {st_print_trace_file_status ((FILE *)mon,&monitor_fprintf);@@ -553,8 +554,13 @@ static void do_trace_file(Monitor *mon, const QDict *qdict)st_set_trace_file_enabled (false); }else if (!strcmp (op,"flush" )) {st_flush_trace_buffer (); + }else if (!strcmp (op,"set" )) { +if (arg) { +st_set_trace_file (arg); + } }else {monitor_printf (mon,"unexpected argument \"%s\"\n" , op); +monitor_printf (mon,"Options are: [on | off| flush| set FILENAME]" );Can we use
help_cmd()here to print the help text and avoid duplicating the options?
Agree, changed in v2.
Quoted 12 lines
monitor.c static void do_trace_file(Monitor *mon, const QDict *qdict)
Quoted 11 lines
monitor.c +3
-1} }#endif static bool open_trace_file (void ) { -char *filename; + trace_fp =fopen (trace_file_name,"w" ); +return trace_fp !=NULL ; +}
Quoted 2 lines
This could be inlined now. The function is only used by one caller.
Done in v2.
Quoted 16 lines
monitor.c
Quoted 13 lines
monitor.c +9
-2-if (asprintf (&filename,CONFIG_TRACE_FILE ,getpid ())<0 ) { -return false; +/** +* set_trace_file : To set the name of a trace file. +* @file : pointer to the name to be set. +* If NULL, set to the default name-<pid> set at config time. +*/ +bool st_set_trace_file (const char *file) +{ +if (trace_file_enabled) { +st_set_trace_file_enabled (false); }No need for an if statement. If
trace_file_enabledis already false, thenst_set_trace_file_enabled()is a nop.
Agree this is unnecessary. Changed in v2.
Quoted 9 lines
monitor.c
Quoted 7 lines
monitor.c +3
-3- trace_fp =fopen (filename,"w" ); -free (filename); -return trace_fp !=NULL ; +if (trace_file_name) { +free (trace_file_name); + }No need for an if statement. free(NULL) is a nop.
Changed in v2.
Quoted 11 lines
monitor.c
Quoted 10 lines
monitor.c +10
-0+ +if (!file) { +if (asprintf (&trace_file_name,CONFIG_TRACE_FILE ,getpid ())<0 ) { +return false; + } + }else { +if (asprintf (&trace_file_name,"%s" , file)<0 ) { +return false; + } + }
Quoted 4 lines
When
asprintf()fails, the value of the string pointer is undefined according to the man page. That can result in double frees. It would be safest to settrace_file_name= NULL on failure.
Done.
Quoted 4 lines
Quoted 4 lines
...
...
Quoted 13 lines
monitor.c int main(int argc, char **argv, char **envp) · line 2605
Quoted 10 lines
monitor.c +6
-0@@ -2590,6 +2597,12 @@ int main(int argc, char **argv, char **envp) } xen_mode =XEN_ATTACH ;break ; +#ifdef CONFIG_SIMPLE_TRACE +case QEMU_OPTION_trace: + trace_file = (char *)qemu_malloc (strlen (optarg) +1 ); +strcpy (trace_file, optarg); +break ; +#endif Malloc isn't necessary, just hold the optarg pointer like
gdbstub_devand other string options do.
It wouldnt be corect to use optarg directly here. If this optional argument is not specified, st_set_file_name() is called with a NULL argument, and the filename defaults to config-specified name. (This is how gdbstub_dev works too. The optional argument is copied to gdbstub_dev if provided.)
Quoted 3 lines
...
Thanks,
Signature · 5 lines
Prerna Saxena Linux Technology Centre, IBM Systems and Technology Lab, Bangalore, India
Quoted 17 lines · Prerna Saxena
Quoted 15 lines · Stefan Hajnoczi
vl.c int main(int argc, char **argv, char **envp) · line 2605
Quoted 10 lines · Prerna Saxena
vl.c +6
-0@@ -2590,6 +2597,12 @@ int main(int argc, char **argv, char **envp) } xen_mode = XEN_ATTACH; break; +#ifdef CONFIG_SIMPLE_TRACE + case QEMU_OPTION_trace: + trace_file = (char *) qemu_malloc(strlen(optarg) + 1); + strcpy(trace_file, optarg); + break; +#endif Malloc isn't necessary, just hold the optarg pointer like
gdbstub_devand other string options do.
Quoted 5 lines
It wouldnt be corect to use optarg directly here. If this optional argument is not specified,
st_set_file_name()is called with a NULL argument, and the filename defaults to config-specified name.
(This is howgdbstub_devworks too. The optional argument is copied togdbstub_devif provided.)
const char *trace_file = NULL;
...
switch (...) {
case QEMU_OPTION_trace:
trace_file = optarg;
break;
}...st_set_trace_file(trace_file);
There is no need to malloc/strcpy/free.
Stefan
PATCH v2 1/1 Add options to specify trace file name at startup and runtime.
In reply to Prerna SaxenaThis patch adds an optional command line switch '-trace' to specify the filename to write traces to, when qemu starts.
Eg, If compiled with the 'simple' trace backend,
[temp@system]$ qemu -trace FILENAME IMAGE Allows the binary traces to be written to FILENAME instead of the option set at config-time.
Also, this adds monitor sub-command 'set' to trace-file commands to dynamically change trace log file at runtime.
Eg,
(qemu)trace-file set FILENAME
This allows one to set trace outputs to FILENAME from the default specified at startup.
Changelog from v1 :
- Cleanups.
--- monitor.c | 6 ++++++ qemu-monitor.hx | 6 +++--- qemu-options.hx | 11 +++++++++++ simpletrace.c | 41 +++++++++++++++++++++++++++++++---------- tracetool | 1 + vl.c | 20 ++++++++++++++++++++ 6 files changed, 72 insertions(+), 13 deletions(-)
monitor.c +6 -0
@@ -544,6 +544,7 @@ static void do_change_trace_event_state(Monitor *mon, const QDict *qdict)static void do_trace_file (Monitor *mon,const QDict *qdict) {const char *op =qdict_get_try_str (qdict,"op" ); +const char *arg =qdict_get_try_str (qdict,"arg" );if (!op) {st_print_trace_file_status ((FILE *)mon, &monitor_fprintf);
@@ -553,8 +554,13 @@ static void do_trace_file(Monitor *mon, const QDict *qdict) st_set_trace_file_enabled(false); }else if (!strcmp (op,"flush" )) {st_flush_trace_buffer (); + }else if (!strcmp (op,"set" )) { +if (arg) { +st_set_trace_file (arg); + } }else {monitor_printf (mon,"unexpected argument \"%s\"\n" , op); +help_cmd (mon,"trace-file" ); } }#endif
qemu-monitor.hx +3 -3
@@ -276,9 +276,9 @@ ETEXI { .name = "trace-file", - .args_type = "op:s?", - .params = "op [on|off|flush]", - .help = "open, close, or flush trace file", + .args_type = "op:s?,arg:F?", + .params = "on|off|flush|set [arg]", + .help = "open, close, or flush trace file, or set a new file name", .mhandler.cmd = do_trace_file, },
qemu-options.hx +11 -0
@@ -2223,6 +2223,17 @@ Normally QEMU loads a configuration file from @var{sysconfdir}/qemu.conf and @var{sysconfdir}/target-@var{ARCH}.conf on startup. The @code{-nodefconfig} option will prevent QEMU from loading these configuration files at startup. ETEXI +#ifdef CONFIG_SIMPLE_TRACE +DEF("trace", HAS_ARG, QEMU_OPTION_trace, + "-trace\n" + " Specify a trace file to log traces to\n", + QEMU_ARCH_ALL) +STEXI +@item -trace +@findex -trace +Specify a trace file to log output traces to. +ETEXI +#endif HXCOMM This is the last statement. Insert new options before this line! STEXI
simpletrace.c +31 -10
56 lines not on this page · raw message
tracetool +1 -0
@@ -158,6 +158,7 @@ void st_print_trace_events(FILE *stream, int (*stream_printf)(FILE *stream, cons void st_print_trace_file_status(FILE *stream, int (*stream_printf)(FILE *stream, const char *fmt, ...)); void st_flush_trace_buffer(void); void st_set_trace_file_enabled(bool enable); +bool st_set_trace_file(const char *file); void change_trace_event_state(const char *tname, bool tstate); EOF
vl.c +20 -0
@@ -47,6 +47,10 @@#include <dirent.h> #include <netdb.h> #include <sys/select.h> +#ifdef CONFIG_SIMPLE_TRACE +#include "trace.h" +#endif +#ifdef CONFIG_BSD #include <sys/stat.h> #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
@@ -1822,6 +1826,9 @@ int main(int argc, char **argv, char **envp)int show_vnc_port =0 ;int defconfig =1 ; +#ifdef CONFIG_SIMPLE_TRACE +char *trace_file =NULL ; +#endif atexit (qemu_run_exit_notifiers);error_set_progname (argv[0 ]);
@@ -2590,6 +2597,12 @@ int main(int argc, char **argv, char **envp) } xen_mode =XEN_ATTACH ;break ; +#ifdef CONFIG_SIMPLE_TRACE +case QEMU_OPTION_trace: + trace_file = (char *)qemu_malloc (strlen (optarg) +1 ); +strcpy (trace_file, optarg); +break ; +#endif case QEMU_OPTION_readconfig: {int ret =qemu_read_config_file (optarg);
@@ -2633,6 +2646,13 @@ int main(int argc, char **argv, char **envp) data_dir =CONFIG_QEMU_DATADIR ; } +#ifdef CONFIG_SIMPLE_TRACE +/* +* Set the trace file name, if specified. +*/ +st_set_trace_file (trace_file); +qemu_free (trace_file); +#endif /* * Default to max_cpus = smp_cpus, in case the user doesn't * specify a max_cpus value.
Signature · 9 lines
1.6.2.5 -- Prerna Saxena Linux Technology Centre, IBM Systems and Technology Lab, Bangalore, India
Quoted 16 lines · Prerna Saxena
This patch adds an optional command line switch '-trace' to specify the filename to write traces to, when qemu starts.
Eg, If compiled with the 'simple' trace backend,[temp@system]$ qemu -trace FILENAME IMAGE Allows the binary traces to be written to FILENAME instead of the option set at config-time.Also, this adds monitor sub-command 'set' to trace-file commands to dynamically change trace log file at runtime.
Eg,
(qemu)trace-file set FILENAME
This allows one to set trace outputs to FILENAME from the default specified at startup.Changelog from v1 :
- Cleanups.
[..snip..]
simpletrace.c enum { · line 52
Quoted 10 lines
simpletrace.c +7
-2+st_set_trace_file_enabled (false); -if (asprintf (&filename,CONFIG_TRACE_FILE ,getpid ()) <0 ) { -return false; +free (trace_file_name); + +if (!file) { +if (asprintf (&trace_file_name,CONFIG_TRACE_FILE ,getpid ()) <0 ) { + trace_file_name =NULL ; +return false;
Tab here.
Quoted 8 lines
simpletrace.c +6
-0+ } + }else { +if (asprintf (&trace_file_name,"%s" , file) <0 ) { + trace_file_name =NULL ; +return false; + } }
[..snip..]
Signature · 1 line
mailto:[email protected]
PATCH v3 1/1 Add options to specify trace file name at startup and runtime.
In reply to Prerna SaxenaStefanha, Malc,
Thanks for suggestions. Resending the patch after clean-up.
This patch adds an optional command line switch '-trace' to specify the filename to write traces to, when qemu starts.
Eg, If compiled with the 'simple' trace backend,
[temp@system]$ qemu -trace FILENAME IMAGE Allows the binary traces to be written to FILENAME instead of the option set at config-time.
Also, this adds monitor sub-command 'set' to trace-file commands to dynamically change trace log file at runtime.
Eg,
(qemu)trace-file set FILENAME
This allows one to set trace outputs to FILENAME from the default specified at startup.
Changelog from v2 :
- Cleanups.
--- monitor.c | 6 ++++++ qemu-monitor.hx | 6 +++--- qemu-options.hx | 11 +++++++++++ simpletrace.c | 41 +++++++++++++++++++++++++++++++---------- tracetool | 1 + vl.c | 18 ++++++++++++++++++ 6 files changed, 70 insertions(+), 13 deletions(-)
monitor.c +6 -0
@@ -544,6 +544,7 @@ static void do_change_trace_event_state(Monitor *mon, const QDict *qdict)static void do_trace_file (Monitor *mon,const QDict *qdict) {const char *op =qdict_get_try_str (qdict,"op" ); +const char *arg =qdict_get_try_str (qdict,"arg" );if (!op) {st_print_trace_file_status ((FILE *)mon, &monitor_fprintf);
@@ -553,8 +554,13 @@ static void do_trace_file(Monitor *mon, const QDict *qdict) st_set_trace_file_enabled(false); }else if (!strcmp (op,"flush" )) {st_flush_trace_buffer (); + }else if (!strcmp (op,"set" )) { +if (arg) { +st_set_trace_file (arg); + } }else {monitor_printf (mon,"unexpected argument \"%s\"\n" , op); +help_cmd (mon,"trace-file" ); } }#endif
qemu-monitor.hx +3 -3
@@ -276,9 +276,9 @@ ETEXI { .name = "trace-file", - .args_type = "op:s?", - .params = "op [on|off|flush]", - .help = "open, close, or flush trace file", + .args_type = "op:s?,arg:F?", + .params = "on|off|flush|set [arg]", + .help = "open, close, or flush trace file, or set a new file name", .mhandler.cmd = do_trace_file, },
qemu-options.hx +11 -0
@@ -2223,6 +2223,17 @@ Normally QEMU loads a configuration file from @var{sysconfdir}/qemu.conf and @var{sysconfdir}/target-@var{ARCH}.conf on startup. The @code{-nodefconfig} option will prevent QEMU from loading these configuration files at startup. ETEXI +#ifdef CONFIG_SIMPLE_TRACE +DEF("trace", HAS_ARG, QEMU_OPTION_trace, + "-trace\n" + " Specify a trace file to log traces to\n", + QEMU_ARCH_ALL) +STEXI +@item -trace +@findex -trace +Specify a trace file to log output traces to. +ETEXI +#endif HXCOMM This is the last statement. Insert new options before this line! STEXI
simpletrace.c +31 -10
56 lines not on this page · raw message
tracetool +1 -0
@@ -158,6 +158,7 @@ void st_print_trace_events(FILE *stream, int (*stream_printf)(FILE *stream, cons void st_print_trace_file_status(FILE *stream, int (*stream_printf)(FILE *stream, const char *fmt, ...)); void st_flush_trace_buffer(void); void st_set_trace_file_enabled(bool enable); +bool st_set_trace_file(const char *file); void change_trace_event_state(const char *tname, bool tstate); EOF
vl.c +18 -0
@@ -47,6 +47,10 @@#include <dirent.h> #include <netdb.h> #include <sys/select.h> +#ifdef CONFIG_SIMPLE_TRACE +#include "trace.h" +#endif +#ifdef CONFIG_BSD #include <sys/stat.h> #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
@@ -1822,6 +1826,9 @@ int main(int argc, char **argv, char **envp)int show_vnc_port =0 ;int defconfig =1 ; +#ifdef CONFIG_SIMPLE_TRACE +char *trace_file =NULL ; +#endif atexit (qemu_run_exit_notifiers);error_set_progname (argv[0 ]);
@@ -2590,6 +2597,11 @@ int main(int argc, char **argv, char **envp) } xen_mode =XEN_ATTACH ;break ; +#ifdef CONFIG_SIMPLE_TRACE +case QEMU_OPTION_trace: + trace_file = optarg; +break ; +#endif case QEMU_OPTION_readconfig: {int ret =qemu_read_config_file (optarg);
@@ -2633,6 +2645,12 @@ int main(int argc, char **argv, char **envp) data_dir =CONFIG_QEMU_DATADIR ; } +#ifdef CONFIG_SIMPLE_TRACE +/* +* Set the trace file name, if specified. +*/ +st_set_trace_file (trace_file); +#endif /* * Default to max_cpus = smp_cpus, in case the user doesn't * specify a max_cpus value.
Signature · 9 lines
1.6.2.5 -- Prerna Saxena Linux Technology Centre, IBM Systems and Technology Lab, Bangalore, India
Stefan Hajnoczi
AppliedQuoted 22 lines · Prerna Saxena
Stefanha, Malc,
Thanks for suggestions. Resending the patch after clean-up.This patch adds an optional command line switch '-trace' to specify the filename to write traces to, when qemu starts.
Eg, If compiled with the 'simple' trace backend,[temp@system]$ qemu -trace FILENAME IMAGE Allows the binary traces to be written to FILENAME instead of the option set at config-time.Also, this adds monitor sub-command 'set' to trace-file commands to dynamically change trace log file at runtime.
Eg,
(qemu)trace-file set FILENAME
This allows one to set trace outputs to FILENAME from the default specified at startup.Changelog from v2 :
- Cleanups.Signed-off-by Prerna Saxena <[email protected]>
Quoted 8 lines
---
monitor.c | 6 ++++++
qemu-monitor.hx | 6 +++---
qemu-options.hx | 11 +++++++++++
simpletrace.c | 41 +++++++++++++++++++++++++++++++---------- tracetool | 1 +
vl.c | 18 ++++++++++++++++++6 files changed, 70 insertions(+), 13 deletions(-)
Thanks, applied to the tracing branch:
http://repo.or.cz/w/qemu/stefanha.git/shortlog/refs/heads/tracing
Stefan
PATCH 1/1 Fix a build warning
A build warning arising out of 'incompatible pointer assignment' shows up at times. This will take care of it.
--- vl.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
vl.c +1 -1
@@ -1827,7 +1827,7 @@ int main(int argc, char **argv, char **envp)int defconfig =1 ;#ifdef CONFIG_SIMPLE_TRACE -char *trace_file =NULL ; +const char *trace_file =NULL ;#endif atexit (qemu_run_exit_notifiers);error_set_progname (argv[0 ]);
Signature · 10 lines
1.6.2.5 -- Prerna Saxena Linux Technology Centre, IBM Systems and Technology Lab, Bangalore, India
[Qemu-devel] Re: [Tracing][PATCH] Fix a build warning
Quoted 7 lines · Prerna Saxena
A build warning arising out of 'incompatible pointer assignment' shows up at times. This will take care of it.
Signed-off-by Prerna Saxena <[email protected]>---
vl.c | 2 +-1 files changed, 1 insertions(+), 1 deletions(-)
Thanks Prerna. I noticed the warning and added const when merging your trace file name patch:
http://repo.or.cz/w/qemu/stefanha.git/commitdiff/ea06bd2dd2e168059bde1e8c4d1003bb7b07dfe9
Stefan