diff options
author | Joel Brobecker <brobecker@gnat.com> | 2011-10-02 02:13:13 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2011-10-02 02:13:13 +0000 |
commit | dd11a36cfed586c986916fa8ae3a087af6408fb3 (patch) | |
tree | a6238eb102c351626e48880c889e5d44b2835a96 /gdb | |
parent | 2fed52b14d501f43023fe5d167ee4c7b4cf9e0d6 (diff) | |
download | gdb-dd11a36cfed586c986916fa8ae3a087af6408fb3.zip gdb-dd11a36cfed586c986916fa8ae3a087af6408fb3.tar.gz gdb-dd11a36cfed586c986916fa8ae3a087af6408fb3.tar.bz2 |
thread-specific breakpoints not saved properly by save-breakpoint
Initially, I noticed that the save command was often missing
new lines in the file that it generated. For instance, consider:
% gdb save-bp
(gdb) b break_me
(gdb) b save-bp.c:27
(gdb) save breakpoints bps
The contents of the bps file would be:
% cat bps
break break_mebreak save-bp.c:27
Looking further into the problem, I realized that the missing newlines
are just a consequence of a missing call to print_recreate_thread.
After having generated the breakpoint location in the break command,
we cannot put a new line until we have looked at whether we need to
add a 'thread NUM' argument.
gdb/ChangeLog:
* breakpoint.c (bkpt_print_recreate): Add call to
print_recreate_thread.
gdb/testsuite/ChangeLog:
* gdb.base/save-bp.exp, gdb.base/save-bp.c: New files.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/breakpoint.c | 1 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/save-bp.c | 36 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/save-bp.exp | 69 |
5 files changed, 115 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 49a6de1..00552fe 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2011-10-02 Joel Brobecker <brobecker@adacore.com> + + * breakpoint.c (bkpt_print_recreate): Add call to + print_recreate_thread. + 2011-09-29 Mike Frysinger <vapier@gentoo.org> * common/linux-ptrace.h (PTRACE_GETFDPIC, PTRACE_GETFDPIC_EXEC, diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index f995b14..08ff69b 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -11047,6 +11047,7 @@ bkpt_print_recreate (struct breakpoint *tp, struct ui_file *fp) _("unhandled breakpoint type %d"), (int) tp->type); fprintf_unfiltered (fp, " %s", tp->addr_string); + print_recreate_thread (tp, fp); } /* Virtual table for internal breakpoints. */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index a2380a0..cdd1837 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-10-02 Joel Brobecker <brobecker@adacore.com> + + * gdb.base/save-bp.exp, gdb.base/save-bp.c: New files. + 2011-10-01 Jan Kratochvil <jan.kratochvil@redhat.com> Pedro Alves <pedro@codesourcery.com> diff --git a/gdb/testsuite/gdb.base/save-bp.c b/gdb/testsuite/gdb.base/save-bp.c new file mode 100644 index 0000000..3469124 --- /dev/null +++ b/gdb/testsuite/gdb.base/save-bp.c @@ -0,0 +1,36 @@ +/* Copyright 2011 Free Software Foundation, Inc. + + This file is part of GDB. + + 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/>. */ + +void +break_me (void) +{ +} + +int +main (void) +{ + int i; + break_me (); /* BREAK HERE. */ + break_me (); /* Try a thread-specific breakpoint. */ + + for (i = 0; i < 5; i++) + break_me (); /* Try a condition-specific breakpoint. */ + + break_me (); /* Finally, try a breakpoint with commands. */ + return 0; +} + diff --git a/gdb/testsuite/gdb.base/save-bp.exp b/gdb/testsuite/gdb.base/save-bp.exp new file mode 100644 index 0000000..1ab8646 --- /dev/null +++ b/gdb/testsuite/gdb.base/save-bp.exp @@ -0,0 +1,69 @@ +# Copyright (C) 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 <http://www.gnu.org/licenses/>. + +set testfile save-bp +set srcfile ${testfile}.c + +if { [prepare_for_testing ${testfile}.exp ${testfile}] } { + return -1 +} + +if ![runto_main] { + untested ${testfile}.exp + return -1 +} +# Delete all breakpoints so that the "runto_main" breakpoint above +# does not interfere with our testing. +delete_breakpoints + +# Insert a bunch of breakpoints... The goal is to create breakpoints +# that we are going to try to save in a file and then reload. So +# try to create a good variety of them. +gdb_breakpoint "break_me" + +set loc_bp2 [gdb_get_line_number "BREAK HERE"] +gdb_breakpoint ${srcfile}:${loc_bp2} + +set loc_bp3 [gdb_get_line_number "thread-specific"] +gdb_breakpoint "${srcfile}:${loc_bp3} thread 1" + +set loc_bp4 [gdb_get_line_number "condition"] +gdb_breakpoint "${srcfile}:${loc_bp4} if i == 1" + +set loc_bp5 [gdb_get_line_number "with commands"] +gdb_breakpoint ${srcfile}:${loc_bp5} +gdb_test "commands\nsilent\nend" "End with.*" "add breakpoint commands" + +# Now, save the breakpoints into a file... +remote_file host delete "bps" +gdb_test "save breakpoint bps" + +# Now start a new debugger session... +clean_restart $testfile +if ![runto_main] { + fail "cannot restart program" + return -1 +} +# Delete all breakpoints so that the "runto_main" breakpoint above +# does not interfere with our testing. +delete_breakpoints + +# ... and restore the breakpoints. +gdb_test "source bps" + +# Now, verify that all breakpoints have been created correctly... +set bp_row_start "\[0-9\]+ +breakpoint +keep +y +0x\[0-9a-f\]+ +in" +gdb_test "info break" \ + " *Num +Type +Disp +Enb +Address +What\r\n$bp_row_start break_me at .*$srcfile:\[0-9\]+\r\n$bp_row_start main at .*$srcfile:$loc_bp2\r\n$bp_row_start main at .*$srcfile:$loc_bp3 +thread 1\r\n\[ \t]+stop only in thread 1\r\n$bp_row_start main at .*$srcfile:$loc_bp4\r\n\[ \t\]+stop only if i == 1\r\n$bp_row_start main at .*$srcfile:$loc_bp5\r\n\[ \t\]+silent" |