diff options
author | Pedro Alves <palves@redhat.com> | 2016-08-04 17:40:26 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2016-08-04 17:40:26 +0100 |
commit | 4265c12fbbf4e7b181e3136ecbe1644121242abc (patch) | |
tree | 2070e80b92c6a683ad45f22d2647c0ceb9569155 /gdb/testsuite/gdb.base/signal-dispositions-child.exp | |
parent | 6f67973b4280cfd045e632a3340becd16e43b4b1 (diff) | |
download | binutils-gdb-4265c12fbbf4e7b181e3136ecbe1644121242abc.tar.gz |
Fix PR gdb/18653: gdb disturbs inferior's inherited signal dispositionsusers/palves/restore-signal-dispositions
Today I was helping Phil debug something on the new C++ compile
support, and we noticed that when debugging gdb under gdb, the
inferior gdb behaved differently compared to when it was not being
debugged. Turned out to be a manifestation of PR gdb/18653.
Since the exec family of functions do not reset the signal disposition
of signals that are set to SIG_IGN:
http://pubs.opengroup.org/onlinepubs/7908799/xsh/execve.html
Signals set to the default action (SIG_DFL) in the calling process
image are set to the default action in the new process
image. Signals set to be ignored (SIG_IGN) by the calling process
image are set to be ignored by the new process image. Signals set to
be caught by the calling process image are set to the default action
in the new process image (see <signal.h>).
gdb's (or gdbserver's) own signal handling should not interfere with
the signal dispositions their spawned children inherit. However, it
currently does. For example, some paths in gdb cause SIGPIPE to be
set to SIG_IGN, and as consequence, the child starts with SIGPIPE to
set to SIG_IGN too, even though gdb was started with SIGPIPE set to
SIG_DFL.
In order to be transparent, when spawning new child processes to debug
(with "run", etc.), reset all signal dispositions back to what was
originally inherited from gdb/gdbserver's parent, just before execing
the target program to debug.
gdb/ChangeLog:
yyyy-mm-dd Pedro Alves <palves@redhat.com>
PR gdb/18653
* Makefile.in (SFILES): Add
common/signal-dispositions-save-restore.c.
(HFILES_NO_SRCDIR): Add common/signal-dispositions-save-restore.h.
(COMMON_OBS): Add signal-dispositions-save-restore.o.
(signal-dispositions-save-restore.o): New rule.
* configure: Regenerate.
* fork-child.c: Include "signal-dispositions-save-restore.h".
(fork_inferior): Call restore_original_signal_dispositions.
* main.c: Include "signal-dispositions-save-restore.h".
(captured_main): Call save_original_signal_dispositions.
* common/common.m4: Add sigaction to AC_CHECK_FUNCS checks.
* common/signal-dispositions-save-restore.c: New file.
* common/signal-dispositions-save-restore.h: New file.
gdb/gdbserver/ChangeLog:
yyyy-mm-dd Pedro Alves <palves@redhat.com>
PR gdb/18653
* Makefile.in (OBS): Add signal-dispositions-save-restore.o.
(signal-dispositions-save-restore.o): New rule.
* config.in: Regenerate.
* configure: Regenerate.
* linux-low.c: Include "signal-dispositions-save-restore.h".
(linux_create_inferior): Call
restore_original_signal_dispositions.
* server.c: Include "signal-dispositions-save-restore.h".
(captured_main): Call save_original_signal_dispositions.
gdb/testsuite/ChangeLog:
yyyy-mm-dd Pedro Alves <palves@redhat.com>
PR gdb/18653
* gdb.base/signal-dispositions-child.c: New file.
* gdb.base/signal-dispositions-child.exp: New file.
* gdb.gdb/selftest.exp (do_steps_and_nexts): Add new pattern.
Diffstat (limited to 'gdb/testsuite/gdb.base/signal-dispositions-child.exp')
-rw-r--r-- | gdb/testsuite/gdb.base/signal-dispositions-child.exp | 80 |
1 files changed, 80 insertions, 0 deletions
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" |