From f493b71179ab70d5e278234cb763eede55d44e61 Mon Sep 17 00:00:00 2001 From: Kevin Buettner Date: Fri, 1 Oct 2021 17:14:00 -0700 Subject: [PATCH] Test case for Bug 28308 The purpose of this test is described in the comments in dprintf-execution-x-script.exp. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28308 The name of this new test was based on that of an existing test, bp-cmds-execution-x-script.exp. I started off by copying that test, adding to it, and then rewriting almost all of it. It's different enough that I decided that listing the copyright year as 2021 was sufficient. --- .../gdb.base/dprintf-execution-x-script.c | 53 ++++++++++++ .../gdb.base/dprintf-execution-x-script.exp | 85 +++++++++++++++++++ .../gdb.base/dprintf-execution-x-script.gdb | 21 +++++ 3 files changed, 159 insertions(+) create mode 100644 gdb/testsuite/gdb.base/dprintf-execution-x-script.c create mode 100644 gdb/testsuite/gdb.base/dprintf-execution-x-script.exp create mode 100644 gdb/testsuite/gdb.base/dprintf-execution-x-script.gdb diff --git a/gdb/testsuite/gdb.base/dprintf-execution-x-script.c b/gdb/testsuite/gdb.base/dprintf-execution-x-script.c new file mode 100644 index 00000000000..339541337b3 --- /dev/null +++ b/gdb/testsuite/gdb.base/dprintf-execution-x-script.c @@ -0,0 +1,53 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2021 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 . */ + +#include +#include + +volatile int vi = 0; + +void +inc_vi () +{ + vi++; +} + +void +print_vi () +{ + printf ("vi=%d\n", vi); +} + +void +increment () +{ + inc_vi (); +} + +int +main (int argc, char **argv) +{ + print_vi (); + increment (); + print_vi (); + increment (); + print_vi (); + increment (); + print_vi (); + + exit (0); +} diff --git a/gdb/testsuite/gdb.base/dprintf-execution-x-script.exp b/gdb/testsuite/gdb.base/dprintf-execution-x-script.exp new file mode 100644 index 00000000000..9133af752be --- /dev/null +++ b/gdb/testsuite/gdb.base/dprintf-execution-x-script.exp @@ -0,0 +1,85 @@ +# Copyright 2021 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 commands in a GDB script file run via GDB's -x flag work +# as expected. Specifically, the script creates a dprintf breakpoint +# as well as a normal breakpoint that has "continue" in its command +# list, and then does "run". Correct output from GDB is checked as +# part of this test. + +# Bail out if the target can't use the 'run' command. +if ![target_can_use_run_cmd] { + return 0 +} + +standard_testfile + +if {[build_executable "failed to prepare" $testfile $srcfile debug]} { + return -1 +} + +# This is the name of the GDB script to load. +set x_file ${srcdir}/${subdir}/$testfile.gdb + +# Create context in which the global, GDBFLAGS, will be restored at +# the end of the block. All commands run within the block are +# actually run in the outer context. (This is why 'res' is available +# outside of the save_vars block.) +save_vars { GDBFLAGS } { + # Set flags with which to start GDB. + append GDBFLAGS " -ex \"set height unlimited\"" + append GDBFLAGS " -x \"$x_file\"" + append GDBFLAGS " --args \"$binfile\"" + + # Start GDB with above flags. + set res [gdb_spawn] +} + +set test "load and run script with -x" +if { $res != 0} { + fail $test + return -1 +} + +# The script loaded via -x contains a run command; while running, GDB +# is expected to print three messages from dprintf breakpoints along +# with three interspersed messages from an ordinary breakpoint (which +# was set up with a continue command). Set up pattern D to match +# output from hitting the dprintf breakpoint and B for the ordinary +# breakpoint. Then set PAT to contain the entire pattern of expected +# output from the interspersed dprintf and ordinary breakpoints along +# with some (additional) expected output from the dprintf breakpoints, +# i.e. 0, 1, and 2. +set d "dprintf in increment.., vi=" +set b "Breakpoint ., inc_vi" +set pat "${d}0.*?$b.*?${d}1.*?$b.*?${d}2.*?$b.*?" + +proc do_test {cmd test} { + gdb_test $cmd "$::pat$::inferior_exited_re normally.*" $test +} + +# Check output from running script with -x +do_test "" $test + +# Restart GDB and 'source' the script; this will (still) run the program +# due to the 'run' command in the script. +clean_restart $binfile +do_test "source $x_file" "load and run script using source command" + +# This should leave us at the gdb prompt; Run program again using +# already established breakpoints, i.e. those loaded from the +# script. Prior to fixing PR 28308, this was the only test that +# would pass. +do_test "run" "run again" diff --git a/gdb/testsuite/gdb.base/dprintf-execution-x-script.gdb b/gdb/testsuite/gdb.base/dprintf-execution-x-script.gdb new file mode 100644 index 00000000000..83e7f21da42 --- /dev/null +++ b/gdb/testsuite/gdb.base/dprintf-execution-x-script.gdb @@ -0,0 +1,21 @@ +# Copyright 2021 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 . */ + +dprintf increment, "dprintf in increment(), vi=%d\n", vi +break inc_vi +commands + continue +end +run -- 2.30.2