Re: [PATCH,ARM] Fix single step on vfork

Pedro Alves
2010-09-06T14:25:44Z

On Monday 06 September 2010 14:29:29, Yao Qi wrote:
> Pedro Alves wrote:
> >
> > Thanks. Please go ahead with your patch. Hope you don't mind I tweak
> > the comment a bit afterwards.
> >
> Pedro,
> Thanks for your view, and free to tweak the comment.
>
> Committed to GDB mainline,
> http://www.cygwin.com/ml/gdb-cvs/2010-09/msg00042.html
>
> Once you changed the comment, I'd like to merge it to GDB 7.2 branch then.

Okay. I've now applied this to mainline.

--
Pedro Alves

2010-09-06 Pedro Alves <pedro@codesourcery.com>

* infrun.c (resume): Extend comment on ignoring single-step
requests on vfork parents waiting for a vfork-done.

---
gdb/infrun.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)

Index: src/gdb/infrun.c
===================================================================
--- src.orig/gdb/infrun.c 2010-09-06 14:33:12.000000000 +0100
+++ src/gdb/infrun.c 2010-09-06 15:13:27.000000000 +0100
@@ -1560,13 +1560,19 @@ resume (int step, enum target_signal sig

QUIT;

- /* Don't consider single-stepping when the inferior is
- waiting_for_vfork_done, either software or hardware step. In
- software step, child process will hit the software single step
- breakpoint inserted in parent process. In hardware step, GDB
- can resumes inferior, and wait for vfork_done event. */
if (current_inferior ()->waiting_for_vfork_done)
{
+ /* Don't try to single-step a vfork parent that is waiting for
+ the child to get out of the shared memory region (by exec'ing
+ or exiting). This is particularly important on software
+ single-step archs, as the child process would trip on the
+ software single step breakpoint inserted for the parent
+ process. Since the parent will not actually execute any
+ instruction until the child is out of the shared region (such
+ are vfork's semantics), it is safe to simply continue it.
+ Eventually, we'll see a TARGET_WAITKIND_VFORK_DONE event for
+ the parent, and tell it to `keep_going', which automatically
+ re-sets it stepping. */
if (debug_infrun)
fprintf_unfiltered (gdb_stdlog,
"infrun: resume : clear step\n");