* 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) <traceframe>:
	New field.

	* NEWS: Mention the new MI notification.

gdb/testsuite:

	* gdb.trace/mi-traceframe-changed.exp: New.
This commit is contained in:
Yao Qi 2012-09-18 11:33:43 +00:00
parent fbdc86d9c9
commit 201b4506b3
11 changed files with 209 additions and 2 deletions

View File

@ -1,3 +1,17 @@
2012-09-18 Yao Qi <yao@codesourcery.com>
* 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) <traceframe>:
New field.
* NEWS: Mention the new MI notification.
2012-09-17 Mike Wrighton <wrighton@codesourcery.com> 2012-09-17 Mike Wrighton <wrighton@codesourcery.com>
* MAINTAINERS (Write After Approval): Add "Mike Wrighton". * MAINTAINERS (Write After Approval): Add "Mike Wrighton".

View File

@ -43,6 +43,8 @@ py [command]
** Command parameter changes are now notified using new async record ** Command parameter changes are now notified using new async record
"=cmd-param-changed". "=cmd-param-changed".
** Trace frame changes caused by command "tfind" are now notified using
new async record "=traceframe-changed".
*** Changes in GDB 7.5 *** Changes in GDB 7.5

View File

@ -1,3 +1,9 @@
2012-09-18 Yao Qi <yao@codesourcery.com>
* 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 <yao@codesourcery.com> 2012-09-17 Yao Qi <yao@codesourcery.com>
* gdb.texinfo (List): Describe the meaning of 0 and -1 in * gdb.texinfo (List): Describe the meaning of 0 and -1 in

View File

@ -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 absent, it means the library was unloaded in the context of all present
thread groups. 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=@{...@} @item =breakpoint-created,bkpt=@{...@}
@itemx =breakpoint-modified,bkpt=@{...@} @itemx =breakpoint-modified,bkpt=@{...@}
@itemx =breakpoint-deleted,id=@var{number} @itemx =breakpoint-deleted,id=@var{number}

View File

@ -187,6 +187,13 @@ A tracepoint has been modified in some way. The argument @var{tpnum}
is the number of the modified tracepoint. is the number of the modified tracepoint.
@end deftypefun @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}) @deftypefun void architecture_changed (struct gdbarch *@var{newarch})
The current architecture has changed. The argument @var{newarch} is The current architecture has changed. The argument @var{newarch} is
a pointer to the new architecture. a pointer to the new architecture.

View File

@ -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-list-ids", mi_cmd_thread_list_ids),
DEF_MI_CMD_MI ("thread-select", mi_cmd_thread_select), 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-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-list-variables", mi_cmd_trace_list_variables),
DEF_MI_CMD_MI ("trace-save", mi_cmd_trace_save), DEF_MI_CMD_MI ("trace-save", mi_cmd_trace_save),
DEF_MI_CMD_MI ("trace-start", mi_cmd_trace_start), DEF_MI_CMD_MI ("trace-start", mi_cmd_trace_start),

View File

@ -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_loaded (struct so_list *solib);
static void mi_solib_unloaded (struct so_list *solib); static void mi_solib_unloaded (struct so_list *solib);
static void mi_about_to_proceed (void); 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_created (struct breakpoint *b);
static void mi_breakpoint_deleted (struct breakpoint *b); static void mi_breakpoint_deleted (struct breakpoint *b);
static void mi_breakpoint_modified (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_loaded (mi_solib_loaded);
observer_attach_solib_unloaded (mi_solib_unloaded); observer_attach_solib_unloaded (mi_solib_unloaded);
observer_attach_about_to_proceed (mi_about_to_proceed); 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_created (mi_breakpoint_created);
observer_attach_breakpoint_deleted (mi_breakpoint_deleted); observer_attach_breakpoint_deleted (mi_breakpoint_deleted);
observer_attach_breakpoint_modified (mi_breakpoint_modified); observer_attach_breakpoint_modified (mi_breakpoint_modified);
@ -510,8 +512,31 @@ struct mi_suppress_notification mi_suppress_notification =
{ {
0, 0,
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. */ /* Emit notification about a created breakpoint. */
static void static void

View File

@ -39,6 +39,8 @@ struct mi_suppress_notification
int breakpoint; int breakpoint;
/* Command param changed notification suppressed? */ /* Command param changed notification suppressed? */
int cmd_param_changed; int cmd_param_changed;
/* Traceframe changed notification suppressed? */
int traceframe;
}; };
extern struct mi_suppress_notification mi_suppress_notification; extern struct mi_suppress_notification mi_suppress_notification;

View File

@ -1,3 +1,7 @@
2012-09-18 Yao Qi <yao@codesourcery.com>
* gdb.trace/mi-traceframe-changed.exp: New.
2012-09-17 Yao Qi <yao@codesourcery.com> 2012-09-17 Yao Qi <yao@codesourcery.com>
* gdb.base/list.exp (set_listsize): Don't set arg to "unlimited" * gdb.base/list.exp (set_listsize): Don't set arg to "unlimited"

View File

@ -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 <http://www.gnu.org/licenses/>.
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

View File

@ -2288,9 +2288,13 @@ tfind_1 (enum trace_find_type type, int num,
reinit_frame_cache (); reinit_frame_cache ();
target_dcache_invalidate (); 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_current_traceframe (target_frameno);
set_tracepoint_num (tp ? tp->base.number : target_tracept);
if (target_frameno == -1) if (target_frameno == -1)
set_traceframe_context (NULL); set_traceframe_context (NULL);
else else