[RFC 4/4] [gdb/testsuite] Add test-case gdb.base/gdb-sigterm-3.exp
Tom de Vries
tdevries@suse.de
Wed Nov 29 20:33:26 GMT 2023
Reproduce PR gdb/31061 (originally reported on arm, a software single-step
architecture) on amd64, a hardware single-step architecture, using the new
maintenance command "maint set prefer-software-single-stepping on".
The test-case is based on gdb.base/gdb-sigterm.exp, so leave the 2013-2023
copyright years in place.
Tested on x86_64-linux.
---
gdb/testsuite/gdb.base/gdb-sigterm-3.c | 52 +++++++++++
gdb/testsuite/gdb.base/gdb-sigterm-3.exp | 105 +++++++++++++++++++++++
2 files changed, 157 insertions(+)
create mode 100644 gdb/testsuite/gdb.base/gdb-sigterm-3.c
create mode 100644 gdb/testsuite/gdb.base/gdb-sigterm-3.exp
diff --git a/gdb/testsuite/gdb.base/gdb-sigterm-3.c b/gdb/testsuite/gdb.base/gdb-sigterm-3.c
new file mode 100644
index 00000000000..3e359f009ee
--- /dev/null
+++ b/gdb/testsuite/gdb.base/gdb-sigterm-3.c
@@ -0,0 +1,52 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2013-2023 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/>. */
+
+#include <unistd.h>
+
+#if defined(__s390__) || defined(__s390x__)
+#define NOP asm("nopr 0")
+#elif defined(__or1k__)
+#define NOP asm("l.nop")
+#else
+#define NOP asm("nop")
+#endif
+
+#define NOP10 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP
+
+int
+main (void)
+{
+ /* Allow for as much timeout as DejaGnu wants, plus a bit of
+ slack. */
+ unsigned int seconds = TIMEOUT + 20;
+
+ alarm (seconds);
+
+ for (;;) /* loop-line */
+ {
+ NOP10;
+ NOP10;
+ NOP10;
+ NOP10;
+ NOP10;
+ NOP10;
+ NOP10;
+ NOP10;
+ NOP10;
+ NOP10;
+ }
+}
diff --git a/gdb/testsuite/gdb.base/gdb-sigterm-3.exp b/gdb/testsuite/gdb.base/gdb-sigterm-3.exp
new file mode 100644
index 00000000000..44ce20b4f26
--- /dev/null
+++ b/gdb/testsuite/gdb.base/gdb-sigterm-3.exp
@@ -0,0 +1,105 @@
+# This testcase is part of GDB, the GNU debugger.
+#
+# Copyright 2013-2023 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/>.
+
+# Test relies on checking gdb debug output. Do not run if gdb debug is
+# enabled as any debug will be redirected to the log.
+require !gdb_debug_enabled
+
+standard_testfile
+
+# The test program exits after a while, in case GDB crashes. Make it
+# wait at least as long as we may wait before declaring a time out
+# failure.
+set options { "additional_flags=-DTIMEOUT=$timeout" debug }
+if { [build_executable ${testfile}.exp ${testfile} $srcfile $options] == -1 } {
+ return -1
+}
+
+# Return 0 on success, non-zero otherwise.
+
+proc do_test { pass } {
+ global testfile gdb_prompt binfile pf_prefix
+
+ if ![runto_main] {
+ return -1
+ }
+
+ gdb_breakpoint "${testfile}.c:[gdb_get_line_number "loop-line" ${testfile}.c]" \
+ temporary
+
+ gdb_test "continue" "Temporary breakpoint .* NOP10;.*"
+
+ gdb_test_no_output "set range-stepping off"
+ gdb_test_no_output "set debug infrun 1"
+
+ set abort 1
+ gdb_test_multiple "stepi-loop" "run a bit" {
+ -re {\[infrun\] process_event_stop_test: stepi/nexti} {
+ pass $gdb_test_name
+ set abort 0
+ }
+ }
+ if $abort {
+ verbose -log "$pf_prefix $test: did not run"
+ return $abort
+ }
+
+ set gdb_pid [exp_pid -i [board_info host fileid]]
+ remote_exec host "kill -TERM ${gdb_pid}"
+
+ set test "expect eof"
+ set abort 1
+ set stepping 0
+ # If GDB mishandles the SIGTERM and doesn't exit, this should FAIL
+ # with timeout. We don't expect a GDB prompt, so we see one,
+ # we'll FAIL too.
+ gdb_test_multiple "" "expect eof" {
+ eof {
+ pass "$gdb_test_name (got eof)"
+ set abort 0
+ }
+ -re {\[infrun\] process_event_stop_test: stepping inside range} {
+ incr stepping
+ exp_continue
+ }
+ }
+ verbose -log "$pf_prefix $test: stepped $stepping times"
+ return $abort
+}
+
+# Testcase was FAILing approx. on 10th pass with unpatched GDB.
+# 50 runs should be approx. a safe number to be sure it is fixed now.
+set passes 50
+
+for {set pass 0} {$pass < $passes} {incr pass} {
+ with_test_prefix "pass=$pass" {
+ clean_restart ${testfile}
+ send_gdb "define stepi-loop\n"
+ send_gdb "while 1\n"
+ send_gdb "stepi\n"
+ send_gdb "end\n"
+ send_gdb "end\n"
+ gdb_test "" ""
+ gdb_test_no_output "maint set prefer-software-single-stepping on"
+
+ if { [do_test $pass] != 0 } {
+ break
+ }
+ }
+}
+
+gdb_assert {$pass == $passes} "$passes SIGTERM passes"
--
2.35.3
More information about the Gdb-patches
mailing list