[PATCH 09/12] detach and breakpoint removal
Pedro Alves
pedro@palves.net
Wed Feb 3 01:28:38 GMT 2021
On 13/01/21 06:32, Simon Marchi wrote:
>
>
> On 2021-01-12 8:15 p.m., Pedro Alves wrote:
>> A following patch will add a testcase that has a number of threads
>> constantly stepping over a breakpoint, and then has GDB detach the
>> process. That testcase sometimes fails with the inferior crashing
>> with SIGTRAP after the detach because of the bug fixed by this patch,
>> when tested with the native target.
>>
>> The problem is that target_detach removes breakpoints from the target
>> immediately, and that does not work with the native GNU/Linux target
>> (and probably no other native target) currently. The test wouldn't
>> fail with this issue when testing against gdbserver, because gdbserver
>> does allow accessing memory while the current thread is running, by
>> transparently pausing all threads temporarily, without GDB noticing.
>> Implementing that in gdbserver was a lot of work, so I'm not looking
>> forward right now to do the same in the native target. Instead, I
>> came up with a simpler solution -- push the breakpoints removal down
>> to the targets. The Linux target conveniently already pauses all
>> threads before detaching them, since PTRACE_DETACH only works with
>> stopped threads, so we move removing breakpoints to after that. Only
>> the remote and GNU/Linux targets support support async execution, so
>> no other target should really need this.
>
> I think that makes sense.
>
> I initially thought that GDB could always stop all threads, remove
> breakpoints, and then ask the target to detach. But then that's
> unfair for the targets that can remove the breakpoints while all
> threads are running. These targets would pay a price (a window of
> time where threads are paused when detaching) they don't need to pay.
> So leaving the task of removing breakpoints to the target makes sense.
Yeah, that was my thinking too. Always stopping everything would be
simpler, but with a potential penalty.
>
> I think it would be good to mention this in the doc of
> target_ops::detach (which doesn't exist yet), that the target is
> responsible for removing the breakpoints from the inferior.
>
I've merged the patch with this added comment:
+
+ /* Detaches from the inferior. Note that on targets that support
+ async execution (i.e., targets where it is possible to detach
+ from programs with threads running), the target is responsible
+ for removing breakpoints from the program before the actual
+ detach, otherwise the program dies when it hits one. */
virtual void detach (inferior *, int)
TARGET_DEFAULT_IGNORE ();
+
More information about the Gdb-patches
mailing list