Handle reinsert breakpoints for vforked child

When a thread is doing step-over with reinsert breakpoint, and the
instruction executed is a syscall doing vfork, both parent and child
share the memory, so the reinsert breakpoint in the space is visible
to both of them.  Also, removing the reinsert breakpoints from the
child will effectively remove them from the parent.  We should
carefully manipulate reinsert breakpoints for both processes.

What we are doing here is that

 - uninsert reinsert breakpoints from the parent before cloning the
   breakpoint list.  We use "uninsert" instead of "remove", because
   we need to "reinsert" them back after vfork is done.  In fact,
   "uninsert" removes them from both child and parent process space.
 - reinsert breakpoints in parent process are still copied to child's
   breakpoint list,
 - remove them from child's breakpoint list as what we did for fork,
   at this point, reinsert breakpoints are removed from the child and
   the parent, but they are still tracked by the parent's breakpoint
   list,
 - once vfork is done, "reinsert" them back to the parent,

gdb/gdbserver:

2016-06-17  Yao Qi  <yao.qi@linaro.org>

	* linux-low.c (handle_extended_wait): Call
	uninsert_reinsert_breakpoints for the parent process.  Remove
	reinsert breakpoints from the child process.  Reinsert them to
	the parent process when vfork is done.
	* mem-break.c (uninsert_reinsert_breakpoints): New function.
	(reinsert_reinsert_breakpoints): New function.
	* mem-break.h (uninsert_reinsert_breakpoints): Declare
	(reinsert_reinsert_breakpoints): Declare.
This commit is contained in:
Yao Qi 2016-06-17 10:25:13 +01:00
parent 8a81c5d7a7
commit 2e7b624b85
4 changed files with 91 additions and 5 deletions

View file

@ -158,6 +158,15 @@ void set_reinsert_breakpoint (CORE_ADDR stop_at);
void delete_reinsert_breakpoints (void);
/* Reinsert all reinsert breakpoints of the current process. */
void reinsert_reinsert_breakpoints (void);
/* Uninsert all reinsert breakpoints of the current process. This
still leaves the reinsert breakpoints in the table. */
void uninsert_reinsert_breakpoints (void);
/* Reinsert breakpoints at WHERE (and change their status to
inserted). */