Linux gdb调试多线程

gdb调试多线程

gdb调试多线程的方法和调试多进程相差不多,我们先写一段多线程代码以供测试:

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


void* rout1(void* arg)
{
	printf("I am %s!\n",(char*)arg);
	return (void*)0;
}

void* rout2(void* arg)
{
	printf("I am %s!\n",(char*)arg);
	return (void*)0;
}

void* rout3(void* arg)
{
	printf("I am %s!\n",(char*)arg);
	return (void*)0;
}

int main()
{
	pthread_t t1,t2,t3;

	pthread_create(&t1,NULL,rout1,"thread1");
	pthread_create(&t2,NULL,rout1,"thread2");
	pthread_create(&t3,NULL,rout1,"thread3");

	pthread_join(t1,NULL);
	pthread_join(t2,NULL);
	pthread_join(t3,NULL);

	return 0;
}

照例我们先编译代码,一定要记得加-g选项,与多进程不同的是,多线程编译时要加-lpthread


然后gdb test进入调试,list显示所调试代码。


我们输入break(b) 28在第28行打断点,并运行run(r),此时已经创建了1个线程,加上主线程共2个线程。


用指令info threads来查看当前可调试的线程。发现分别有两个编号为1与2的线程。


我们输入n,运行至29行,info threads查看


我们可以发现可以调试的线程有1号和2号变成1号和3号,这是因为线程一已经跑完了,在进程内部已经没有了线程一。所以只剩下两个线程,主线程与线程二。线程二的编号为3。我们可以用可以用thread+线程编号,来进行切换。 


我们发现*已经从1前面移至3前面,说明当前正在调试线程3。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页