From 4511b1ba87abd6e84846dcfd38087653a7ddbd89 Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Sat, 10 Dec 2011 15:16:35 +0000 Subject: [PATCH] 2011-12-10 Hui Zhu Yao Qi * tracepoint.c (start_tracing): Clear `inserted' flag. 2011-12-10 Yao Qi * gdb.trace/status-stop.exp: New. * gdb.trace/status-stop.c: New. --- gdb/ChangeLog | 5 + gdb/testsuite/ChangeLog | 5 + gdb/testsuite/gdb.trace/status-stop.c | 48 +++++++++ gdb/testsuite/gdb.trace/status-stop.exp | 124 ++++++++++++++++++++++++ gdb/tracepoint.c | 4 + 5 files changed, 186 insertions(+) create mode 100644 gdb/testsuite/gdb.trace/status-stop.c create mode 100644 gdb/testsuite/gdb.trace/status-stop.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 704bbea077..13998f5c59 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2011-12-10 Hui Zhu + Yao Qi + + * tracepoint.c (start_tracing): Clear `inserted' flag. + 2011-12-10 Hui Zhu * tracepoint.c (create_tsv_from_upload): Change sprintf to xstrprintf. diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 13dc28212a..2035a8a4d6 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-12-10 Yao Qi + + * gdb.trace/status-stop.exp: New. + * gdb.trace/status-stop.c: New. + 2011-12-09 Jan Kratochvil * gdb.reverse/until-precsave.exp (run to end of main) Extend the diff --git a/gdb/testsuite/gdb.trace/status-stop.c b/gdb/testsuite/gdb.trace/status-stop.c new file mode 100644 index 0000000000..9ff69d68e9 --- /dev/null +++ b/gdb/testsuite/gdb.trace/status-stop.c @@ -0,0 +1,48 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011 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 . */ + +static void +func1 (void) +{} + +int buf[1024]; + +static void +func2 (void) +{} + +static void +end (void) +{} + +int +main (void) +{ + int i; + + func1 (); + + /* We call func2 as many times as possible to make sure that trace is + stopped due to trace buffer is full. */ + for (i = 0; i < 10000; i++) + { + func2 (); + } + + end (); + return 0; +} diff --git a/gdb/testsuite/gdb.trace/status-stop.exp b/gdb/testsuite/gdb.trace/status-stop.exp new file mode 100644 index 0000000000..6c92b750bd --- /dev/null +++ b/gdb/testsuite/gdb.trace/status-stop.exp @@ -0,0 +1,124 @@ +# Copyright 2011 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"; + +set testfile "status-stop" +set executable $testfile +set srcfile ${testfile}.c +set binfile $objdir/$subdir/$testfile +set expfile $testfile.exp + + +if [prepare_for_testing $expfile $executable $srcfile \ + {debug nowarnings}] { + untested "failed to prepare for trace tests" + return -1 +} + +# Verify that the sequence of commands "tstart tstop tstart" works well. + +proc test_tstart_tstop_tstart { } { + global executable + global pf_prefix + global hex + + set old_pf_prefix $pf_prefix + set pf_prefix "$pf_prefix tstart_tstop_tstart:" + + # Start with a fresh gdb. + clean_restart ${executable} + if ![runto_main] { + fail "Can't run to main" + set pf_prefix $old_pf_prefix + return -1 + } + + gdb_test "trace func1" "Tracepoint \[0-9\] at $hex: file.*" + gdb_test_no_output "tstart" + + gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*" + gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end" + + gdb_test_no_output "tstop" + + gdb_test_no_output "tstart" + + set pf_prefix $old_pf_prefix +} + +# Verify the sequence of commands "tstart tstart" works well. + +proc test_tstart_tstart { } { + global executable + global pf_prefix + global hex + + set old_pf_prefix $pf_prefix + set pf_prefix "$pf_prefix tstart_tstart:" + + # Start with a fresh gdb. + clean_restart ${executable} + if ![runto_main] { + fail "Can't run to main" + set pf_prefix $old_pf_prefix + return -1 + } + + gdb_test "trace func1" "Tracepoint \[0-9\] at $hex: file.*" + gdb_test_no_output "tstart" + + gdb_test "tstart" "" "tstart again" "A trace is running already. Start a new run\\? \\(y or n\\) " "y" + + set pf_prefix $old_pf_prefix +} + +# Verify that trace stops clearly when trace buffer is full. + +proc test_buffer_full_tstart { } { + global executable + global pf_prefix + global hex + + set old_pf_prefix $pf_prefix + set pf_prefix "$pf_prefix buffer_full_tstart:" + + # Start with a fresh gdb. + clean_restart ${executable} + if ![runto_main] { + fail "Can't run to main" + set pf_prefix $old_pf_prefix + return -1 + } + + gdb_test "trace func2" "Tracepoint \[0-9\] at $hex: file.*" + gdb_trace_setactions "collect buf: define actions" \ + "" \ + "collect buf" "^$" + + gdb_test_no_output "tstart" + gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*" + gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end" + + gdb_test "tstatus" ".*buffer was full.*" + gdb_test_no_output "tstart" + + set old_pf_prefix $pf_prefix +} + +test_tstart_tstop_tstart + +test_tstart_tstart + +test_buffer_full_tstart \ No newline at end of file diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index fa79d53a4b..79a64a3a27 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -1756,6 +1756,10 @@ start_tracing (char *notes) struct tracepoint *t = (struct tracepoint *) b; struct bp_location *loc; + /* Clear `inserted' flag. */ + for (loc = b->loc; loc; loc = loc->next) + loc->inserted = 0; + if ((b->type == bp_fast_tracepoint ? !may_insert_fast_tracepoints : !may_insert_tracepoints))