2012-05-30 62 views
2

我有一个多线程应用程序,它使用netlink套接字与内核模块进行通信。用户模式应用程序中的一个线程用作服务器,内核模块用作客户端。大致内核代码如下:当用户模式应用程序回复该消息使用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 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; 
} 

message_status变量是在网络链路回调更新。所以基本上这个想法是发送一条消息,然后等待最大超时jiffies的回复。

现在,使用gdb的,如果我添加任何功能的破发点由网络链路服务器线程在用户模式下调用,断点永远不会命中和内核日志上充斥着的消息像

在我们得到答复之前,有人把我们吵醒了。剩下的时间3499

在我们得到答复之前,有人叫醒了我们。剩下的时间3499

在我们得到答复之前,有人叫醒了我们。剩下的时间3499

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

..

..

有人叫醒了我们之前,我们得到了一个答复。剩余时间3498

直到我终于得到

没有收到响应

是什么原因造成的内核线程从超时醒来,我应该如何调试用户模式代码?

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

回答

0

用GDB。在gdb中,你可以使用“info threads”来查看线程列表。您可以使用命令“thread”跳转到特定的线程,其中n是所需的线程。你可以使用“break:thread”来设置特定的线程来中断。参见手册的这一部分来控制程序相对于线程停止的行为。即。您可以指定所有线程在您仅使用一个线程时停止。 https://sourceware.org/gdb/onlinedocs/gdb/Thread-Stops.html#Thread-Stops