我目前正在开发一种使用自定义核心格式的崩溃收集机制。本质上,它挂钩linux_binfmt-> core_dump条目以指向我们的转储器。
转储器本身启动一个usermode帮助程序,其中包含要捕获的进程的PID,在允许内核完全终止进程之前,通过ptrace转储进程信息:
call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
我的问题是该任务在技术上处于磁盘休眠状态而未停止,因此ptrace调用失败。
我试图SEND_SIG_FORCED一个SIGSTOP无济于事:
send_sig_info(SIGSTOP, SEND_SIG_FORCED, current);
关于如何仍然阻止进程终止但将其置于停止状态以使ptrace用户模式收集器工作的任何建议将非常感激。
答案 0 :(得分:1)
找到一个解决方案,部分原因是ptrace中的一些不一致的标志检查:
printk(KERN_INFO "%s Launching usermode helper for %d\n", __FUNCTION__, current->pid);
call_usermodehelper(argv[0], argv, envp, UMH_NO_WAIT);
set_current_state(TASK_UNINTERRUPTIBLE | TASK_TRACED);
schedule();
printk(KERN_INFO "%s user-mode helper done! killing pid %d\n", __FUNCTION__, current->pid);
这会将任务置于跟踪睡眠状态,然后帮助程序可以附加到它。