Browse Source
* 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.binutils-2_22-branch
5 changed files with 195 additions and 36 deletions
@ -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; |
|||
} |
|||
@ -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" |
|||
|
|||
Loading…
Reference in new issue