2009-12-03 151 views
2

這是在使用gcc 4.1.2和gdb 7.0的Redhat EL5機器上安裝2.6.18-164.2.1.el5 x86_64內核。gdb backtrace和pthread_cond_wait()

當我運行我用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

問題是pthread_cond_wait是用手工編寫的程序集編寫的,而且顯然在glibc的內部版本中沒有正確的展開描述符(在x86_64上需要展開堆棧)。這個問題最近可能已經修復了here。 (注意:如果你把安裝搞砸了,你的機器可能會無法啓動;非常謹慎的做法!),或者只是住在pthread_cond_wait的「虛假」堆棧軌跡中。你可以嘗試構建並安裝最新的glibc。

+0

這就是問題所在。我在32位EL5機器上試過我的應用程序,gdb工作正常。 – 2009-12-11 15:06:56

0

這看起來像一個腐敗的堆棧跟蹤我

例如:

#9 0x0000000000000000 in ??() 

不應該有在零碼

0

一般情況下,當多個線程共享一個需要同步資源。 在這種情況下,當您中斷程序時,您將看到只有1個線程正在運行(即訪問資源),並且其他線程正在等待pthread_cond_wait()

所以我不認爲pthread_cond_wait()本身是有問題的。

如果程序掛起死鎖或性能不能縮放,則可能是由pthread_cond_wait()造成的。