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: [RFA] Patch to fix "reverse-next" command error


Hui Zhu wrote:
Ping.

Hui, I rewrote your patch a little bit. I think we can use gdbarch_skip_trampoline_code to detect the fact that we have stepped into a trampoline (ie. "plt"). This is more general.

Mark, please tell me if this patch fixes your original problem,
and Hui, please tell me if the patch is OK with you.

Michael


On Mon, May 11, 2009 at 15:07, Hui Zhu<teawater@gmail.com> wrote:
PING

On Wed, May 6, 2009 at 14:00, Hui Zhu <teawater@gmail.com> wrote:
Hi Michael,

I try this issue with cvs-head.  It still affect cvs-head.
And I try the patch, it can fix this issue.  It's time close to 7.0
branch.  So could you please help me review it?

The attachment is the new patch follow cvs-head.

2009-05-06 Hui Zhu <teawater@gmail.com>

      * infrun.c (handle_inferior_event): Make inferior step if it
      stepping over a function call in reverse , and stop at the
      start address of the function.

Thanks,
Hui

On Thu, Jan 22, 2009 at 17:00, teawater <teawater@gmail.com> wrote:
Hi guys,

This patch is for bug in http://sourceware.org/ml/gdb/2009-01/msg00146.html

This issue is because sometime the inferior is already in function
start address (i.e. plt), set a breakpoint and continue will make
"reverse-next" work error.

This patch make inferior step if it reverse step and stop at the
function start address.
It tested OK with process record patch and testsuite gdb.twreverse in
branch reverse-20081226-branch.

2009-01-22 Hui Zhu <teawater@gmail.com>

       * infrun.c (handle_inferior_event): Make inferior step if it
       stepping over a function call in reverse , and stop at the
       start address of the function.

OK for mainline?

Thanks,
Hui



2009-06-14  Hui Zhu  <teawater@gmail.com>
	    Michael Snyder  <msnyder@vmware.com>

	* infrun.c (handle_inferior_event): Reverse-next through trampoline.

Index: infrun.c
===================================================================
RCS file: /cvs/src/src/gdb/infrun.c,v
retrieving revision 1.387
diff -u -p -r1.387 infrun.c
--- infrun.c	11 Jun 2009 11:57:46 -0000	1.387
+++ infrun.c	15 Jun 2009 02:39:51 -0000
@@ -3623,9 +3623,17 @@ infrun: not switching back to stepped th
 
      Note that step_range_end is the address of the first instruction
      beyond the step range, and NOT the address of the last instruction
-     within it! */
+     within it!
+
+     Note also that during reverse execution, we may be stepping
+     through a function epilogue and therefore must detect when
+     the current-frame changes in the middle of a line.  */
+
   if (stop_pc >= ecs->event_thread->step_range_start
-      && stop_pc < ecs->event_thread->step_range_end)
+      && stop_pc < ecs->event_thread->step_range_end
+      && (execution_direction != EXEC_REVERSE
+	  || frame_id_eq (get_frame_id (get_current_frame ()),
+			  ecs->event_thread->step_frame_id)))
     {
       if (debug_infrun)
 	fprintf_unfiltered (gdb_stdlog, "infrun: stepping inside range [0x%s-0x%s]\n",
@@ -3762,10 +3770,21 @@ infrun: not switching back to stepped th
 		  keep_going (ecs);
 		  return;
 		}
-	      /* Normal (staticly linked) function call return.  */
-	      init_sal (&sr_sal);
-	      sr_sal.pc = ecs->stop_func_start;
-	      insert_step_resume_breakpoint_at_sal (sr_sal, null_frame_id);
+	      if (gdbarch_skip_trampoline_code(current_gdbarch,
+					       get_current_frame (),
+					       stop_pc))
+		{
+		  /* We are in a function call trampoline.
+		     Keep stepping backward to get to the caller.  */
+		  ecs->event_thread->stepping_over_breakpoint = 1;
+		}
+	      else
+		{
+		  /* Normal function call return (static or dynamic).  */
+		  init_sal (&sr_sal);
+		  sr_sal.pc = ecs->stop_func_start;
+		  insert_step_resume_breakpoint_at_sal (sr_sal, null_frame_id);
+		}
 	    }
 	  else
 	    insert_step_resume_breakpoint_at_caller (get_current_frame ());

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