2

我目前正在开发一种使用自定义核心格式的崩溃收集机制。本质上,它挂钩 linux_binfmt->core_dump 条目以指向我们的转储程序。

转储程序本身会启动一个带有进程 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 用户模式收集器工作的建议将不胜感激。

4

1 回答 1

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);

这会将任务置于跟踪睡眠状态,然后助手可以附加到它。

于 2014-01-30T18:10:56.300 回答