Q: utrace && ptrace_check_attach()
Roland McGrath
roland at redhat.com
Tue Jul 28 00:03:40 UTC 2009
> I meant ptrace_resume()->task_is_stopped() check in ptrace_utrace.patch.
Oh. I think that was an attempt at ptrace bug-compatibility.
Like I keep saying, don't take any code in that patch seriously.
> Yes, the whole-process stop will be delayed until the debugger
> wakes up the tracee and it sees signal_pending().
I don't think we want this.
> Not nice, agreed, but probably not too bad. The debugger doesn't
> really care. As for real parent, it will be confused in any case.
No, it needn't be.
> It can't assume the whole process is really stopped, debugger
> can wake up a thread at any moment.
No, it can't. That's what "get the bookkeeping right" means.
It the debugger uses UTRACE_RESUME et al, then that thread moves
from TASK_TRACED into TASK_STOPPED and still never runs.
> > The bookkeeping should ensure that when a TASK_TRACED thread was
> > counted as stopped,
>
> But we can't know if it was already counted or not.
Sure we can. The group_stop_count is set by the stop-instigator while it
holds siglock and checks every thread's ->state. All transitions into or
out of TASK_TRACED are done holding the siglock. When you take siglock and
see there is a stop in progress, then you know the thread's TASK_TRACED was
counted as stopped in setting up that stop.
> And note that utrace_stop() doesn't set SIGNAL_STOP_STOPPED and doesn't
> notify if ->group_stop_count becomes 0.
We can fix this.
> > then utrace never wakes it up but instead puts it
> > in TASK_STOPPED
>
> only if group-stop is already completed.
Or in progress.
> Or we can ignore all these problems, there are not new.
No, let's get it right for a change! ;-)
> So. Let's change utrace_do_stop() to set TASK_TRACED,
I like that direction.
> Or do you think it is better to add tracehook_finish_stop() helper which is
> called by do_signal_stop() to clear ->stopped ?
Let's do it however makes the code taken all together come out cleanest.
>From what you said before, it sounds like tracehook_finish_stop() would
help with that.
> As you pointed out we can remove ->stopped, but I am not sure we should do
> this now.
Sure, we can take it one step at a time. Once we have cleaned up all the
stop handling, we can see what this flag is still doing for us.
> BTW, can't finish_utrace_stop() check utrace->stopped lockless?
You tell me!
Thanks,
Roland
More information about the utrace-devel
mailing list