使用 GDB 调试网络链路通信



我有一个多线程应用程序,它使用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 receivedn");
    return -1;
}
if (message_status != UPDATED)
{
   printk(KERN_ERR "Somebody woke us up before we got a reply. Time left %dn", timeout);
   __set_current_state(TASK_INTERRUPTIBLE);
   goto wait;
}

当用户模式应用程序回复此消息时,在 netlink 回调中更新 message_status 变量。所以基本上这个想法是发送一条消息,然后在最大超时时间等待回复。

现在,使用 gdb,如果我在用户模式下由 netlink 服务器线程调用的任何函数中添加断点,则永远不会命中断点,并且内核日志中充斥着类似

在我们得到回复之前,有人叫醒了我们。剩余时间 3499

在我们得到回复之前,有人叫醒了我们。剩余时间 3499

在我们得到回复之前,有人叫醒了我们。剩余时间 3499

在我们得到回复之前,有人叫醒了我们。剩余时间 3499

..

..

在我们得到回复之前,有人叫醒了我们。剩余时间 3498

直到我终于得到

未收到回复

是什么导致内核线程从超时中唤醒,我应该如何调试用户模式代码?

PS:我在RHEL 2.6.32上使用6.0-71.el6.x86_64

使用 gdb。 在 gdb 中,您可以使用"信息线程"来查看线程列表。 您可以使用命令"线程"跳转到特定线程,其中 n 是所需的线程。 您可以使用"中断:线程"设置要中断的特定线程。 请参阅手册的此部分,以控制程序相对于线程停止的行为。即。您可以指定在仅处理一个线程时所有线程停止。 https://sourceware.org/gdb/onlinedocs/gdb/Thread-Stops.html#Thread-Stops

最新更新