前边我们学习了,gdb调试程序,掌握了最基本的命令,比如list(显示代码),break+行号(打断点),run(程序运行)等等命令,下边,我们用gdb调试多线程程序。
调试代码:
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
void* Run1(void* arg)
{
int i = 0;
int sum = 0;
for(i = 0; i < 10; ++i)
{
sum += i;
}
printf("sum = %d\n",sum);
}
void* Run2(void* arg)
{
int count = 5;
while(count--)
{
printf("hello world\n");
sleep(1);
}
}
int main()
{
pthread_t tid1,tid2;
pthread_create(&tid1,NULL,Run1,NULL);
pthread_create(&tid2,NULL,Run2,NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
要进行gdb调试,程序编译的时候一定要加-g选项。
我的Makefile文件如下:
test:test.c
gcc -o $@ $^ -g -lpthread
.PHONY:clean
clean:
rm -f test
注明:-g的位置不是随意的。
1.显示代码:
注明:显示代码这个命令,和之前调试程序的命令是一样的,这里之所以还会列出来,是因为遇到的问题~~
2.显示线程信息:
info threads
3.线程之间的跳转:
thread ID
单步执行3号线程,然后发现了什么???
4.指定线程执行某些命令:
thread apply ID1 ID2 command
thread apply all command
5.设置线程是单独执行还是一起执行的命令:
set scheduler-locking [off][on][step]
off:默认状态,所有的线程一齐执行。。
on:让当前线程单独执行。
step:在当前状态下进行调试, 如果遇到的一行代码没有调用系统调用,则只执行当前线程,否则,所有的线程一起执行。
由于上边的调试,线程是一齐执行的,所以,2号线程提前结束了,这里,我首先修改一下上边的程序:将Run1函数每加一次也延时1秒,然后重新启动gdb。
(1)测试on参数
(2)测试step参数(重新开启的gdb)