Linux下多线程的简单调试技巧

本文分享了一个关于Linux环境下多线程编程的实战案例。作者通过详细的步骤介绍了一个涉及三个线程的程序如何进行调试的过程,包括使用gdb设置断点、运行程序、查看线程状态及函数栈等内容。

写在前面

这次的实验:Linux下的多线程编程,我写了一天,调了一天。感觉本程序猿就是90%的时间用来写代码,90%里有60%用来调试和解决bug的。(捂脸状)
这里的调试技巧是我自己总结的一点东西,有什么问题还请指出~

实验环境

Centos 7.0, gcc 4.8.5

问题

写三个线程,线程1、2用来分别读取1.dat和2.dat中的数据再分别存进buffer1和buffer2,线程3读取两个buffer并对数据进行加和乘两种操作再输出

这个例子有三个线程,我的问题就是经常编译运行完以后不退出程序。调试后发现有一个以上的线程一直在等待资源,而释放资源的线程早就已经结束了 ; 又或者是线程三抢先了之类的(这个是我信号量忘记初始化导致的)。

这里写图片描述

干货

1.编译以后,比如 gcc -o test test.c -lpthread, 进入gdb调试:gdb test

这里写图片描述

2.进来以后可以先在三个线程打上断点:b thread1, b thread2, b thread3。(这里b就是break的简写,写break也可以)

这里写图片描述

3.接下来输入r 运行

这里写图片描述

4.然后可以输入 n(单条语句执行,next命令简写),或是c(继续运行程序,continue命令简写)

这里写图片描述

运行到这里会发现停下来了,但是没有正常的退出:

这里写图片描述

5.现在我们先用ctrl + c ,让它停一下。

这里写图片描述

然后,通过命令 info thread 查看还在运行的线程信息:

这里写图片描述

在这里,Id是gdb给线程分配的id, 前面的* 表示当前的线程是Id为1的那个

接下来通过命令 thread 4, 我们可以切换到Id为4的线程中,去查看它到底是谁;通过命令bt(查看函数栈)查看该线程阻塞在哪儿了。

这里写图片描述

可以看到的是线程thread3()阻塞在了sem_wait()上。那么接下来我们就应该推一下是什么原因导致了它一直等待而且等不到信号量。

PS:bt 后,还可以通过 up ,down 来让函数栈往上或往下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值