Fix internal error caused by interaction between catch signal and fork

This commit is contained in:
Philippe Waroquiers 2013-05-21 18:47:05 +00:00
parent 69a97597d5
commit bd9673a4de
5 changed files with 120 additions and 0 deletions

View file

@ -1,3 +1,8 @@
2013-05-21 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* breakpoints.c (detach_breakpoints): Do not
detach breakpoints locations with loc_type bp_loc_other.
2013-05-21 Jan Kratochvil <jan.kratochvil@redhat.com>
Workaround Python 2.6.

View file

@ -3537,6 +3537,15 @@ detach_breakpoints (ptid_t ptid)
if (bl->pspace != inf->pspace)
continue;
/* This function must physically remove breakpoints locations
from the specified ptid, without modifying the breakpoint
package's state. Locations of type bp_loc_other are only
maintained at GDB side. So, there is no need to remove
these bp_loc_other locations. Moreover, removing these
would modify the breakpoint package's state. */
if (bl->loc_type == bp_loc_other)
continue;
if (bl->inserted)
val |= remove_breakpoint_1 (bl, mark_inserted);
}

View file

@ -1,3 +1,8 @@
2013-05-21 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* gdb.base/catch-signal-fork.exp: New file.
* gdb.base/catch-signal-fork.c: New file.
2013-05-21 Sterling Augustine <saugustine@google.com>
* boards/remote-stdio-gdbserver.exp: New file.

View file

@ -0,0 +1,58 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2012-2013 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 <stdlib.h>
#include <signal.h>
#include <unistd.h>
void
do_nothing (void)
{
}
void
handle (int sig)
{
do_nothing (); /* handle marker */
}
int
main ()
{
int i;
signal (SIGHUP, handle);
raise (SIGHUP); /* first HUP */
signal (SIGCHLD, handle);
for (i = 0; i < 3; i++) /* fork loop */
{
switch (fork())
{
case -1:
perror ("fork");
exit (1);
case 0:
exit (0);
}
wait (NULL);
}
raise (SIGHUP); /* second HUP */
raise (SIGHUP); /* third HUP */
}

View file

@ -0,0 +1,43 @@
# Copyright 2012-2013 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/>.
if [target_info exists gdb,nosignals] {
verbose "Skipping catch-signal-fork.exp because of nosignals."
continue
}
standard_testfile
if {[prepare_for_testing $testfile.exp $testfile $srcfile debug]} {
return -1
}
if {![runto_main]} {
return -1
}
# Test "catch signal SIGHUP"
gdb_test "catch signal SIGHUP" "Catchpoint .*"
gdb_breakpoint ${srcfile}:[gdb_get_line_number "first HUP"]
gdb_breakpoint ${srcfile}:[gdb_get_line_number "fork loop"]
gdb_continue_to_breakpoint "first HUP"
gdb_test "continue" "Catchpoint .*"
# Test interaction with fork.
# This used to cause a gdb_assert in the code detaching the
# breakpoints for the child.
gdb_continue_to_breakpoint "fork loop"
gdb_test "continue" "Catchpoint .* SIGHUP.*" "got SIGHUP after fork"