GDB:调试死锁

一、代码

        2个线程,加锁后轮流输出数据,其中1个线程,误将pthread_mutex_unlock(),写成pthread_mutex_lock()代码如下:

 

#include 
#include 
#include 

int g_tickets = 100;
pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;

void* thread_proc1(void* arg)
{
        while (1)
        {
                pthread_mutex_lock(&g_mutex);
                if (g_tickets > 0)
                        printf("thread 1 sell tickets:%d\n", g_tickets--);
                else
                {
                        //pthread_mutex_unlock(&g_mutex);
                        pthread_mutex_lock(&g_mutex);
                        break;
                }
                //pthread_mutex_unlock(&g_mutex);
                pthread_mutex_lock(&g_mutex);
        }

        return (void*)1;
}

void* thread_proc2(void* arg)
{
        while (1)
        {
                pthread_mutex_lock(&g_mutex);
                if (g_tickets > 0)
                        printf("thread 2 sell tickets:%d\n", g_tickets--);
                else
                {
                        pthread_mutex_unlock(&g_mutex);
                        break;
                }
                pthread_mutex_unlock(&g_mutex);
        }

        pthread_exit((void*)2);
}

int main(int argc, char*argv[])
{
        pthread_t tid1, tid2;
        void *ret1, *ret2;

        pthread_create(&tid1, NULL, thread_proc1, NULL);
        pthread_create(&tid2, NULL, thread_proc2, NULL);

        pthread_join(tid1, &ret1);
        pthread_join(tid2, &ret2);

        printf("ret1:%d\n",(int)ret1);
        printf("ret2:%d\n",(int)ret2);

        return 0;
}


二、编译运行

 

2.1 编译

        gcc -g test.c -lpthread -o test

2.2 运行

        ./test 

2.3 输出结果

三、调试 -- 方法1

3.1 查看 test进程号

        ps aux|grep test

3.2 查看进程中的所有线程

        pstree -p 13006

3.3 gdb调试定位bug位置

        gdb

        attach 进程号

        bt 【thread apply all bt】

如下图:

GDB:调试死锁_第1张图片

        thread apply all bt

GDB:调试死锁_第2张图片

四、调试 --  方法2

4.1 查看 test进程号

        ps -e|grep test

4.2 gdb调试定位bug位置

        gdb test 进程号   启动gdb attach 进程

        info threads         显示所有线程信息

        thread 2               调到第2个线程

        bt                           查看第2个线程的堆栈,即可可以看到线程死锁的地方

GDB:调试死锁_第3张图片

 

 

参考资料:

      使用gdb调试死锁线程:http://blog.csdn.net/atinybirdinit/article/details/41550149

你可能感兴趣的:(系统编程)