您的位置:首页 > 运维架构 > Linux

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

2017-04-16 10:21 309 查看

写在前面

这次的实验: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
来让函数栈往上或往下

b372
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: