diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2011-04-28 15:53:00 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@de.ibm.com> | 2011-04-28 15:53:00 +0000 |
commit | 308527831296581e94760ca9cea1fdcad0c3718a (patch) | |
tree | af6d24805dec53db3bbcdadb58a761c94d0611b9 /gdb/testsuite/gdb.base | |
parent | e0605dbe1c363beecab0c44d6a384c0592d15d93 (diff) | |
download | gdb-308527831296581e94760ca9cea1fdcad0c3718a.zip gdb-308527831296581e94760ca9cea1fdcad0c3718a.tar.gz gdb-308527831296581e94760ca9cea1fdcad0c3718a.tar.bz2 |
gdb/
* infrun.c (proceed): Revert previous change.
(resume): Instead, handle the case of signal delivery while stepping
off a breakpoint location here, and only if software single-stepping
is used. Handle nested signals.
gdb/testsuite/
* gdb.base/signest.exp: New file.
* gdb.base/signest.c: Likewise.
Diffstat (limited to 'gdb/testsuite/gdb.base')
-rw-r--r-- | gdb/testsuite/gdb.base/signest.c | 53 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/signest.exp | 67 |
2 files changed, 120 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/signest.c b/gdb/testsuite/gdb.base/signest.c new file mode 100644 index 0000000..127c77f --- /dev/null +++ b/gdb/testsuite/gdb.base/signest.c @@ -0,0 +1,53 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011 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 <signal.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +volatile char *p = NULL; + +extern long +bowler (void) +{ + return *p; +} + +extern void +keeper (int sig) +{ + static int recurse = 0; + if (++recurse < 3) + bowler (); + + _exit (0); +} + +int +main (void) +{ + struct sigaction act; + memset (&act, 0, sizeof act); + act.sa_handler = keeper; + act.sa_flags = SA_NODEFER; + sigaction (SIGSEGV, &act, NULL); + sigaction (SIGBUS, &act, NULL); + + bowler (); + return 0; +} diff --git a/gdb/testsuite/gdb.base/signest.exp b/gdb/testsuite/gdb.base/signest.exp new file mode 100644 index 0000000..02f8134 --- /dev/null +++ b/gdb/testsuite/gdb.base/signest.exp @@ -0,0 +1,67 @@ +# This testcase is part of GDB, the GNU debugger. + +# Copyright 2011 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/>. + +set testfile "signest" +set srcfile ${testfile}.c + +if [target_info exists gdb,nosignals] { + verbose "Skipping ${testfile}.exp because of nosignals." + return -1 +} + +if [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug}] { + untested ${testfile}.exp + return -1 +} + +if ![runto_main] then { + untested ${testfile}.exp + return -1 +} + +# If we can examine what's at memory address 0, it is possible that we +# could also execute it. This could probably make us run away, +# executing random code, which could have all sorts of ill effects, +# especially on targets without an MMU. Don't run the tests in that +# case. + +gdb_test_multiple "x 0" "memory at address 0" { + -re "0x0:.*Cannot access memory at address 0x0.*$gdb_prompt $" { } + -re "0x0:.*Error accessing memory address 0x0.*$gdb_prompt $" { } + -re ".*$gdb_prompt $" { + untested "Memory at address 0 is possibly executable" + return -1 + } +} + +# Run until we hit the SIGSEGV (or SIGBUS on some platforms). +gdb_test "continue" \ + ".*Program received signal (SIGBUS|SIGSEGV).*bowler.*" \ + "continue to fault" + +# Insert conditional breakpoint at faulting instruction +gdb_test "break if 0" ".*" "set conditional breakpoint" + +# Set SIGSEGV/SIGBUS to pass+nostop +gdb_test "handle SIGSEGV nostop print pass" ".*" "pass SIGSEGV" +gdb_test "handle SIGBUS nostop print pass" ".*" "pass SIGBUS" + +# Step off the faulting instruction into the handler, triggering nested faults +gdb_test "continue" \ + ".*Program received signal (SIGBUS|SIGSEGV).*Program received signal (SIGBUS|SIGSEGV).*exited normally.*" \ + "run through nested faults" + |