日期:2014-05-16  浏览次数:20993 次

~如何GDB调试因pthread_cond_wait()阻塞的线程??~
如题,比如有两个线程1,2,主线程1执行到某处会pthread_cond_wait(),然后由线程2唤醒,继续执行.
        我用gdb调试时却出了问题,调试时主线程执行到pthread_cond_wait()函数处,进入等待状态,ctrl+c后看到的线程信息如下:
(gdb)   info   thread
*   3   Thread   1026   (LWP   19165)     0x420292e5   in   sigsuspend   ()   from   /lib/i686/libc.so.6
    2   Thread   2049   (LWP   19164)     0x420e0037   in   poll   ()   from   /lib/i686/libc.so.6
    1   Thread   1024   (LWP   19143)     0x420292e5   in   sigsuspend   ()   from   /lib/i686/libc.so.6
想要继续单步执行,反应如下:
(gdb)   n
Single   stepping   until   exit   from   function   sigsuspend,  
which   has   no   line   number   information.

请问怎么回事呢??按理说此时我的线程2的pthread_cond_signal()函数早调用了啊,信号应该是发出来了。
我如何能继续调试下去??

------解决方案--------------------
这个问题我也遇到过,是因为pthread_cond_wait把pthread_cond_signal的信号错过了,自已调吧。我最近也在被libevent的同步问题苦恼。
------解决方案--------------------
还是用记日志的方式调试吧
------解决方案--------------------
用gdb调试多线程非常不好用,因为很多线程没有处理SIGTRAP信号,会被中断,因此当你重新continue的时候这些线程就没了。你可以取GNU的网站找一个叫NPTL Tracer(名字不一定确切,只用过一次)是专门用来调试多线程同步的,不过也不太好用。其实有时候加日志的方法是一种非常有效的方法。