gdb backtrace和pthread_cond_wait()

时间:2009-12-03 23:18:02

标签: linux multithreading gdb pthreads conditional-statements

这是在使用gcc 4.1.2和gdb 7.0的2.6.18-164.2.1.el5 x86_64内核的Redhat EL5机器上。

当我使用gdb运行我的应用程序并在运行时中断时,我的几个线程在执行回溯时会显示以下调用堆栈:

#0  0x000000000051d7da in pthread_cond_wait ()
#1  0x0000000100000000 in ?? ()
#2  0x0000000000c1c3b0 in ?? ()
#3  0x0000000000c1c448 in ?? ()
#4  0x00000000000007dd in ?? ()
#5  0x000000000051d630 in ?? ()
#6  0x00007fffffffdc90 in ?? ()
#7  0x000000003b1ae84b in ?? ()
#8  0x00007fffffffdd50 in ?? ()
#9  0x0000000000000000 in ?? ()

这是一个常见问题的症状吗? 在等待条件时查看调用堆栈是否存在已知问题?

3 个答案:

答案 0 :(得分:3)

问题是pthread_cond_wait是用手工编码的程序集编写的,显然在glibc的构建中没有正确的展开描述符(在x86_64上需要展开堆栈)。最近可能已修复此问题here

您可以尝试构建并安装最新的glibc(注意:如果你搞砸了安装,你的机器很可能无法启动;请小心处理!),或只是使用来自{{1}的“虚假”堆栈跟踪}。

答案 1 :(得分:1)

通常,当多个线程共享单个资源时,需要同步。 在这种情况下,当您中断程序时,您将看到只有1个线程正在运行(即访问资源),而其他线程正在pthread_cond_wait()内等待。

所以我认为pthread_cond_wait()本身并不成问题。

如果您的程序因死锁而挂起或性能无法扩展,则可能是由pthread_cond_wait()引起的。

答案 2 :(得分:0)

这对我来说似乎是一个腐败的堆栈跟踪

例如:

#9  0x0000000000000000 in ?? ()

不应该有NULL代码