pthread_cond_timedwait用gdb挂起

时间:2011-06-09 21:33:05

标签: gdb pthreads

我在线程循环上使用pthread_cond_timedwait来执行每X ms(除非它首先被唤醒)。

当我使用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程序永远不会返回......;

  5. 然后,如果我在运行gdb的终端上点击Ctrl+C并再次运行continue,那么程序将返回。

    在这种情况下,我可以使用其他一些方法来实现我想要的,但我认为它应该是解决这个问题的方法。

    修改

    看起来这只发生在某些机器上,所以可能与gcc / glibc / gdb / kernel版本有关......

    几乎总是发生这种情况的版本:

    $ 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
    

1 个答案:

答案 0 :(得分:4)

根据this forum post,这是2.6.38内核中的错误。我用2.6.39内核做了一些测试,问题不会发生。回到2.6.38再次出现。