abort(3) 时发生了什么?
1,通过 rt_signal/signal syscall 将 SIGABRT 塞到 current->pending
2,当前线程在合适时机处理信号:处理函数 get_signal()
3,get_signal() 里加标志:current->flags |= PF_SIGNALED;
4,当前线程进行 coredump, do_group_exit, do_exit
5,其它线程并发地也进入到 get_signal()
5,其它线程用 SIGKILL 当做信号
6,直接 do_group_exit, do_exit,然后卡在 do_exit 的 coredump_task_exit 里:
for (;;) {
set_current_state(TASK_UNINTERRUPTIBLE|TASK_FREEZABLE);
if (!self.task) / see coredump_finish() /
break;
schedule();
}
__set_current_state(TASK_RUNNING);
7,一直处于 D 状态
8,如果当前线程 coredump 很慢,其它线程就会被 hung task detector 探测到,然后往 dmesg 里打 log
#abort #coredump #hung_task #signal #exit
1,通过 rt_signal/signal syscall 将 SIGABRT 塞到 current->pending
2,当前线程在合适时机处理信号:处理函数 get_signal()
3,get_signal() 里加标志:current->flags |= PF_SIGNALED;
4,当前线程进行 coredump, do_group_exit, do_exit
5,其它线程并发地也进入到 get_signal()
5,其它线程用 SIGKILL 当做信号
6,直接 do_group_exit, do_exit,然后卡在 do_exit 的 coredump_task_exit 里:
for (;;) {
set_current_state(TASK_UNINTERRUPTIBLE|TASK_FREEZABLE);
if (!self.task) / see coredump_finish() /
break;
schedule();
}
__set_current_state(TASK_RUNNING);
7,一直处于 D 状态
8,如果当前线程 coredump 很慢,其它线程就会被 hung task detector 探测到,然后往 dmesg 里打 log
#abort #coredump #hung_task #signal #exit