【Linux】gdb调试多线程程序

前边我们学习了,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)
这里写图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值