Skip to content
  • Yao Qi's avatar
    Handle reinsert breakpoints for vforked child · 2e7b624b
    Yao Qi authored
    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.
    2e7b624b