trace: add "-trace enable=..."
Allow enabling events without going through a file, for example: qemu-system-x86_64 -trace bdrv_aio_writev -trace bdrv_aio_readv or with globbing too: qemu-system-x86_64 -trace 'bdrv_aio_*' if an appropriate backend is enabled (simple, stderr, ftrace). Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Denis V. Lunev <den@openvz.org> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com> Message-id: 1452174932-28657-6-git-send-email-den@openvz.org Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
		
							parent
							
								
									f246b86672
								
							
						
					
					
						commit
						10578a257d
					
				| @ -3544,7 +3544,7 @@ config files on @var{sysconfdir}, but won't make it skip the QEMU-provided confi | ||||
| files from @var{datadir}. | ||||
| ETEXI | ||||
| DEF("trace", HAS_ARG, QEMU_OPTION_trace, | ||||
|     "-trace [events=<file>][,file=<file>]\n" | ||||
|     "-trace [[enable=]<pattern>][,events=<file>][,file=<file>]\n" | ||||
|     "                specify tracing options\n", | ||||
|     QEMU_ARCH_ALL) | ||||
| STEXI | ||||
| @ -3556,6 +3556,14 @@ HXCOMM HX does not support conditional compilation of text. | ||||
| Specify tracing options. | ||||
| 
 | ||||
| @table @option | ||||
| @item [enable=]@var{pattern} | ||||
| Immediately enable events matching @var{pattern}. | ||||
| The file must contain one event name (as listed in the @file{trace-events} file) | ||||
| per line; globbing patterns are accepted too.  This option is only | ||||
| available if QEMU has been compiled with the @var{simple}, @var{stderr} | ||||
| or @var{ftrace} tracing backend.  To specify multiple events or patterns, | ||||
| specify the @option{-trace} option multiple times. | ||||
| 
 | ||||
| @item events=@var{file} | ||||
| Immediately enable events listed in @var{file}. | ||||
| The file must contain one event name (as listed in the @file{trace-events} file) | ||||
|  | ||||
| @ -88,6 +88,32 @@ TraceEvent *trace_event_pattern(const char *pat, TraceEvent *ev) | ||||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
| void trace_enable_events(const char *line_buf) | ||||
| { | ||||
|     const bool enable = ('-' != line_buf[0]); | ||||
|     const char *line_ptr = enable ? line_buf : line_buf + 1; | ||||
| 
 | ||||
|     if (trace_event_is_pattern(line_ptr)) { | ||||
|         TraceEvent *ev = NULL; | ||||
|         while ((ev = trace_event_pattern(line_ptr, ev)) != NULL) { | ||||
|             if (trace_event_get_state_static(ev)) { | ||||
|                 trace_event_set_state_dynamic(ev, enable); | ||||
|             } | ||||
|         } | ||||
|     } else { | ||||
|         TraceEvent *ev = trace_event_name(line_ptr); | ||||
|         if (ev == NULL) { | ||||
|             error_report("WARNING: trace event '%s' does not exist", | ||||
|                          line_ptr); | ||||
|         } else if (!trace_event_get_state_static(ev)) { | ||||
|             error_report("WARNING: trace event '%s' is not traceable", | ||||
|                          line_ptr); | ||||
|         } else { | ||||
|             trace_event_set_state_dynamic(ev, enable); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void trace_init_events(const char *fname) | ||||
| { | ||||
|     Location loc; | ||||
| @ -114,27 +140,7 @@ void trace_init_events(const char *fname) | ||||
|             if ('#' == line_buf[0]) { /* skip commented lines */ | ||||
|                 continue; | ||||
|             } | ||||
|             const bool enable = ('-' != line_buf[0]); | ||||
|             char *line_ptr = enable ? line_buf : line_buf + 1; | ||||
|             if (trace_event_is_pattern(line_ptr)) { | ||||
|                 TraceEvent *ev = NULL; | ||||
|                 while ((ev = trace_event_pattern(line_ptr, ev)) != NULL) { | ||||
|                     if (trace_event_get_state_static(ev)) { | ||||
|                         trace_event_set_state_dynamic(ev, enable); | ||||
|                     } | ||||
|                 } | ||||
|             } else { | ||||
|                 TraceEvent *ev = trace_event_name(line_ptr); | ||||
|                 if (ev == NULL) { | ||||
|                     error_report("WARNING: trace event '%s' does not exist", | ||||
|                                  line_ptr); | ||||
|                 } else if (!trace_event_get_state_static(ev)) { | ||||
|                     error_report("WARNING: trace event '%s' is not traceable", | ||||
|                                  line_ptr); | ||||
|                 } else { | ||||
|                     trace_event_set_state_dynamic(ev, enable); | ||||
|                 } | ||||
|             } | ||||
|             trace_enable_events(line_buf); | ||||
|         } | ||||
|     } | ||||
|     if (fclose(fp) != 0) { | ||||
|  | ||||
| @ -181,6 +181,15 @@ void trace_init_events(const char *file); | ||||
|  */ | ||||
| void trace_init_file(const char *file); | ||||
| 
 | ||||
| /**
 | ||||
|  * trace_enable_events: | ||||
|  * @line_buf: A string with a glob pattern of events to be enabled or, | ||||
|  *            if the string starts with '-', disabled. | ||||
|  * | ||||
|  * Enable or disable matching events. | ||||
|  */ | ||||
| void trace_enable_events(const char *line_buf); | ||||
| 
 | ||||
| 
 | ||||
| #include "trace/control-internal.h" | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										11
									
								
								vl.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								vl.c
									
									
									
									
									
								
							| @ -270,9 +270,13 @@ static QemuOptsList qemu_sandbox_opts = { | ||||
| 
 | ||||
| static QemuOptsList qemu_trace_opts = { | ||||
|     .name = "trace", | ||||
|     .implied_opt_name = "trace", | ||||
|     .implied_opt_name = "enable", | ||||
|     .head = QTAILQ_HEAD_INITIALIZER(qemu_trace_opts.head), | ||||
|     .desc = { | ||||
|         { | ||||
|             .name = "enable", | ||||
|             .type = QEMU_OPT_STRING, | ||||
|         }, | ||||
|         { | ||||
|             .name = "events", | ||||
|             .type = QEMU_OPT_STRING, | ||||
| @ -3900,10 +3904,13 @@ int main(int argc, char **argv, char **envp) | ||||
|             case QEMU_OPTION_trace: | ||||
|             { | ||||
|                 opts = qemu_opts_parse_noisily(qemu_find_opts("trace"), | ||||
|                                                optarg, false); | ||||
|                                                optarg, true); | ||||
|                 if (!opts) { | ||||
|                     exit(1); | ||||
|                 } | ||||
|                 if (qemu_opt_get(opts, "enable")) { | ||||
|                     trace_enable_events(qemu_opt_get(opts, "enable")); | ||||
|                 } | ||||
|                 trace_init_events(qemu_opt_get(opts, "events")); | ||||
|                 if (trace_file) { | ||||
|                     g_free(trace_file); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Paolo Bonzini
						Paolo Bonzini