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: [PATCH 0/4] Fix PR gdb/19187 (process record over a fork causes internal error)


Yao reminded me about this series, and asked about putting it in 7.12.

I've done so now: pushed to master and 7.12 branch.

Thanks,
Pedro Alves

On 02/14/2016 06:37 PM, Pedro Alves wrote:
> This series fixes:
> 
>  (gdb) record
>  break marker2
>  Breakpoint 2 at 0x40067a: file /home/pedro/gdb/mygit/src/gdb/testsuite/gdb.reverse/waitpid-reverse.c, line 30.
>  (gdb) PASS: gdb.reverse/waitpid-reverse.exp: set breakpoint at marker2
>  continue
>  Continuing.
>  /home/pedro/gdb/mygit/src/gdb/record-full.c:1720: internal-error: record_full_remove_breakpoint: removing unknown breakpoint
>  A problem internal to GDB has been detected,
>  further debugging may prove unreliable.
>  Quit this debugging session? (y or n)
>  KFAIL: gdb.reverse/waitpid-reverse.exp: continue to breakpoint: marker2 (GDB internal error) (PRMS: gdb/19187)
> 
> The problem is that the target side can't distinguish between deleting
> a breakpoint and detaching a breakpoint.
> 
> Right after a fork is detected, we detach breakpoints from the child
> (detach_breakpoints), which calls into target_remove_breakpoint with
> inferior_ptid pointing at the child process, but leaves the breakpoint
> marked inserted (in the parent).
> 
> Since record-full.c's target_remove_breakpoint implementation doesn't
> know we're detaching a breakpoint, it removes the breakpoint from its
> own breakpoint table.
> 
> Then when we later remove the breakpoint from the parent, we fail that
> assertion, since the breakpoint is unexpectedly not found in the
> record-full.c breakpoint table.
> 
> The first three patches pass down the reason for removing the
> breakpoint all the way to the target.
> 
> Patch 4 then simply makes record-full.c not delete the breakpoint from
> its breakpoint table when we're detaching the breakpoint from a fork
> child.
> 
> Pedro Alves (4):
>   Simplify remove_breakpoint interface
>   Introduce 'enum remove_bp_reason'
>   Plumb enum remove_bp_reason all the way to target_remove_breakpoint
>   Fix PR gdb/19187 (process record over a fork causes internal error)
> 
>  gdb/break-catch-sig.c                         |  3 +-
>  gdb/break-catch-syscall.c                     |  2 +-
>  gdb/breakpoint.c                              | 70 +++++++++++++--------------
>  gdb/breakpoint.h                              | 14 +++++-
>  gdb/corelow.c                                 | 10 +++-
>  gdb/exec.c                                    | 10 +++-
>  gdb/mem-break.c                               |  3 +-
>  gdb/record-btrace.c                           |  6 ++-
>  gdb/record-full.c                             | 15 ++++--
>  gdb/remote.c                                  |  5 +-
>  gdb/target-debug.h                            |  2 +
>  gdb/target-delegates.c                        | 10 ++--
>  gdb/target.c                                  |  5 +-
>  gdb/target.h                                  |  9 ++--
>  gdb/testsuite/gdb.reverse/waitpid-reverse.exp |  4 +-
>  15 files changed, 105 insertions(+), 63 deletions(-)
> 


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