This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFA] Patch to fix "reverse-next" command error
- From: Michael Snyder <msnyder at vmware dot com>
- To: Hui Zhu <teawater at gmail dot com>
- Cc: Marc Khouzam <marc dot khouzam at ericsson dot com>, "gdb-patches at sourceware dot org" <gdb-patches at sourceware dot org>
- Date: Sun, 14 Jun 2009 19:45:33 -0700
- Subject: Re: [RFA] Patch to fix "reverse-next" command error
- References: <daef60380901220100v55cd8a28u76dae725f85eca8f@mail.gmail.com> <daef60380905052300y20cf1f81y59b945a9a22a8767@mail.gmail.com> <daef60380905110007r3ea2c83chf9889a70b127593c@mail.gmail.com> <daef60380906081918r2eaf63f9l3702055a76bb5b45@mail.gmail.com>
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 ());