gdb调试多线程

Posted kanguolaikanguolaik

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gdb调试多线程相关的知识,希望对你有一定的参考价值。

一、代码

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

 

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

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】

如下图:

        thread apply all bt

四、调试 --  方法2

4.1 查看 test进程号

        ps -e|grep test

4.2 gdb调试定位bug位置

        gdb test 进程号   启动gdb attach 进程

        info threads         显示所有线程信息

        thread 2               调到第2个线程

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

 

 

参考资料:

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

以上是关于gdb调试多线程的主要内容,如果未能解决你的问题,请参考以下文章

用gdb调试python多线程代码-记一次死锁的发现

GDB 调试多线程程序的总结

GDB调试多线程

Linux学习——Gdb基本调试方法&&多线程调试

GDB多线程调试分析

gdb多线程调试