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调试多线程的主要内容,如果未能解决你的问题,请参考以下文章