diff options
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/gdb.base/signal-dispositions-child.c | 62 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/signal-dispositions-child.exp | 80 | ||||
-rw-r--r-- | gdb/testsuite/gdb.gdb/selftest.exp | 4 |
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" |