From 201b4506b3d34c274cdc5ec5ffb8f6e43fc982a9 Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Tue, 18 Sep 2012 11:33:43 +0000 Subject: [PATCH] gdb/doc: * observer.texi (GDB Observers): New observer 'traceframe_changed'. * gdb.texinfo (GDB/MI Async Records): Mention new MI notification '=traceframe-changed'. gdb: * tracepoint.c (tfind_1): Call observer_notify_traceframe_changed if traceframe changed. * mi/mi-cmds.c (mi_cmd mi_cmds): Adjust for command "trace-find". * mi/mi-interp.c: Declare 'mi_traceframe_changed'. (mi_interpreter_init): Hook mi_traceframe_changed to observer 'traceframe_changed'. (mi_traceframe_changed): New. * mi/mi-main.h (struct mi_suppress_notification) : New field. * NEWS: Mention the new MI notification. gdb/testsuite: * gdb.trace/mi-traceframe-changed.exp: New. --- gdb/ChangeLog | 14 ++ gdb/NEWS | 2 + gdb/doc/ChangeLog | 6 + gdb/doc/gdb.texinfo | 6 + gdb/doc/observer.texi | 7 + gdb/mi/mi-cmds.c | 3 +- gdb/mi/mi-interp.c | 25 ++++ gdb/mi/mi-main.h | 2 + gdb/testsuite/ChangeLog | 4 + .../gdb.trace/mi-traceframe-changed.exp | 136 ++++++++++++++++++ gdb/tracepoint.c | 6 +- 11 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 gdb/testsuite/gdb.trace/mi-traceframe-changed.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4ab15c4916..0f0b01a728 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2012-09-18 Yao Qi + + * tracepoint.c (tfind_1): Call observer_notify_traceframe_changed + if traceframe changed. + * mi/mi-cmds.c (mi_cmd mi_cmds): Adjust for command + "trace-find". + * mi/mi-interp.c: Declare 'mi_traceframe_changed'. + (mi_interpreter_init): Hook mi_traceframe_changed to observer + 'traceframe_changed'. + (mi_traceframe_changed): New. + * mi/mi-main.h (struct mi_suppress_notification) : + New field. + * NEWS: Mention the new MI notification. + 2012-09-17 Mike Wrighton * MAINTAINERS (Write After Approval): Add "Mike Wrighton". diff --git a/gdb/NEWS b/gdb/NEWS index dba6937459..e28292777b 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -43,6 +43,8 @@ py [command] ** Command parameter changes are now notified using new async record "=cmd-param-changed". + ** Trace frame changes caused by command "tfind" are now notified using + new async record "=traceframe-changed". *** Changes in GDB 7.5 diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index adcd4ff7b2..80e1b6069c 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,9 @@ +2012-09-18 Yao Qi + + * observer.texi (GDB Observers): New observer 'traceframe_changed'. + * gdb.texinfo (GDB/MI Async Records): Mention new MI notification + '=traceframe-changed'. + 2012-09-17 Yao Qi * gdb.texinfo (List): Describe the meaning of 0 and -1 in diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index dc8860af02..ee035219f2 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -27633,6 +27633,12 @@ thread group in whose context the library was unloaded. If the field is absent, it means the library was unloaded in the context of all present thread groups. +@item =traceframe-changed,num=@var{tfnum},tracepoint=@var{tpnum} +@itemx =traceframe-changed,end +Reports that the trace frame was changed and its new number is +@var{tfnum}. The number of the tracepoint associated with this trace +frame is @var{tpnum}. + @item =breakpoint-created,bkpt=@{...@} @itemx =breakpoint-modified,bkpt=@{...@} @itemx =breakpoint-deleted,id=@var{number} diff --git a/gdb/doc/observer.texi b/gdb/doc/observer.texi index c81e137273..42702869f8 100644 --- a/gdb/doc/observer.texi +++ b/gdb/doc/observer.texi @@ -187,6 +187,13 @@ A tracepoint has been modified in some way. The argument @var{tpnum} is the number of the modified tracepoint. @end deftypefun +@deftypefun void traceframe_changed (int @var{tfnum}, int @var{tpnum}) +The trace frame is changed to @var{tfnum} (e.g., by using the +@code{tfind} command). If @var{tfnum} is negative, it means +@value{GDBN} resumes live debugging. The number of the tracepoint +associated with this traceframe is @var{tpnum}. +@end deftypefun + @deftypefun void architecture_changed (struct gdbarch *@var{newarch}) The current architecture has changed. The argument @var{newarch} is a pointer to the new architecture. diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index 008f8cc5d5..2ed1905055 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c @@ -137,7 +137,8 @@ static struct mi_cmd mi_cmds[] = DEF_MI_CMD_MI ("thread-list-ids", mi_cmd_thread_list_ids), DEF_MI_CMD_MI ("thread-select", mi_cmd_thread_select), DEF_MI_CMD_MI ("trace-define-variable", mi_cmd_trace_define_variable), - DEF_MI_CMD_MI ("trace-find", mi_cmd_trace_find), + DEF_MI_CMD_MI_1 ("trace-find", mi_cmd_trace_find, + &mi_suppress_notification.traceframe), DEF_MI_CMD_MI ("trace-list-variables", mi_cmd_trace_list_variables), DEF_MI_CMD_MI ("trace-save", mi_cmd_trace_save), DEF_MI_CMD_MI ("trace-start", mi_cmd_trace_start), diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c index 94df818b18..9537aac25b 100644 --- a/gdb/mi/mi-interp.c +++ b/gdb/mi/mi-interp.c @@ -68,6 +68,7 @@ static void mi_on_resume (ptid_t ptid); static void mi_solib_loaded (struct so_list *solib); static void mi_solib_unloaded (struct so_list *solib); static void mi_about_to_proceed (void); +static void mi_traceframe_changed (int tfnum, int tpnum); static void mi_breakpoint_created (struct breakpoint *b); static void mi_breakpoint_deleted (struct breakpoint *b); static void mi_breakpoint_modified (struct breakpoint *b); @@ -126,6 +127,7 @@ mi_interpreter_init (struct interp *interp, int top_level) observer_attach_solib_loaded (mi_solib_loaded); observer_attach_solib_unloaded (mi_solib_unloaded); observer_attach_about_to_proceed (mi_about_to_proceed); + observer_attach_traceframe_changed (mi_traceframe_changed); observer_attach_breakpoint_created (mi_breakpoint_created); observer_attach_breakpoint_deleted (mi_breakpoint_deleted); observer_attach_breakpoint_modified (mi_breakpoint_modified); @@ -510,8 +512,31 @@ struct mi_suppress_notification mi_suppress_notification = { 0, 0, + 0, }; +/* Emit notification on changing a traceframe. */ + +static void +mi_traceframe_changed (int tfnum, int tpnum) +{ + struct mi_interp *mi = top_level_interpreter_data (); + + if (mi_suppress_notification.traceframe) + return; + + target_terminal_ours (); + + if (tfnum >= 0) + fprintf_unfiltered (mi->event_channel, "traceframe-changed," + "num=\"%d\",tracepoint=\"%d\"\n", + tfnum, tpnum); + else + fprintf_unfiltered (mi->event_channel, "traceframe-changed,end"); + + gdb_flush (mi->event_channel); +} + /* Emit notification about a created breakpoint. */ static void diff --git a/gdb/mi/mi-main.h b/gdb/mi/mi-main.h index f4268c26b0..aad7eebce1 100644 --- a/gdb/mi/mi-main.h +++ b/gdb/mi/mi-main.h @@ -39,6 +39,8 @@ struct mi_suppress_notification int breakpoint; /* Command param changed notification suppressed? */ int cmd_param_changed; + /* Traceframe changed notification suppressed? */ + int traceframe; }; extern struct mi_suppress_notification mi_suppress_notification; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index b458aba487..cba29fbb2b 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2012-09-18 Yao Qi + + * gdb.trace/mi-traceframe-changed.exp: New. + 2012-09-17 Yao Qi * gdb.base/list.exp (set_listsize): Don't set arg to "unlimited" diff --git a/gdb/testsuite/gdb.trace/mi-traceframe-changed.exp b/gdb/testsuite/gdb.trace/mi-traceframe-changed.exp new file mode 100644 index 0000000000..b587d10c38 --- /dev/null +++ b/gdb/testsuite/gdb.trace/mi-traceframe-changed.exp @@ -0,0 +1,136 @@ +# Copyright 2012 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +load_lib trace-support.exp +load_lib mi-support.exp +set MIFLAGS "-i=mi" + +standard_testfile tfile.c +set executable $testfile + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \ + executable {debug nowarnings}] != "" } { + untested ${testfile}.exp + return -1 +} + +# Make sure we are starting fresh. +remote_file host delete basic.tf +remote_file target delete basic.tf + +remote_exec target "$binfile" +# Copy tracefile from target to host. +remote_download host [remote_upload target basic.tf] basic.tf + +proc test_tfind_tfile { } { with_test_prefix "tfile" { + global binfile + global decimal + + if [mi_gdb_start] { + return + } + mi_gdb_load ${binfile} + + mi_gdb_test "-target-select tfile basic.tf" \ + ".*=breakpoint-created,bkpt=\{number=\"${decimal}\",type=\"tracepoint\",disp=\"keep\",enabled=\"y\",.*,func=\"write_basic_trace_file\".*\\^connected" \ + "select trace file" + + mi_gdb_test "tfind 0" \ + ".*=traceframe-changed,num=\"0\",tracepoint=\"${decimal}\".*\\^done" \ + "tfind 0" + + # No MI notification is sent because traceframe is not changed. + mi_gdb_test "tfind 0" \ + "\\&\"tfind 0\\\\n\"\r\n\~\"Found.*\\^done" \ + "tfind 0 again" + + mi_gdb_test "tfind end" \ + ".*=traceframe-changed,end.*\\^done" \ + "tfind end" + + # No MI notification is send because request is from MI command. + mi_gdb_test "-trace-find frame-number 0" \ + "-trace-find frame-number 0\r\n\\^done,found=\"1\",tracepoint=\"${decimal}\",traceframe=\"0\",frame=\{.*" \ + "-trace-find frame-number 0" + + mi_gdb_exit +}} + +test_tfind_tfile + +# Change to a different test case in order to run it on target, and get +# several traceframes. +standard_testfile status-stop.c +set testfile ${testfile}-1 +set binfile ${objdir}/${subdir}/${testfile} +set executable $testfile + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \ + executable {debug nowarnings}] != "" } { + untested ${testfile}.exp + return -1 +} + +# Test target supports tracepoints or not. + +clean_restart $executable + +if ![runto_main] { + fail "Can't run to main to check for trace support" + return -1 +} + +if ![gdb_target_supports_trace] { + unsupported "Current target does not support trace" + return -1; +} + +gdb_exit + +proc test_tfind_remote { } { with_test_prefix "remote" { + global decimal + + if [mi_gdb_start] { + return + } + mi_run_to_main + + mi_gdb_test "-break-insert end" "\\^done.*" "break end" + mi_gdb_test "-break-insert -a func2" "\\^done.*" "break func2" + mi_gdb_test "-trace-start" "\\^done.*" "trace start" + + mi_execute_to "exec-continue" "breakpoint-hit" end "" ".*" ".*" \ + { "" "disp=\"keep\"" } \ + "continue to end" + mi_gdb_test "-trace-stop" "\\^done.*" "trace stop" + + mi_gdb_test "tfind 0" \ + ".*=traceframe-changed,num=\"0\",tracepoint=\"${decimal}\".*\\^done" \ + "tfind 0" + + mi_gdb_test "tfind" \ + ".*=traceframe-changed,num=\"1\",tracepoint=\"${decimal}\".*\\^done" \ + "tfind" + + mi_gdb_test "tfind end" \ + ".*=traceframe-changed,end.*\\^done" \ + "tfind end" + + mi_gdb_exit +}} + +test_tfind_remote + +return 0 diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 3bdd1294b0..296999bbff 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -2288,9 +2288,13 @@ tfind_1 (enum trace_find_type type, int num, reinit_frame_cache (); target_dcache_invalidate (); + set_tracepoint_num (tp ? tp->base.number : target_tracept); + + if (target_frameno != get_traceframe_number ()) + observer_notify_traceframe_changed (target_frameno, tracepoint_number); + set_current_traceframe (target_frameno); - set_tracepoint_num (tp ? tp->base.number : target_tracept); if (target_frameno == -1) set_traceframe_context (NULL); else