aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base/bp-cmds-sourced-script.c
diff options
context:
space:
mode:
authorTankut Baris Aktemur <tankut.baris.aktemur@intel.com>2020-09-11 15:04:01 +0200
committerTankut Baris Aktemur <tankut.baris.aktemur@intel.com>2020-09-16 16:22:01 +0200
commitda1df1db9ae43050c8de62e4842428ddda7eb509 (patch)
tree892c7a196f1d9a241979bcd3f2bc4e5f0841804f /gdb/testsuite/gdb.base/bp-cmds-sourced-script.c
parent36068e2fa5460e6cfa1f5f359df6f37c497aab50 (diff)
downloadgdb-da1df1db9ae43050c8de62e4842428ddda7eb509.zip
gdb-da1df1db9ae43050c8de62e4842428ddda7eb509.tar.gz
gdb-da1df1db9ae43050c8de62e4842428ddda7eb509.tar.bz2
gdb/breakpoint: make a copy of the "commands" command's argument
When GDB reads commands from the input, its internal buffer is re-used for each line. This is usually just fine because commands are executed in order; by the time we read the next line, we are already done with the current line. However, a problematic case is breakpoint commands that are input from a script. The header (e.g. commands 1 2) is overwritten with the next line before the breakpoint numbers are processed completely. For example, suppose we have the following script: break main break main commands 1 2 print 100123 end and source this script: (gdb) source script.gdb Breakpoint 1 at 0x1245: file main.cpp, line 27. Breakpoint 2 at 0x1245: file main.cpp, line 27. No breakpoint number 123. Note the "No breakpoint number 123." error message. This happens because GDB first reads "commands 1 2" into its internal buffer buffer -> "commands 1 2" and then starts parsing the breakpoint numbers. After parsing the first token, the "next token" pointer is as below: buffer -> "commands 1 2" next-token -----------^ So, if we continue parsing, we would tokenize "2" correctly. However, before parsing the next number, GDB reads the commands to attach them to breakpoint 1. Reading the commands causes the buffer to be overwritten: buffer -> " print 100123" next-token -----------^ So, the next time we parse the breakpoint number, we read "123". To fix, simply create a copy of the arguments of the header. gdb/ChangeLog: 2020-09-16 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * breakpoint.c (commands_command_1): Make a copy of the 'arg' argument. gdb/testsuite/ChangeLog: 2020-09-16 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * 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.
Diffstat (limited to 'gdb/testsuite/gdb.base/bp-cmds-sourced-script.c')
-rw-r--r--gdb/testsuite/gdb.base/bp-cmds-sourced-script.c22
1 files changed, 22 insertions, 0 deletions
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 0000000..f4825c8
--- /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 <http://www.gnu.org/licenses/>. */
+
+int
+main ()
+{
+ return 0;
+}