* [PATCH] traceframe_changed observer and MI notification
@ 2012-08-31 9:10 Yao Qi
2012-09-07 6:59 ` [ping]: " Yao Qi
` (2 more replies)
0 siblings, 3 replies; 12+ messages in thread
From: Yao Qi @ 2012-08-31 9:10 UTC (permalink / raw)
To: gdb-patches
Hi,
Similar to 'command parameter changed' notification I did some weeks ago,
this patch teaches GDB to emit MI notification for traceframe changes due
to user type 'tfind XXX' in console.
Regression tested on x86_64-linux native and gdbserver. OK?
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) <traceframe>:
New field.
gdb/testsuite:
* gdb.trace/mi-traceframe-changed.exp: New.
---
gdb/doc/gdb.texinfo | 7 +
gdb/doc/observer.texi | 7 +
gdb/mi/mi-cmds.c | 3 +-
gdb/mi/mi-interp.c | 23 ++++
gdb/mi/mi-main.h | 2 +
gdb/testsuite/gdb.trace/mi-traceframe-changed.exp | 136 +++++++++++++++++++++
gdb/tracepoint.c | 6 +-
7 files changed, 182 insertions(+), 2 deletions(-)
create mode 100644 gdb/testsuite/gdb.trace/mi-traceframe-changed.exp
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 2d49e13..3349abd 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -27631,6 +27631,13 @@ 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 traceframe is changed and its number is @var{tfnum}.
+or @value{GDBN} stops examining traceframes and resumes live debugging.
+The number of the tracepoint associated with this traceframe 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 c81e137..81d3bf9 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 traceframe is changed to @var{tfnum} in command @code{tfind}.
+The number of the tracepoint associated with this traceframe is
+@var{tpnum}. When @var{tfnum} is negative, @value{GDBN} resumes
+live debugging.
+@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 008f8cc..2ed1905 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 94df818..2a01ba9 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,29 @@ struct mi_suppress_notification mi_suppress_notification =
{
0,
0,
+ 0,
};
+static void
+mi_traceframe_changed (int tfnum, int tpnum)
+{
+ struct mi_interp *mi = top_level_interpreter_data ();
+
+ target_terminal_ours ();
+
+ if (mi_suppress_notification.traceframe)
+ return;
+
+ 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 f4268c2..aad7eeb 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/gdb.trace/mi-traceframe-changed.exp b/gdb/testsuite/gdb.trace/mi-traceframe-changed.exp
new file mode 100644
index 0000000..b587d10
--- /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 <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
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index 3bdd129..296999b 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
--
1.7.7.6
^ permalink raw reply [flat|nested] 12+ messages in thread
* [ping]: [PATCH] traceframe_changed observer and MI notification
2012-08-31 9:10 [PATCH] traceframe_changed observer and MI notification Yao Qi
@ 2012-09-07 6:59 ` Yao Qi
2012-09-10 18:52 ` Tom Tromey
2012-09-18 0:09 ` Yao Qi
2 siblings, 0 replies; 12+ messages in thread
From: Yao Qi @ 2012-09-07 6:59 UTC (permalink / raw)
To: gdb-patches
On 08/31/2012 05:09 PM, Yao Qi wrote:
> 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) <traceframe>:
> New field.
>
> gdb/testsuite:
>
> * gdb.trace/mi-traceframe-changed.exp: New.
Ping. http://sourceware.org/ml/gdb-patches/2012-08/msg00885.html
A new version with a NEWS entry added is posted here.
--
Yao
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) <traceframe>:
New field.
* NEWS: Mention the new MI notification.
gdb/testsuite:
* gdb.trace/mi-traceframe-changed.exp: New.
---
gdb/NEWS | 2 +
gdb/doc/gdb.texinfo | 7 +
gdb/doc/observer.texi | 7 +
gdb/mi/mi-cmds.c | 3 +-
gdb/mi/mi-interp.c | 23 ++++
gdb/mi/mi-main.h | 2 +
gdb/testsuite/gdb.trace/mi-traceframe-changed.exp | 136 +++++++++++++++++++++
gdb/tracepoint.c | 6 +-
8 files changed, 184 insertions(+), 2 deletions(-)
create mode 100644 gdb/testsuite/gdb.trace/mi-traceframe-changed.exp
diff --git a/gdb/NEWS b/gdb/NEWS
index dba6937..126c2af 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".
+ ** Traceframe changes caused by command "tfind" are now notified using
+ new async record "=traceframe-changed".
*** Changes in GDB 7.5
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 2d49e13..3349abd 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -27631,6 +27631,13 @@ 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 traceframe is changed and its number is @var{tfnum}.
+or @value{GDBN} stops examining traceframes and resumes live debugging.
+The number of the tracepoint associated with this traceframe 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 c81e137..81d3bf9 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 traceframe is changed to @var{tfnum} in command @code{tfind}.
+The number of the tracepoint associated with this traceframe is
+@var{tpnum}. When @var{tfnum} is negative, @value{GDBN} resumes
+live debugging.
+@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 008f8cc..2ed1905 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 94df818..2a01ba9 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,29 @@ struct mi_suppress_notification mi_suppress_notification =
{
0,
0,
+ 0,
};
+static void
+mi_traceframe_changed (int tfnum, int tpnum)
+{
+ struct mi_interp *mi = top_level_interpreter_data ();
+
+ target_terminal_ours ();
+
+ if (mi_suppress_notification.traceframe)
+ return;
+
+ 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 f4268c2..aad7eeb 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/gdb.trace/mi-traceframe-changed.exp b/gdb/testsuite/gdb.trace/mi-traceframe-changed.exp
new file mode 100644
index 0000000..b587d10
--- /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 <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
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index 3bdd129..296999b 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
--
1.7.7.6
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] traceframe_changed observer and MI notification
2012-08-31 9:10 [PATCH] traceframe_changed observer and MI notification Yao Qi
2012-09-07 6:59 ` [ping]: " Yao Qi
@ 2012-09-10 18:52 ` Tom Tromey
2012-09-11 13:38 ` Yao Qi
2012-09-18 0:09 ` Yao Qi
2 siblings, 1 reply; 12+ messages in thread
From: Tom Tromey @ 2012-09-10 18:52 UTC (permalink / raw)
To: Yao Qi; +Cc: gdb-patches
>>>>> "Yao" == Yao Qi <yao@codesourcery.com> writes:
Yao> Regression tested on x86_64-linux native and gdbserver. OK?
The idea seems fine to me.
Yao> +@item =traceframe-changed,num=@var{tfnum},tracepoint=@var{tpnum}
Yao> +@itemx =traceframe-changed,end
Yao> +Reports that the traceframe is changed and its number is @var{tfnum}.
Yao> +or @value{GDBN} stops examining traceframes and resumes live debugging.
Yao> +The number of the tracepoint associated with this traceframe is
Yao> +@var{tpnum}.
That should be a comma and not a period before "or".
Yao> +static void
Yao> +mi_traceframe_changed (int tfnum, int tpnum)
This function needs an introductory comment.
It can be brief.
Yao> + target_terminal_ours ();
Yao> +
Yao> + if (mi_suppress_notification.traceframe)
Yao> + return;
It seems to me that checking suppression first is probably better.
Tom
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] traceframe_changed observer and MI notification
2012-09-10 18:52 ` Tom Tromey
@ 2012-09-11 13:38 ` Yao Qi
2012-09-11 15:28 ` Tom Tromey
0 siblings, 1 reply; 12+ messages in thread
From: Yao Qi @ 2012-09-11 13:38 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
On 09/11/2012 02:52 AM, Tom Tromey wrote:
> That should be a comma and not a period before "or".
>
OK.
> Yao> +static void
> Yao> +mi_traceframe_changed (int tfnum, int tpnum)
>
> This function needs an introductory comment.
> It can be brief.
>
OK. Sorry for missing function comment again.
> Yao> + target_terminal_ours ();
> Yao> +
> Yao> + if (mi_suppress_notification.traceframe)
> Yao> + return;
>
> It seems to me that checking suppression first is probably better.
Fixed.
--
Yao
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) <traceframe>:
New field.
* NEWS: Mention the new MI notification.
gdb/testsuite:
* gdb.trace/mi-traceframe-changed.exp: New.
---
gdb/NEWS | 2 +
gdb/doc/gdb.texinfo | 7 +
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/gdb.trace/mi-traceframe-changed.exp | 136 +++++++++++++++++++++
gdb/tracepoint.c | 6 +-
8 files changed, 186 insertions(+), 2 deletions(-)
create mode 100644 gdb/testsuite/gdb.trace/mi-traceframe-changed.exp
diff --git a/gdb/NEWS b/gdb/NEWS
index dba6937..126c2af 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".
+ ** Traceframe changes caused by command "tfind" are now notified using
+ new async record "=traceframe-changed".
*** Changes in GDB 7.5
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 2d49e13..d9cd578 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -27631,6 +27631,13 @@ 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 traceframe is changed and its number is @var{tfnum}
+or @value{GDBN} stops examining traceframes and resumes live debugging.
+The number of the tracepoint associated with this traceframe 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 c81e137..81d3bf9 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 traceframe is changed to @var{tfnum} in command @code{tfind}.
+The number of the tracepoint associated with this traceframe is
+@var{tpnum}. When @var{tfnum} is negative, @value{GDBN} resumes
+live debugging.
+@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 008f8cc..2ed1905 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 94df818..9537aac 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 f4268c2..aad7eeb 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/gdb.trace/mi-traceframe-changed.exp b/gdb/testsuite/gdb.trace/mi-traceframe-changed.exp
new file mode 100644
index 0000000..b587d10
--- /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 <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
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index 3bdd129..296999b 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
--
1.7.7.6
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] traceframe_changed observer and MI notification
2012-09-11 13:38 ` Yao Qi
@ 2012-09-11 15:28 ` Tom Tromey
0 siblings, 0 replies; 12+ messages in thread
From: Tom Tromey @ 2012-09-11 15:28 UTC (permalink / raw)
To: Yao Qi; +Cc: gdb-patches
>>>>> "Yao" == Yao Qi <yao@codesourcery.com> writes:
Yao> OK. Sorry for missing function comment again.
No problem.
The code bits are ok; still needs a doc review though.
Tom
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] traceframe_changed observer and MI notification
2012-08-31 9:10 [PATCH] traceframe_changed observer and MI notification Yao Qi
2012-09-07 6:59 ` [ping]: " Yao Qi
2012-09-10 18:52 ` Tom Tromey
@ 2012-09-18 0:09 ` Yao Qi
2012-09-18 6:53 ` Eli Zaretskii
2 siblings, 1 reply; 12+ messages in thread
From: Yao Qi @ 2012-09-18 0:09 UTC (permalink / raw)
To: gdb-patches; +Cc: Eli Zaretskii
On 08/31/2012 05:09 PM, Yao Qi wrote:
> gdb/doc:
>
> * observer.texi (GDB Observers): New observer 'traceframe_changed'.
> * gdb.texinfo (GDB/MI Async Records): Mention new MI notification
> '=traceframe-changed'.
Eli,
Could you review the doc part of this patch?
http://sourceware.org/ml/gdb-patches/2012-08/msg00885.html
--
Yao
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] traceframe_changed observer and MI notification
2012-09-18 0:09 ` Yao Qi
@ 2012-09-18 6:53 ` Eli Zaretskii
2012-09-18 7:24 ` Yao Qi
0 siblings, 1 reply; 12+ messages in thread
From: Eli Zaretskii @ 2012-09-18 6:53 UTC (permalink / raw)
To: Yao Qi; +Cc: gdb-patches
> Date: Tue, 18 Sep 2012 08:08:18 +0800
> From: Yao Qi <yao@codesourcery.com>
> CC: Eli Zaretskii <eliz@gnu.org>
>
> On 08/31/2012 05:09 PM, Yao Qi wrote:
> > gdb/doc:
> >
> > * observer.texi (GDB Observers): New observer 'traceframe_changed'.
> > * gdb.texinfo (GDB/MI Async Records): Mention new MI notification
> > '=traceframe-changed'.
>
> Eli,
> Could you review the doc part of this patch?
> http://sourceware.org/ml/gdb-patches/2012-08/msg00885.html
Sorry about the delay. Here goes:
> +@item =traceframe-changed,num=@var{tfnum},tracepoint=@var{tpnum}
> +@itemx =traceframe-changed,end
> +Reports that the traceframe is changed and its number is @var{tfnum}.
I suggest to reword:
Reports that the trace frame was changed, and its new number is @var{tfnum}.
> +or @value{GDBN} stops examining traceframes and resumes live debugging.
This line should be edited to explain the meaning of negative values
of tfnum.
> +The number of the tracepoint associated with this traceframe is
> +@var{tpnum}. ^^^^^^^^^^
"trace frame"
> +@deftypefun void traceframe_changed (int @var{tfnum}, int @var{tpnum})
> +The traceframe is changed to @var{tfnum} in command @code{tfind}.
^^^^^^^^^^
"trace frame"
Also, I don't understand the significance of the reference to
'tfind'. Why is it important to mention that?
> +The number of the tracepoint associated with this traceframe is
> +@var{tpnum}. When @var{tfnum} is negative, @value{GDBN} resumes
> +live debugging.
The last sentence should follow the description of tfnum. I would
also rephrase it:
If var{tfnum} is negative, it means @value{GDBN} resumes live debugging.
Thanks.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] traceframe_changed observer and MI notification
2012-09-18 6:53 ` Eli Zaretskii
@ 2012-09-18 7:24 ` Yao Qi
2012-09-18 8:01 ` Eli Zaretskii
0 siblings, 1 reply; 12+ messages in thread
From: Yao Qi @ 2012-09-18 7:24 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: gdb-patches
On 09/18/2012 02:52 PM, Eli Zaretskii wrote:
>> +or @value{GDBN} stops examining traceframes and resumes live debugging.
> This line should be edited to explain the meaning of negative values
> of tfnum.
>
tfnum will never be negative in notification. In traceframe_changed
observer, tfnum can be negative, and notification
"=traceframe-changed,end" is emitted accordingly.
> Also, I don't understand the significance of the reference to
> 'tfind'. Why is it important to mention that?
>
because users use command 'tfind' to examine a certain traceframe, and
the changes of traceframe trigger this MI notification, so I mention
'tfind' here.
--
Yao
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] traceframe_changed observer and MI notification
2012-09-18 7:24 ` Yao Qi
@ 2012-09-18 8:01 ` Eli Zaretskii
2012-09-18 8:48 ` Yao Qi
0 siblings, 1 reply; 12+ messages in thread
From: Eli Zaretskii @ 2012-09-18 8:01 UTC (permalink / raw)
To: Yao Qi; +Cc: gdb-patches
> Date: Tue, 18 Sep 2012 15:23:02 +0800
> From: Yao Qi <yao@codesourcery.com>
> CC: <gdb-patches@sourceware.org>
>
> On 09/18/2012 02:52 PM, Eli Zaretskii wrote:
> >> +or @value{GDBN} stops examining traceframes and resumes live debugging.
> > This line should be edited to explain the meaning of negative values
> > of tfnum.
> >
>
> tfnum will never be negative in notification. In traceframe_changed
> observer, tfnum can be negative, and notification
> "=traceframe-changed,end" is emitted accordingly.
Then that line should be deleted.
> > Also, I don't understand the significance of the reference to
> > 'tfind'. Why is it important to mention that?
> >
>
> because users use command 'tfind' to examine a certain traceframe, and
> the changes of traceframe trigger this MI notification, so I mention
> 'tfind' here.
The text you wrote can be interpreted as if using 'tfind' was the only
way to change the trace frame. If that's not true, 'tfind' it should
be mentioned in parentheses, something like
(e.g., by using the @code{tfind} command)
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] traceframe_changed observer and MI notification
2012-09-18 8:01 ` Eli Zaretskii
@ 2012-09-18 8:48 ` Yao Qi
2012-09-18 9:42 ` Eli Zaretskii
0 siblings, 1 reply; 12+ messages in thread
From: Yao Qi @ 2012-09-18 8:48 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: gdb-patches
On 09/18/2012 04:01 PM, Eli Zaretskii wrote:
> Then that line should be deleted.
>
OK.
>>> > >Also, I don't understand the significance of the reference to
>>> > >'tfind'. Why is it important to mention that?
>>> > >
>> >
>> >because users use command 'tfind' to examine a certain traceframe, and
>> >the changes of traceframe trigger this MI notification, so I mention
>> >'tfind' here.
> The text you wrote can be interpreted as if using 'tfind' was the only
> way to change the trace frame. If that's not true, 'tfind' it should
> be mentioned in parentheses, something like
>
> (e.g., by using the @code{tfind} command)
How about the new one?
--
Yao
gdb/doc:
* observer.texi (GDB Observers): New observer 'traceframe_changed'.
* gdb.texinfo (GDB/MI Async Records): Mention new MI notification
'=traceframe-changed'.
gdb:
* NEWS: Mention the new MI notification.
---
diff --git a/gdb/NEWS b/gdb/NEWS
index dba6937..126c2af 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/gdb.texinfo b/gdb/doc/gdb.texinfo
index dc8860a..ee03521 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 c81e137..f682e9e 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). The number of the tracepoint associated with
+this traceframe is @var{tpnum}. If @var{tfnum} is negative, it means
+@value{GDBN} resumes live debugging.
+@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.
---
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] traceframe_changed observer and MI notification
2012-09-18 8:48 ` Yao Qi
@ 2012-09-18 9:42 ` Eli Zaretskii
2012-09-18 11:42 ` Yao Qi
0 siblings, 1 reply; 12+ messages in thread
From: Eli Zaretskii @ 2012-09-18 9:42 UTC (permalink / raw)
To: Yao Qi; +Cc: gdb-patches
> Date: Tue, 18 Sep 2012 16:47:01 +0800
> From: Yao Qi <yao@codesourcery.com>
> CC: <gdb-patches@sourceware.org>
>
> How about the new one?
OK, but ...
> +@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). The number of the tracepoint associated with
> +this traceframe is @var{tpnum}. If @var{tfnum} is negative, it means
> +@value{GDBN} resumes live debugging.
As I wrote earlier, the last sentence should follow the first one,
because it refers to tfnum, not to tpnum.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] traceframe_changed observer and MI notification
2012-09-18 9:42 ` Eli Zaretskii
@ 2012-09-18 11:42 ` Yao Qi
0 siblings, 0 replies; 12+ messages in thread
From: Yao Qi @ 2012-09-18 11:42 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: gdb-patches
On 09/18/2012 05:42 PM, Eli Zaretskii wrote:
> OK, but ...
>
>> >+@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). The number of the tracepoint associated with
>> >+this traceframe is @var{tpnum}. If @var{tfnum} is negative, it means
>> >+@value{GDBN} resumes live debugging.
> As I wrote earlier, the last sentence should follow the first one,
> because it refers to tfnum, not to tpnum.
Oops, I missed that point. Fixed.
Here is what I committed.
--
Yao
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) <traceframe>:
New field.
* NEWS: Mention the new MI notification.
gdb/testsuite:
* gdb.trace/mi-traceframe-changed.exp: New.
---
gdb/NEWS | 2 +
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/gdb.trace/mi-traceframe-changed.exp | 136 +++++++++++++++++++++
gdb/tracepoint.c | 6 +-
8 files changed, 185 insertions(+), 2 deletions(-)
create mode 100644 gdb/testsuite/gdb.trace/mi-traceframe-changed.exp
diff --git a/gdb/NEWS b/gdb/NEWS
index dba6937..126c2af 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/gdb.texinfo b/gdb/doc/gdb.texinfo
index dc8860a..ee03521 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 c81e137..4270286 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 008f8cc..2ed1905 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 94df818..9537aac 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 f4268c2..aad7eeb 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/gdb.trace/mi-traceframe-changed.exp b/gdb/testsuite/gdb.trace/mi-traceframe-changed.exp
new file mode 100644
index 0000000..b587d10
--- /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 <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
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index 3bdd129..296999b 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
--
1.7.7.6
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2012-09-18 11:42 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-08-31 9:10 [PATCH] traceframe_changed observer and MI notification Yao Qi
2012-09-07 6:59 ` [ping]: " Yao Qi
2012-09-10 18:52 ` Tom Tromey
2012-09-11 13:38 ` Yao Qi
2012-09-11 15:28 ` Tom Tromey
2012-09-18 0:09 ` Yao Qi
2012-09-18 6:53 ` Eli Zaretskii
2012-09-18 7:24 ` Yao Qi
2012-09-18 8:01 ` Eli Zaretskii
2012-09-18 8:48 ` Yao Qi
2012-09-18 9:42 ` Eli Zaretskii
2012-09-18 11:42 ` Yao Qi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox