summaryrefslogtreecommitdiff
path: root/gdb/testsuite
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/testsuite')
-rw-r--r--gdb/testsuite/gdb.base/signal-dispositions-child.c62
-rw-r--r--gdb/testsuite/gdb.base/signal-dispositions-child.exp80
-rw-r--r--gdb/testsuite/gdb.gdb/selftest.exp4
3 files changed, 146 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/signal-dispositions-child.c b/gdb/testsuite/gdb.base/signal-dispositions-child.c
new file mode 100644
index 00000000000..2e93d622b25
--- /dev/null
+++ b/gdb/testsuite/gdb.base/signal-dispositions-child.c
@@ -0,0 +1,62 @@
+/* Copyright 2016 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/>. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <signal.h>
+
+#ifndef OUTPUT_TXT
+# define OUTPUT_TXT "output.txt"
+#endif
+
+int
+main (int argc, char **argv)
+{
+ int i;
+ FILE *out;
+
+ if (argc > 1)
+ out = stdout;
+ else
+ {
+ out = fopen (OUTPUT_TXT, "w");
+ if (out == NULL)
+ {
+ fprintf (stderr, "File open failed\n");
+ exit (1);
+ }
+ }
+
+ for (i = 1; i < NSIG; i++)
+ {
+ struct sigaction oldact;
+
+ sigaction (i, NULL, &oldact);
+
+ if (oldact.sa_handler == SIG_DFL)
+ fprintf (out, "%d: SIG_DFL\n", i);
+ else if (oldact.sa_handler == SIG_IGN)
+ fprintf (out, "%d: SIG_IGN\n", i);
+ else
+ abort ();
+ }
+
+ if (out != stdout)
+ fclose (out);
+
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.base/signal-dispositions-child.exp b/gdb/testsuite/gdb.base/signal-dispositions-child.exp
new file mode 100644
index 00000000000..4a926b8f265
--- /dev/null
+++ b/gdb/testsuite/gdb.base/signal-dispositions-child.exp
@@ -0,0 +1,80 @@
+# Copyright 2016 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 that gdb's (or gdbserver's) own signal handling does not
+# interfere with the signal dispositions their spawned children
+# inherit.
+#
+# - If gdb inherits some signal set to SIG_IGN, so should the
+# inferior, even if gdb itself chooses not to ignore the signal.
+#
+# - If gdb inherits some signal set to SIG_DFL, so should the inferior
+# even if gdb itself ignores that signal.
+#
+# This requires special support in gdb/gdbserver because the exec
+# family of functions do not reset the signal disposition of signals
+# that are set to SIG_IGN.
+
+standard_testfile
+
+set gdb_txt [standard_output_file gdb.txt]
+set standalone_txt [standard_output_file standalone.txt]
+remote_exec host "rm -f $gdb_txt"
+remote_exec host "rm -f $standalone_txt"
+
+set options [list debug "additional_flags=-DOUTPUT_TXT=\"$gdb_txt\""]
+if {[build_executable $testfile.exp $testfile $srcfile $options]} {
+ untested $testfile.exp
+ return -1
+}
+
+set options [list debug "additional_flags=-DOUTPUT_TXT=\"$standalone_txt\""]
+if {[build_executable $testfile.exp $testfile-standalone $srcfile $options]} {
+ untested $testfile.exp
+ return -1
+}
+
+# Run the program directly, and dump its initial signal dispositions
+# in "standalone.txt".
+
+# Use remote_spawn instead of remote_exec, like how we spawn gdb.
+# This is in order to take the same code code paths in dejagnu
+# compared to when running the program through gdb. E.g., because
+# local_exec uses -ignore SIGHUP, while remote_spawn does not, if we
+# used remote_exec, the test program would start with SIGHUP ignored
+# when run standalone, but not when run through gdb.
+set res [remote_spawn host "$binfile-standalone"]
+if { $res < 0 || $res == "" } {
+ perror "Spawning $binfile-standalone failed."
+ return 1
+}
+remote_close host
+
+# Now run the program through gdb, and dump its initial signal
+# dispositions in "gdb.txt".
+
+clean_restart $binfile
+
+if { ! [ runto_main ] } then {
+ untested $testfile.exp
+ return -1
+}
+
+gdb_continue_to_end
+
+# Diff the .txt files. They should be identical.
+gdb_test "shell diff -s $standalone_txt $gdb_txt" \
+ "Files .* are identical.*" \
+ "diff signal dispositions"
diff --git a/gdb/testsuite/gdb.gdb/selftest.exp b/gdb/testsuite/gdb.gdb/selftest.exp
index 2fdd9e3539f..236f4b79bec 100644
--- a/gdb/testsuite/gdb.gdb/selftest.exp
+++ b/gdb/testsuite/gdb.gdb/selftest.exp
@@ -162,6 +162,10 @@ proc do_steps_and_nexts {} {
set description "next over notice_open_fds"
set command "next"
}
+ -re ".*save_original_signal_dispositions ..;.*$gdb_prompt $" {
+ set description "next over save_original_signal_dispositions"
+ set command "next"
+ }
-re ".*VEC_cleanup .cmdarg_s.*$gdb_prompt $" {
set description "next over cmdarg_s VEC_cleanup"
set command "next"