diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bf73755c477..85c733e203f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-09-16 Tankut Baris Aktemur + + * breakpoint.c (commands_command_1): Make a copy of the 'arg' + argument. + 2020-09-16 Andrew Burgess * ada-lang.c (ada_language_data): Delete. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index fff80ff907e..3fb259ff409 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1229,13 +1229,23 @@ commands_command_1 (const char *arg, int from_tty, if (arg == NULL || !*arg) { + /* Argument not explicitly given. Synthesize it. */ if (breakpoint_count - prev_breakpoint_count > 1) new_arg = string_printf ("%d-%d", prev_breakpoint_count + 1, breakpoint_count); else if (breakpoint_count > 0) new_arg = string_printf ("%d", breakpoint_count); - arg = new_arg.c_str (); } + else + { + /* Create a copy of ARG. This is needed because the "commands" + command may be coming from a script. In that case, the read + line buffer is going to be overwritten in the lambda of + 'map_breakpoint_numbers' below when reading the next line + before we are are done parsing the breakpoint numbers. */ + new_arg = arg; + } + arg = new_arg.c_str (); map_breakpoint_numbers (arg, [&] (breakpoint *b) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index d368b2dfc1a..848f35ff7ec 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2020-09-16 Tankut Baris Aktemur + + * gdb.base/bp-cmds-sourced-script.c: New file. + * gdb.base/bp-cmds-sourced-script.exp: New test. + * gdb.base/bp-cmds-sourced-script.gdb: New file. + 2020-09-16 Tom de Vries * lib/gdbserver-support.exp (gdbserver_exit): Make sure we diff --git a/gdb/testsuite/gdb.base/bp-cmds-sourced-script.c b/gdb/testsuite/gdb.base/bp-cmds-sourced-script.c new file mode 100644 index 00000000000..f4825c8a7c1 --- /dev/null +++ b/gdb/testsuite/gdb.base/bp-cmds-sourced-script.c @@ -0,0 +1,22 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2020 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 . */ + +int +main () +{ + return 0; +} diff --git a/gdb/testsuite/gdb.base/bp-cmds-sourced-script.exp b/gdb/testsuite/gdb.base/bp-cmds-sourced-script.exp new file mode 100644 index 00000000000..db551f19180 --- /dev/null +++ b/gdb/testsuite/gdb.base/bp-cmds-sourced-script.exp @@ -0,0 +1,39 @@ +# Copyright 2020 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 . */ + +# Test that breakpoint commands entered in a GDB script work as +# expected when the commands are defined for multiple breakpoints. + +standard_testfile + +if {[prepare_for_testing "failed to prepare" $testfile $srcfile]} { + return -1 +} + +set script_file ${srcdir}/${subdir}/$testfile.gdb + +gdb_test "source $script_file" \ + "Breakpoint 1\[^\r\n\]*\r\nBreakpoint 2\[^\r\n\]*" \ + "source the script" + +gdb_run_cmd + +gdb_test_multiple "" "commands executed twice" { + -re "\\$${decimal} = 100123\r\n\\$${decimal} = 100123\r\n$gdb_prompt $" { + pass $gdb_test_name + } +} + +gdb_continue_to_end diff --git a/gdb/testsuite/gdb.base/bp-cmds-sourced-script.gdb b/gdb/testsuite/gdb.base/bp-cmds-sourced-script.gdb new file mode 100644 index 00000000000..228fa388db1 --- /dev/null +++ b/gdb/testsuite/gdb.base/bp-cmds-sourced-script.gdb @@ -0,0 +1,20 @@ +# Copyright 2020 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 . */ + +break main +break main +commands 1 2 + print 100123 +end