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.
This commit is contained in:
Simon Marchi 2016-05-30 17:29:39 -04:00
parent e2cbcd9156
commit 38b022b445
13 changed files with 94 additions and 11 deletions

View File

@ -1,3 +1,17 @@
2016-06-06 Simon Marchi <simon.marchi@ericsson.com>
* 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 <jon.turney@dronecode.org.uk>
* windows-nat.c (handle_output_debug_string): Return type of

View File

@ -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.

View File

@ -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)
{

View File

@ -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);

View File

@ -1,3 +1,10 @@
2016-06-06 Simon Marchi <simon.marchi@ericsson.com>
* 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 <eliz@gnu.org>
* gdb.texinfo (General Query Packets): Move the description of the

View File

@ -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,

View File

@ -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})

View File

@ -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);

View File

@ -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);
}

View File

@ -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. */

View File

@ -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. */

View File

@ -1,3 +1,8 @@
2016-06-06 Simon Marchi <simon.marchi@ericsson.com>
* gdb.mi/mi-record-changed.exp: Adjust =record-started output
matching.
2016-06-02 Tom Tromey <tom@tromey.com>
PR python/18984:

View File

@ -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