当前位置: 技术问答>linux和unix
~如何GDB调试因pthread_cond_wait()阻塞的线程??~
来源: 互联网 发布时间:2016-01-26
本文导语: 如题,比如有两个线程1,2,主线程1执行到某处会pthread_cond_wait(),然后由线程2唤醒,继续执行. 我用gdb调试时却出了问题,调试时主线程执行到pthread_cond_wait()函数处,进入等待状态,ctrl+c后看到的线程信息如...
如题,比如有两个线程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()函数早调用了啊,信号应该是发出来了。
我如何能继续调试下去??
我用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()函数早调用了啊,信号应该是发出来了。
我如何能继续调试下去??
|
用gdb调试多线程非常不好用,因为很多线程没有处理SIGTRAP信号,会被中断,因此当你重新continue的时候这些线程就没了。你可以取GNU的网站找一个叫NPTL Tracer(名字不一定确切,只用过一次)是专门用来调试多线程同步的,不过也不太好用。其实有时候加日志的方法是一种非常有效的方法。
|
这个问题我也遇到过,是因为pthread_cond_wait把pthread_cond_signal的信号错过了,自已调吧。我最近也在被libevent的同步问题苦恼。
|
还是用记日志的方式调试吧
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。