This is the mail archive of the gdb-patches@sources.redhat.com 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]

[PATCH/RFC] Simplify adjust_pc_after_break?


The signal tests are failing horribly on Solaris x86.  The problem is
that upon hitting a breakpoint in the signal handler, we don't
properly back up the PC.

The problem here seems to stem from the fact that we were
single-stepping when the signal arrived.  The signal takes us out of
the single-stepping range, and when we hit the breakpoint, we're atan
address that's miles away from PREV_PC.  As a result
adjust_pc_after_break decides that there is no reason to back up the
PC.

Why don't we see this on other i386 targets?  There is some code in
handle_inferior_event() that notices when a signal takes us out of the
single-stepping range.  However, procfs(4) has this nice feature that
you can tell it what signals to report.  We tell it to only report
signals that we're interested in.  In this particular case we're not
interested in the SIGALRM, so GDB never sees it, and the code in
handle_inferior_event() is never executed.

Looking at adjust_pc_after_break() I couldn't figure out why we're
trying do.  I could imagine that we shouldn't back up the PC if a
breakpoint and single-step coalesce, but that's exactly the condition
where we *do* back up the PC.  So why not simplify things and just
back up the PC if we detect an inserted breakpoint?

The attached patch works for me on Solaris x86 and various other i386
and amd64 targets.  But I'm probably overlooking something.

Mark


Index: infrun.c
===================================================================
RCS file: /cvs/src/src/gdb/infrun.c,v
retrieving revision 1.163
diff -u -p -r1.163 infrun.c
--- infrun.c 14 May 2004 18:45:42 -0000 1.163
+++ infrun.c 16 May 2004 23:12:52 -0000
@@ -1234,29 +1234,8 @@ adjust_pc_after_break (struct execution_
     }
   else
     {
-      /* When using hardware single-step, a SIGTRAP is reported for
-	 both a completed single-step and a software breakpoint.  Need
-	 to differentiate between the two as the latter needs
-	 adjusting but the former does not.  */
-      if (currently_stepping (ecs))
-	{
-	  if (prev_pc == breakpoint_pc
-	      && software_breakpoint_inserted_here_p (breakpoint_pc))
-	    /* Hardware single-stepped a software breakpoint (as
-	       occures when the inferior is resumed with PC pointing
-	       at not-yet-hit software breakpoint).  Since the
-	       breakpoint really is executed, the inferior needs to be
-	       backed up to the breakpoint address.  */
-	    write_pc_pid (breakpoint_pc, ecs->ptid);
-	}
-      else
-	{
-	  if (software_breakpoint_inserted_here_p (breakpoint_pc))
-	    /* The inferior was free running (i.e., no hardware
-	       single-step and no possibility of a false SIGTRAP) and
-	       hit a software breakpoint.  */
-	    write_pc_pid (breakpoint_pc, ecs->ptid);
-	}
+      if (software_breakpoint_inserted_here_p (breakpoint_pc))
+	write_pc_pid (breakpoint_pc, ecs->ptid);
     }
 }
 


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