2011-06-09 75 views
6

我在線程循環上使用pthread_cond_timedwait執行每X毫秒(除非它首先被喚醒)。pthread_cond_timedwait掛gdb

當我使用gdb進行調試時,它有時候不會返回函數。

This forum post也有同樣的問題,但沒有解決方案。

下面是一些代碼能重現問題:

#include <errno.h> 
#include <pthread.h> 
#include <stdio.h> 
#include <unistd.h> 

static pthread_cond_t s_cond = PTHREAD_COND_INITIALIZER; 
static pthread_mutex_t s_mutex = PTHREAD_MUTEX_INITIALIZER; 

int main(int argc, char **argv) 
{ 
    int rc = 0; 
    struct timespec curts = { 0 }; /* transformed timeout value */ 

    clock_gettime(CLOCK_REALTIME, &curts); 
    curts.tv_sec += 10; /* Add 10 seconds to current time*/ 

    pthread_mutex_lock(&s_mutex); 

    printf("pthread_cond_timedwait\n"); 
    rc = pthread_cond_timedwait(&s_cond, &s_mutex, &curts); 
    if (rc == ETIMEDOUT) 
    { 
     printf("Timer expired \n"); 
    } 

    pthread_mutex_unlock(&s_mutex); 

    return 1; 
} 

如果我運行它,它會運行正常,如果我在gdb運行它也將運行確定。

我已經縮小到這些步驟(我命名方案timedTest):

  1. 運行程序;

  2. 雖然它運行時將gdb附加到它;

  3. 在gdb上執行continue;

  4. timedTest程序永遠不會返回...;

然後,如果我在終端運行GDB打Ctrl+C,再次運行continue,然後程序會返回。

我可以在這種情況下使用其他方法來實現我想要的功能,但我認爲它應該是解決這個問題的方法。

編輯:

看起來這只是在某些機器上發生的,所以也許有什麼東西做用gcc/glibc的/ GDB /內核版本...

版本,其中發生這種情況幾乎總是:

$ ldd --version 
ldd (Ubuntu EGLIBC 2.13-0ubuntu13) 2.13 

$ gcc --version 
gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 

$ gdb --version 
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2 

$ uname -a 
Linux geovani 2.6.38-8-generic-pae #42-Ubuntu SMP Mon Apr 11 05:17:09 UTC 2011 i686 i686 i386 GNU/Linux 
+0

'info threads'在卡住的線程上顯示任何有趣的東西嗎? – 2011-06-09 21:55:07

+0

這種情況發生的頻率如何?我試圖重現它,但到目前爲止它還沒有發生10次嘗試。 – Ringding 2011-06-10 08:24:59

+0

它幾乎總是發生,但也許這與某些版本的gdb或glibc甚至linux內核有關...(增加版本的帖子) – Vargas 2011-06-10 12:37:02

回答

4

根據this forum post,這是在2.6.38內核一個錯誤。我用2.6.39內核做了一些測試,問題沒有發生。回到2.6.38它再次出現。

+1

謝謝!試圖弄清楚這件事我瘋了 – Frederik 2011-06-14 15:36:15