This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: single-step breakpoints


> Date: Tue, 25 Apr 2006 23:54:38 +0200 (CEST)
> From: Mark Kettenis <mark.kettenis@xs4all.nl>
> 
> > Date: Tue, 25 Apr 2006 17:02:00 -0400
> > From: Daniel Jacobowitz <drow@false.org>
> > 
> > On Tue, Apr 25, 2006 at 10:39:36PM +0200, Mark Kettenis wrote:
> > > Hi Daniel,
> > > 
> > > There a slight problem with insert_single_step_breakpoint() and
> > > remove_single_step_breakpoints().  On OpenBSD, inserting a breakpoint
> > > into the kernel-provided signal trampoline, may fail.  Unfortunately,
> > > the caller of insert_single_step_breakpoint() never notices this, and
> > > calls remove_single_step_breakpoints() to remove the breakpoints.
> > > Unfortunately that makes us hit the gdb_assert() in there.
> > > 
> > > This patch makes us avoid this while still making an attempt to catch
> > > misuse of the interface.
> > 
> > Hmm - this is also true on some GNU/Linux targets, although none that
> > use software single step (yet - though I think I know how to trigger it
> > on ARM, some kernel fixes would also be needed).
> > 
> > My question is, is there something more useful we could be doing? 
> > If the single step breakpoint fails, then continuing will make us lose
> > control.  Maybe it should be an error().
> 
> That may not be such a bad idea.  But we'll need to adjust
> gdb.base/sigbpt.exp since it will end up in an infinite loop trying to
> step the target.
> 
> I'll look a bit more into it later this week.  Need to get some sleep now.

Yes, erroring out is defenitely a better approach than warn and have
things run away.  Here's a patch and some adjustments to the testsuite
to prevent the tests from going into an infinite loop.

ok?


Index: ChangeLog
from  Mark Kettenis  <kettenis@gnu.org>

	* breakpoint.c (insert_single_step_breakpoint): Make a failure to
	insert a single-step breakpoint an error instead of a warning.

	* breakpoint.c (remove_single_step_breakpoints): Bail out early if
	no breakpoints are inserted.

Index: breakpoint.c
===================================================================
RCS file: /cvs/src/src/gdb/breakpoint.c,v
retrieving revision 1.225
diff -u -p -r1.225 breakpoint.c
--- breakpoint.c 18 Apr 2006 19:20:06 -0000 1.225
+++ breakpoint.c 29 Apr 2006 23:11:12 -0000
@@ -7717,7 +7717,7 @@ insert_single_step_breakpoint (CORE_ADDR
 
   *bpt_p = deprecated_insert_raw_breakpoint (next_pc);
   if (*bpt_p == NULL)
-    warning (_("Could not insert single-step breakpoint at 0x%s"),
+    error (_("Could not insert single-step breakpoint at 0x%s"),
 	     paddr_nz (next_pc));
 }
 
Index: testsuite/ChangeLog
from  Mark Kettenis  <kettenis@gnu.org>

	* gdb.base/sigbpt.exp (stepi_out): FAIL when inserting a
	single-step breakpoint fails; make this a KFAIL on
	sparc*-*-openbsd*.
	* gdb.base/siginfo.exp: Likewise.
	* gdb.base/sigstep.exp (advance, advancei): Likewise.

Index: testsuite/gdb.base/sigbpt.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/sigbpt.exp,v
retrieving revision 1.5
diff -u -p -r1.5 sigbpt.exp
--- testsuite/gdb.base/sigbpt.exp 27 Apr 2005 16:35:14 -0000 1.5
+++ testsuite/gdb.base/sigbpt.exp 29 Apr 2006 23:11:21 -0000
@@ -166,6 +166,10 @@ proc stepi_out { name args } {
     # trampoline, and back to the instruction that faulted.
     set test "${name}; stepi out of handler"
     gdb_test_multiple "stepi" "$test" {
+	-re "Could not insert single-step breakpoint.*$gdb_prompt $" {
+	    setup_kfail "sparc*-*-openbsd*" gdb/1736
+	    fail "$test (could not insert single-step breakpoint)"
+	}
 	-re "keeper.*$gdb_prompt $" {
 	    send_gdb "stepi\n"
 	    exp_continue
Index: testsuite/gdb.base/siginfo.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/siginfo.exp,v
retrieving revision 1.2
diff -u -p -r1.2 siginfo.exp
--- testsuite/gdb.base/siginfo.exp 23 Apr 2004 16:44:25 -0000 1.2
+++ testsuite/gdb.base/siginfo.exp 29 Apr 2006 23:11:21 -0000
@@ -75,6 +75,10 @@ gdb_expect_list "backtrace for nexti" ".
 # Check that GDB can step the inferior back to main
 set test "step out of handler"
 gdb_test_multiple "step" "${test}" {
+    -re "Could not insert single-step breakpoint.*$gdb_prompt $" {
+	setup_kfail sparc*-*-openbsd* gdb/1736
+	fail "$test (could not insert single-step breakpoint)"
+    }
     -re "done = 1;.*${gdb_prompt} $" {
 	send_gdb "$i\n"
 	exp_continue
Index: testsuite/gdb.base/sigstep.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/sigstep.exp,v
retrieving revision 1.10
diff -u -p -r1.10 sigstep.exp
--- testsuite/gdb.base/sigstep.exp 18 Jul 2005 19:23:54 -0000 1.10
+++ testsuite/gdb.base/sigstep.exp 29 Apr 2006 23:11:22 -0000
@@ -79,6 +79,10 @@ proc advance { i } {
 
     set test "$prefix; leave handler"
     gdb_test_multiple "$i" "${test}" {
+	-re "Could not insert single-step breakpoint.*$gdb_prompt $" {
+	    setup_kfail "sparc*-*-openbsd*" gdb/1736
+	    fail "$test (could not insert single-step breakpoint)"
+	}
 	-re "done = 1;.*${gdb_prompt} $" {
 	    send_gdb "$i\n"
 	    exp_continue -continue_timer
@@ -122,6 +126,10 @@ proc advancei { i } {
             fail "$test (could not set breakpoint)"
 	    return
         }
+	-re "Could not insert single-step breakpoint.*$gdb_prompt $" {
+	    setup_kfail "sparc*-*-openbsd*" gdb/1736
+	    fail "$test (could not insert single-step breakpoint)"
+	}
 	-re "done = 1;.*${gdb_prompt} $" {
 	    send_gdb "$i\n"
 	    exp_continue -continue_timer


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]