This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH 0/4] Fix PR gdb/19187 (process record over a fork causes internal error)
- From: Pedro Alves <palves at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Wed, 10 Aug 2016 23:10:49 +0100
- Subject: Re: [PATCH 0/4] Fix PR gdb/19187 (process record over a fork causes internal error)
- Authentication-results: sourceware.org; auth=none
- References: <1455475070-17797-1-git-send-email-palves@redhat.com>
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(-)
>