This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH 4/4] MI notification on trace stop: triggered by remote
- From: Yao Qi <yao at codesourcery dot com>
- To: <gdb-patches at sourceware dot org>
- Date: Thu, 12 Dec 2013 21:49:44 +0800
- Subject: [PATCH 4/4] MI notification on trace stop: triggered by remote
- Authentication-results: sourceware.org; auth=none
- References: <1386856184-16519-1-git-send-email-yao at codesourcery dot com>
As a result of previous patch, GDB has a Trace remote notification.
In this patch, GDB starts to use Trace notification, and emits MI
notification '=trace-stopped' to front-end. A test case is
added to see if MI trace-stopped notification is emitted when trace
buffer is full.
gdb:
* remote-notif-trace.c: Include "observer.h".
(remote_notif_trace_status_parse): Call
observer_notify_trace_changed.
gdb/testsuite:
* gdb.trace/mi-trace-changed.exp (test_trace_buffer_full): New.
---
gdb/remote-notif-trace.c | 12 ++++
gdb/testsuite/gdb.trace/mi-trace-changed.exp | 75 ++++++++++++++++++++++++++
2 files changed, 87 insertions(+), 0 deletions(-)
diff --git a/gdb/remote-notif-trace.c b/gdb/remote-notif-trace.c
index ec7f46c..a409753 100644
--- a/gdb/remote-notif-trace.c
+++ b/gdb/remote-notif-trace.c
@@ -22,6 +22,7 @@
#include "remote.h"
#include "tracepoint.h"
#include "remote-notif.h"
+#include "observer.h"
static void
remote_notif_trace_parse (struct notif_client *self, char *buf,
@@ -34,6 +35,17 @@ remote_notif_trace_parse (struct notif_client *self, char *buf,
if (buf[7] != 'T')
error (_("Unknown trace status in trace notification."));
parse_trace_status (buf + 7 + 1, ts);
+
+ /* When the tracing is stopped, there is no changes anymore in
+ the trace, so the remote stub can't send another
+ notification. We don't have to worry about notifying
+ 'trace_changed' observer with argument 1 twice.
+ The remote stub can't request tracing start and the remote
+ stub may send multiple trace notifications on various status
+ changes, we don't notify 'trace_changed' observer with
+ argument 0. */
+ if (!ts->running)
+ observer_notify_trace_changed (0);
}
else
error (_("Unknown trace notification."));
diff --git a/gdb/testsuite/gdb.trace/mi-trace-changed.exp b/gdb/testsuite/gdb.trace/mi-trace-changed.exp
index fbd6fe7..9d6cfff 100644
--- a/gdb/testsuite/gdb.trace/mi-trace-changed.exp
+++ b/gdb/testsuite/gdb.trace/mi-trace-changed.exp
@@ -71,4 +71,79 @@ proc test_normal_tstart_stop { } {
test_normal_tstart_stop
+# Verify that MI notification '=trace-stopped' is emitted when trace
+# buffer is full.
+
+proc test_trace_buffer_full { } {
+ with_test_prefix "tracebuffer full" {
+ global mi_gdb_prompt
+
+ if [mi_gdb_start] {
+ return
+ }
+ mi_run_to_main
+
+ mi_gdb_test "-break-insert -a func2" {.*\^done,bkpt=.*} \
+ "insert tracepoint on func2"
+
+ send_gdb "actions\n"
+ gdb_expect {
+ -re "End with" {
+ }
+ }
+
+ send_gdb "collect buf\nend\n"
+ set test "define actions"
+ gdb_expect {
+ -re ".*${mi_gdb_prompt}$" {
+ pass $test
+ }
+ timeout {
+ fail "$test (timeout)"
+ }
+ }
+
+ # No =trace-started notification.
+ mi_gdb_test "-trace-start" "-trace-start\r\n=breakpoint-modified\[^\n\]+\r\n\\^done" \
+ "start trace without notification"
+ mi_gdb_test "-break-insert end" {.*\^done,bkpt=.*} \
+ "insert breakpoint on end"
+
+ mi_send_resuming_command "exec-continue" \
+ "continuing execution to end"
+
+ set test "trace-stopped triggered by bufferfull"
+ gdb_expect {
+ # We don't set stop-notes.
+ -re "=trace-stopped\\\\n" {
+ pass "$test"
+ }
+ timeout {
+ fail "$test (timeout)"
+ }
+ }
+
+ global async
+ # In sync mode, eat all the output. Don't have to do so in
+ # async mode.
+ if {!$async} {
+ gdb_expect {
+ -re ".*${mi_gdb_prompt}$" {
+ }
+ }
+ }
+ # GDB has got the rsp notifcation from remote stub that trace
+ # is stopped.
+ mi_gdb_test "tstop" ".*Trace is not running.*" \
+ "tstop on stopped"
+
+ mi_gdb_test "-trace-status" ".*\\^done.*stop-reason=\"overflow\".*" \
+ "trace-status"
+
+ mi_gdb_exit
+ }
+}
+
+test_trace_buffer_full
+
return 0
--
1.7.7.6