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]

[PATCH 0/4] Fix PR gdb/19187 (process record over a fork causes internal error)


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(-)

-- 
1.9.3


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