我有一个多线程应用程序,它使用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 变量。所以基本上我的想法是发送一条消息,然后等待最大超时jiffies回复。
现在,使用gdb,如果我在用户模式下由netlink服务器线程调用的任何函数中添加断点,则永远不会触发断点,并且内核日志充满了像
这样的消息有人在我们得到答复之前把我们吵醒了。时间剩下3499
有人在我们得到答复之前把我们吵醒了。时间剩下3499
有人在我们得到答复之前把我们吵醒了。时间剩下3499
有人在我们得到答复之前把我们吵醒了。时间剩下3499
...
...
有人在我们得到答复之前把我们吵醒了。剩下的时间3498
直到我最终获得
未收到回复
导致内核线程从超时唤醒的原因是什么?我应该如何调试用户模式代码?
PS:我在RHEL 6.0上使用2.6.32-71.el6.x86_64
答案 0 :(得分:0)
使用gdb。在gdb中,您可以使用“info threads”来查看线程列表。你可以使用命令“thread”跳转到一个特定的线程,其中n是所需的线程。您可以使用“break:thread”设置要断开的特定线程。请参阅本手册的此部分以控制程序相对于线程停止的行为。即。您可以指定在处理一个线程时所有线程都停止。 https://sourceware.org/gdb/onlinedocs/gdb/Thread-Stops.html#Thread-Stops