我正在linux上测试一些软件+驱动程序,驱动程序在其内部函数中使用get_user_pages()。在某些时候,我的驱动程序从 get_user_pages() 收到 ERESTARTSYS 错误 (-512),根据内核代码,它发生的原因是“如果我们有一个挂起的 SIGKILL,请不要继续出错页面并可能分配内存。” - 这是来自 memory.c 内核文件的注释。所以我的问题是,我怎样才能看到谁发送了这个 SIGKILL 以及为什么?我试图查看 /var/log/kern.log 文件,但看不到任何信号。我能做些什么?
2 回答
我不相信您可以为 SIGKILL(其他人,是的),除非您愿意修补内核以向您提供信号信息。在这种情况下,您可以根据文档检查 si_code 和 si_pid 值:http: //pubs.opengroup.org/onlinepubs/009696699/basedefs/signal.h.html
例如,如果您的信号信息在 siptr 中:
if ((siptr)->si_code <= 0) {
printk(KERN_DEBUG "kill sent by process %u", (siptr)->si_pid);
}
if 检查不是绝对必要的:它将 printk() 限制为由 kill() 引发的那些信号。如果内核发出信号,si_code 将大于 0。
我有完全相同的问题。但不是在 get_user_pages() 中,我会从 sock_sendmsg() 获得 -ERESTARTSYS。
为了调试这个问题,我在 linux-3.2/kernel/signal.c 中添加了一条日志消息:__send_signal()。
并避免消息填满内核日志。我会 strncmp(t->comm, "myprogramname") 然后记录 t->comm, t->pid, current->comm 和 current->pid。
我也意识到它不仅是 SIGKILL,而且还有任何其他未决信号,然后调用将返回 -ERESTARTSYS。
所以我的下一步是找出谁在给我的程序一个信号。并为所有信号添加处理程序(SIGKILL 除外,我无法真正处理)。对我来说幸运的是,它不是 SIGKILL。
添加处理程序可能对您的情况没有帮助,但日志记录将确定谁在发送和原因。
处理可能会帮助其他有类似问题的人。