我有一个使用 netlink 套接字与内核模块通信的多线程应用程序。用户模式应用程序中的一个线程用作服务器,内核模块用作客户端。内核代码大致如下:
timeout = 3500;
netlink_unicast();
wait:
__set_current_state(TASK_INTERRUPTIBLE);
timeout = schedule_timeout(timeout);
__set_current_state(TASK_RUNNING);
if (!timeout)
{
printk(KERN_ERR "No response received\n");
return -1;
}
if (message_status != UPDATED)
{
printk(KERN_ERR "Somebody woke us up before we got a reply. Time left %d\n", timeout);
__set_current_state(TASK_INTERRUPTIBLE);
goto wait;
}
当用户模式应用程序回复此消息时,会在 netlink 回调中更新message_status变量。所以基本上这个想法是发送一条消息,然后在最大超时时间等待回复。
现在,使用 gdb,如果我在用户模式下由 netlink 服务器线程调用的任何函数中添加断点,则断点永远不会被命中,并且内核日志中充斥着类似的消息
在我们得到答复之前有人叫醒了我们。剩余时间 3499
在我们得到答复之前有人叫醒了我们。剩余时间 3499
在我们得到答复之前有人叫醒了我们。剩余时间 3499
在我们得到答复之前有人叫醒了我们。剩余时间 3499
..
..
在我们得到答复之前有人叫醒了我们。剩余时间 3498
直到我终于得到
未收到回复
是什么导致内核线程从超时中唤醒,我应该如何调试用户模式代码?
PS:我在 RHEL 6.0 上使用 2.6.32-71.el6.x86_64