通过Linux 4.12的源代码,当任务 ptraced 时,我无法绕过下面的代码。
do_wait()
将致电
ptrace_do_wait(wo, tsk)
将调用
wait_consider_task
对于它正在跟踪的每个线程。这将依次调用
wait_task_stopped
然后会找到PID [pid = task_pid_vnr(p);]
, waitpid 会返回,这很棒。
然后它调用
put_task_struct(p);
将释放任务结构。如果发生这种情况,那么调试器如何再次等待此进程/任务?这个条目是否会在某个地方再次添加,如果是这样的话?
任何人都可以向我解释这个流程吗?感谢。
答案 0 :(得分:0)
你是什么意思" put_task_struct释放结构"?你熟悉引用计数吗?你看到匹配的get_task_struct了吗?
让我们看一下代码:
get_task_struct(p);
refcount递增
pid = task_pid_vnr(p);
why = ptrace ? CLD_TRAPPED : CLD_STOPPED;
read_unlock(&tasklist_lock);
所有任务列表现已解锁。原则上,有人可以在线程上等待除了结构本身之外的所有内容,因为增加了引用计数
sched_annotate_sleep();
if (wo->wo_rusage)
getrusage(p, RUSAGE_BOTH, wo->wo_rusage);
put_task_struct(p);
...并且refcount递减。如果这是最后一个引用,则释放该对象。否则没有任何反应。