From 38b022b4452f996fb5a8598f80d850b594621bcf Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Mon, 30 May 2016 17:29:39 -0400 Subject: [PATCH] Add method/format information to =record-started Eclipse CDT now supports enabling execution recording using two methods (full and btrace) and both formats for btrace (bts and pt). In the event that recording is enabled behind the back of the GUI (by the user on the command line, or a script), we need to know which method/format are being used, so it can be correctly reflected in the interface. This patch adds this information to the =record-started async record. Before: =record-started,thread-group="i1" After: =record-started,thread-group="i1",method="btrace",format="bts" =record-started,thread-group="i1",method="btrace",format="pt" =record-started,thread-group="i1",method="full" The "format" field is only present when the current method supports multiple formats (only the btrace method as of now). gdb/ChangeLog: * NEWS: Mention the new fields in =record-started. * common/btrace-common.h (btrace_format_short_string): New function declaration. * common/btrace-common.c (btrace_format_short_string): New function. * mi/mi-interp.c (mi_record_changed): Output method and format fields in the =record-started record. * record-btrace.c (record_btrace_open): Adapt record_changed notification. * record-full.c (record_full_open): Likewise. * record.c (cmd_record_stop): Likewise. gdb/doc/ChangeLog: * gdb.texinfo (GDB/MI Async Records): Document method and format fields in =record-started. * observer.texi (record_changed): Add method and format parameters. gdb/testsuite/ChangeLog: * gdb.mi/mi-record-changed.exp: Adjust =record-started output matching. --- gdb/ChangeLog | 14 ++++++++++++ gdb/NEWS | 5 +++++ gdb/common/btrace-common.c | 20 +++++++++++++++++ gdb/common/btrace-common.h | 3 +++ gdb/doc/ChangeLog | 7 ++++++ gdb/doc/gdb.texinfo | 7 +++++- gdb/doc/observer.texi | 7 +++++- gdb/mi/mi-interp.c | 25 ++++++++++++++++++---- gdb/record-btrace.c | 4 +++- gdb/record-full.c | 2 +- gdb/record.c | 2 +- gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.mi/mi-record-changed.exp | 4 ++-- 13 files changed, 94 insertions(+), 11 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index af4ddcc447..01cc7708aa 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2016-06-06 Simon Marchi + + * NEWS: Mention the new fields in =record-started. + * common/btrace-common.h (btrace_format_short_string): New function + declaration. + * common/btrace-common.c (btrace_format_short_string): New + function. + * mi/mi-interp.c (mi_record_changed): Output method and format + fields in the =record-started record. + * record-btrace.c (record_btrace_open): Adapt record_changed + notification. + * record-full.c (record_full_open): Likewise. + * record.c (cmd_record_stop): Likewise. + 2016-06-02 Jon Turney * windows-nat.c (handle_output_debug_string): Return type of diff --git a/gdb/NEWS b/gdb/NEWS index dce79a26a8..253c8e5213 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -67,6 +67,11 @@ maint selftest including JIT compiling fast tracepoint's conditional expression bytecode into native code. +* MI async record =record-started now includes the method and format used for + recording. For example: + + =record-started,thread-group="i1",method="btrace",format="bts" + *** Changes in GDB 7.11 * GDB now supports debugging kernel-based threads on FreeBSD. diff --git a/gdb/common/btrace-common.c b/gdb/common/btrace-common.c index eba3979a2e..90aef76c19 100644 --- a/gdb/common/btrace-common.c +++ b/gdb/common/btrace-common.c @@ -43,6 +43,26 @@ btrace_format_string (enum btrace_format format) /* See btrace-common.h. */ +const char * +btrace_format_short_string (enum btrace_format format) +{ + switch (format) + { + case BTRACE_FORMAT_NONE: + return "unknown"; + + case BTRACE_FORMAT_BTS: + return "bts"; + + case BTRACE_FORMAT_PT: + return "pt"; + } + + internal_error (__FILE__, __LINE__, _("Unknown branch trace format")); +} + +/* See btrace-common.h. */ + void btrace_data_init (struct btrace_data *data) { diff --git a/gdb/common/btrace-common.h b/gdb/common/btrace-common.h index ad208cd79b..d702bb80ee 100644 --- a/gdb/common/btrace-common.h +++ b/gdb/common/btrace-common.h @@ -214,6 +214,9 @@ enum btrace_error /* Return a string representation of FORMAT. */ extern const char *btrace_format_string (enum btrace_format format); +/* Return an abbreviation string representation of FORMAT. */ +extern const char *btrace_format_short_string (enum btrace_format format); + /* Initialize DATA. */ extern void btrace_data_init (struct btrace_data *data); diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 9ed044b76f..8ef6cbafa3 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,10 @@ +2016-06-06 Simon Marchi + + * gdb.texinfo (GDB/MI Async Records): Document method and + format fields in =record-started. + * observer.texi (record_changed): Add method and format + parameters. + 2016-05-27 Eli Zaretskii * gdb.texinfo (General Query Packets): Move the description of the diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 7e89003345..1da81a1e14 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -26423,12 +26423,17 @@ breakpoint commands; @xref{GDB/MI Breakpoint Commands}. The Note that if a breakpoint is emitted in the result record of a command, then it will not also be emitted in an async record. -@item =record-started,thread-group="@var{id}" +@item =record-started,thread-group="@var{id}",method="@var{method}"[,format="@var{format}"] @itemx =record-stopped,thread-group="@var{id}" Execution log recording was either started or stopped on an inferior. The @var{id} is the @value{GDBN} identifier of the thread group corresponding to the affected inferior. +The @var{method} field indicates the method used to record execution. If the +method in use supports multiple recording formats, @var{format} will be present +and contain the currently used format. @xref{Process Record and Replay} +for existing method and format values. + @item =cmd-param-changed,param=@var{param},value=@var{value} Reports that a parameter of the command @code{set @var{param}} is changed to @var{value}. In the multi-word @code{set} command, diff --git a/gdb/doc/observer.texi b/gdb/doc/observer.texi index f4049ad329..fc7aac43ae 100644 --- a/gdb/doc/observer.texi +++ b/gdb/doc/observer.texi @@ -141,11 +141,16 @@ at the entry-point instruction. For @samp{attach} and @samp{core}, inferior, and before any information on the inferior has been printed. @end deftypefun -@deftypefun void record_changed (struct inferior *@var{inferior}, int @var{started}) +@deftypefun void record_changed (struct inferior *@var{inferior}, int @var{started}, const char *@var{method}, const char *@var{format}) The status of process record for inferior @var{inferior} in @value{GDBN} has changed. The process record is started if @var{started} is true, and the process record is stopped if @var{started} is false. + +When @var{started} is true, @var{method} indicates the short name of the method +used for recording. If the method supports multiple formats, @var{format} +indicates which one is being used, otherwise it is NULL. When @var{started} is +false, they are both NULL. @end deftypefun @deftypefun void solib_loaded (struct so_list *@var{solib}) diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c index 0fe19af2da..8ce816c215 100644 --- a/gdb/mi/mi-interp.c +++ b/gdb/mi/mi-interp.c @@ -65,7 +65,8 @@ static void mi_on_no_history (void); static void mi_new_thread (struct thread_info *t); static void mi_thread_exit (struct thread_info *t, int silent); -static void mi_record_changed (struct inferior*, int); +static void mi_record_changed (struct inferior*, int, const char *, + const char *); static void mi_inferior_added (struct inferior *inf); static void mi_inferior_appeared (struct inferior *inf); static void mi_inferior_exit (struct inferior *inf); @@ -399,7 +400,8 @@ mi_thread_exit (struct thread_info *t, int silent) /* Emit notification on changing the state of record. */ static void -mi_record_changed (struct inferior *inferior, int started) +mi_record_changed (struct inferior *inferior, int started, const char *method, + const char *format) { struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data (); struct cleanup *old_chain; @@ -407,8 +409,23 @@ mi_record_changed (struct inferior *inferior, int started) old_chain = make_cleanup_restore_target_terminal (); target_terminal_ours_for_output (); - fprintf_unfiltered (mi->event_channel, "record-%s,thread-group=\"i%d\"", - started ? "started" : "stopped", inferior->num); + if (started) + { + if (format != NULL) + fprintf_unfiltered ( + mi->event_channel, + "record-started,thread-group=\"i%d\",method=\"%s\",format=\"%s\"", + inferior->num, method, format); + else + fprintf_unfiltered ( + mi->event_channel, + "record-started,thread-group=\"i%d\",method=\"%s\"", + inferior->num, method); + } + else + fprintf_unfiltered (mi->event_channel, + "record-stopped,thread-group=\"i%d\"", inferior->num); + gdb_flush (mi->event_channel); diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c index 77b51801e6..24594a96cf 100644 --- a/gdb/record-btrace.c +++ b/gdb/record-btrace.c @@ -206,6 +206,7 @@ record_btrace_open (const char *args, int from_tty) { struct cleanup *disable_chain; struct thread_info *tp; + const char *format; DEBUG ("open"); @@ -234,7 +235,8 @@ record_btrace_open (const char *args, int from_tty) NULL); record_btrace_generating_corefile = 0; - observer_notify_record_changed (current_inferior (), 1); + format = btrace_format_short_string (record_btrace_conf.format); + observer_notify_record_changed (current_inferior (), 1, "btrace", format); discard_cleanups (disable_chain); } diff --git a/gdb/record-full.c b/gdb/record-full.c index f307b4876f..0f61bcb69d 100644 --- a/gdb/record-full.c +++ b/gdb/record-full.c @@ -869,7 +869,7 @@ record_full_open (const char *name, int from_tty) record_full_init_record_breakpoints (); - observer_notify_record_changed (current_inferior (), 1); + observer_notify_record_changed (current_inferior (), 1, "full", NULL); } /* "to_close" target method. Close the process record target. */ diff --git a/gdb/record.c b/gdb/record.c index 6190794492..1af134f68f 100644 --- a/gdb/record.c +++ b/gdb/record.c @@ -268,7 +268,7 @@ cmd_record_stop (char *args, int from_tty) printf_unfiltered (_("Process record is stopped and all execution " "logs are deleted.\n")); - observer_notify_record_changed (current_inferior (), 0); + observer_notify_record_changed (current_inferior (), 0, NULL, NULL); } /* The "set record" command. */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 3b305a602b..98a798b779 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-06-06 Simon Marchi + + * gdb.mi/mi-record-changed.exp: Adjust =record-started output + matching. + 2016-06-02 Tom Tromey PR python/18984: diff --git a/gdb/testsuite/gdb.mi/mi-record-changed.exp b/gdb/testsuite/gdb.mi/mi-record-changed.exp index 2b5fcd617e..22cf076ee5 100644 --- a/gdb/testsuite/gdb.mi/mi-record-changed.exp +++ b/gdb/testsuite/gdb.mi/mi-record-changed.exp @@ -31,14 +31,14 @@ if [mi_gdb_start] { } mi_run_to_main -mi_gdb_test "record" ".*=record-started,thread-group=\"i${decimal}\".*\\^done" \ +mi_gdb_test "record" ".*=record-started,thread-group=\"i${decimal}\",method=\"full\".*\\^done" \ "record" mi_gdb_test "record stop" \ ".*=record-stopped,thread-group=\"i${decimal}\".*\\^done" \ "record end" mi_gdb_test "target record" \ - ".*=record-started,thread-group=\"i${decimal}\".*\\^done" \ + ".*=record-started,thread-group=\"i${decimal}\",method=\"full\".*\\^done" \ "target record" return 0 -- 2.34.1