+2015-02-19 Antoine Tremblay <antoine.tremblay@ericsson.com>
+
+ PR breakpoints/16812
+ * linux-nat.c (linux_nat_filter_event): Report SIGTRAP,SIGILL,SIGSEGV.
+ * nat/linux-ptrace.c (linux_wstatus_maybe_breakpoint): Add.
+ * nat/linux-ptrace.h: Add linux_wstatus_maybe_breakpoint.
+
2015-02-19 David Taylor <dtaylor@emc.com>
* common/ax.def (setv): Fix consumed entry in setv DEFOP.
+2015-02-19 Antoine Tremblay <antoine.tremblay@ericsson.com>
+
+ PR breakpoints/16812
+ * linux-low.c (wstatus_maybe_breakpoint): Remove.
+ (linux_low_filter_event): Update wstatus_maybe_breakpoint name.
+ (linux_wait_1): Report SIGTRAP,SIGILL,SIGSEGV.
+
2015-02-10 Antoine Tremblay <antoine.tremblay@ericsson.com>
PR breakpoints/15956
return 0;
}
-/* Return true if the event in LP may be caused by breakpoint. */
-
-static int
-wstatus_maybe_breakpoint (int wstatus)
-{
- return (WIFSTOPPED (wstatus)
- && (WSTOPSIG (wstatus) == SIGTRAP
- /* SIGILL and SIGSEGV are also treated as traps in case a
- breakpoint is inserted at the current PC. */
- || WSTOPSIG (wstatus) == SIGILL
- || WSTOPSIG (wstatus) == SIGSEGV));
-}
-
/* Fetch the possibly triggered data watchpoint info and store it in
CHILD.
if (WIFSTOPPED (wstat) && WSTOPSIG (wstat) == SIGTRAP
&& check_stopped_by_watchpoint (child))
;
- else if (WIFSTOPPED (wstat) && wstatus_maybe_breakpoint (wstat))
+ else if (WIFSTOPPED (wstat) && linux_wstatus_maybe_breakpoint (wstat))
{
if (check_stopped_by_breakpoint (child))
have_stop_pc = 1;
any that GDB specifically requested we ignore. But never ignore
SIGSTOP if we sent it ourselves, and do not ignore signals when
stepping - they may require special handling to skip the signal
- handler. */
+ handler. Also never ignore signals that could be caused by a
+ breakpoint. */
/* FIXME drow/2002-06-09: Get signal numbers from the inferior's
thread library? */
if (WIFSTOPPED (w)
#endif
(pass_signals[gdb_signal_from_host (WSTOPSIG (w))]
&& !(WSTOPSIG (w) == SIGSTOP
- && current_thread->last_resume_kind == resume_stop))))
+ && current_thread->last_resume_kind == resume_stop)
+ && !linux_wstatus_maybe_breakpoint (w))))
{
siginfo_t info, *info_p;
}
/* When using hardware single-step, we need to report every signal.
- Otherwise, signals in pass_mask may be short-circuited. */
+ Otherwise, signals in pass_mask may be short-circuited
+ except signals that might be caused by a breakpoint. */
if (!lp->step
- && WSTOPSIG (status) && sigismember (&pass_mask, WSTOPSIG (status)))
+ && WSTOPSIG (status) && sigismember (&pass_mask, WSTOPSIG (status))
+ && !linux_wstatus_maybe_breakpoint (status))
{
linux_resume_one_lwp (lp, lp->step, signo);
if (debug_linux_nat)
{
return (linux_ptrace_get_extended_event (wstat) != 0);
}
+
+/* Return true if the event in LP may be caused by breakpoint. */
+
+int
+linux_wstatus_maybe_breakpoint (int wstat)
+{
+ return (WIFSTOPPED (wstat)
+ && (WSTOPSIG (wstat) == SIGTRAP
+ /* SIGILL and SIGSEGV are also treated as traps in case a
+ breakpoint is inserted at the current PC. */
+ || WSTOPSIG (wstat) == SIGILL
+ || WSTOPSIG (wstat) == SIGSEGV));
+}
extern void linux_ptrace_set_additional_flags (int);
extern int linux_ptrace_get_extended_event (int wstat);
extern int linux_is_extended_waitstatus (int wstat);
+extern int linux_wstatus_maybe_breakpoint (int wstat);
#endif /* COMMON_LINUX_PTRACE_H */
+2015-02-19 Antoine Tremblay <antoine.tremblay@ericsson.com>
+
+ PR breakpoints/16812
+ * gdb.base/catch-gdb-caused-signals.c: New file.
+ * gdb.base/catch-gdb-caused-signals.exp: New file.
+
2015-02-18 Jose E. Marchesi <jose.marchesi@oracle.com>
* configure: Regenerated.
--- /dev/null
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2015 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/>. */
+
+/* This program is intended to be a simple dummy program for gdb to read. */
+
+#include <unistd.h>
+#include <stdio.h>
+
+int
+main (void)
+{
+ int i = 0;
+
+ i++; /* set dprintf here */
+ return 0; /* set breakpoint here */
+}
+
+int
+return_one (void)
+{
+ return 1;
+}
--- /dev/null
+# This testcase is part of GDB, the GNU debugger.
+
+# Copyright 2015 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 checks if we handle a SIGSEGV,SIGILL caused by gdb in the inferior
+# even if we have noprint,nostop options set in handle SIGSEV,SIGILL
+# See PR breakpoints/16812
+
+standard_testfile
+
+# Some targets can't call functions, so don't even bother with this
+# test.
+if [target_info exists gdb,cannot_call_functions] {
+ unsupported "cannot call functions"
+ return
+}
+
+set dp_location [gdb_get_line_number "set dprintf here"]
+set bp_location [gdb_get_line_number "set breakpoint here"]
+
+if {[prepare_for_testing $testfile.exp $testfile $srcfile debug]} {
+ return -1
+}
+
+if ![runto_main] {
+ fail "Can't run to main to make the tests"
+ return -1
+}
+
+gdb_test "handle SIGSEGV nostop noprint" \
+ "Signal\[ \t\]+Stop\[ \t\]+Print\[ \t\]+Pass to program\[ \t\]+Description\r\nSIGSEGV\[ \t\]+No\[ \t\]+No\[ \t\]+Yes\[ \t\].*"
+gdb_test "handle SIGILL nostop noprint" \
+ "Signal\[ \t\]+Stop\[ \t\]+Print\[ \t\]+Pass to program\[ \t\]+Description\r\nSIGILL\[ \t\]+No\[ \t\]+No\[ \t\]+Yes\[ \t\].*"
+
+gdb_test "print return_one()" " = 1"
+
+if ![target_info exists gdb,noinferiorio] {
+
+ # Clean up the breakpoint state.
+ delete_breakpoints
+
+ gdb_breakpoint $bp_location
+
+ gdb_test_no_output "set dprintf-style call"
+
+ # Also test with dprintf since the original bug was noticed using dprintf.
+ gdb_test "dprintf $dp_location,\"testdprintf\\n\"" "Dprintf .*"
+
+ gdb_test "continue" "testdprintf.*"
+}