GDB多线程调试

GDB多线程调试的基本命令

info threads:显示当前可调试的所有线程,GDB会给每个线程分配一个Id。前面有“ * ”号的表示当前正在调试的线程。

thread Id:切换当前调试的线程为指定线程。

break FileName.cpp:LinuNum thread all:所有线程都在文件FileName.cpp的第LineNum行有断点。

thread apply ID1 ID2 IDN command:让线程编号是ID1,ID2…等等的线程都执行command命令。如:thread apply 1 3 bt,即线程1,3执行bt。

thread apply all command:所有线程都执行command命令。

set scheduler-locking off|on|step:在调试某一个线程时,其他线程是否执行。在使用step或continue命令调试当前被调试线程的时候,其他线程也是同时执行的,如果我们只想要被调试的线程执行,而其他线程停止等待,那就要锁定要调试的线程,只让它运行。其中:

  • off:不锁定任何线程,所有线程都执行,默认值。
  • on:锁定其他线程,只有当前线程执行。
  • step:在step(单步)时,只有被调试线程运行。即阻止其他线程在当前线程单步调试的时候抢占当前线程,只有当next、continue、util以及finish的时候,其他线程才会获得重新运行的机会。

show scheduler-locking: 查看当前锁定线程的模式。

GDB多线程调试实例

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

void* ThreadEntry1(void* arg){
    (void)arg;
    printf("Thread1!\n");
    pthread_exit(NULL);
    return NULL;
}

void* ThreadEntry2(void* arg){
    (void)arg;
    printf("Thread2!\n");
    pthread_exit(NULL);
    return NULL;
}

int main(){
    printf("Main Thread!\n");
    pthread_t tid1, tid2;
    pthread_create(&tid1, NULL, ThreadEntry1, NULL);
    pthread_create(&tid2, NULL, ThreadEntry2, NULL);
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    return 0;
}

1、设置断点
描述
Enb为 y 时表示该断点启用,Enb为 n 时表示该断点禁用。

2、查看当前可调试的线程
描述
有“ * ”号的表示当前正在调试的线程
运行到断点2时,显示可以调试的线程有3个,正在运行的为线程1(线程Id为2)

3、查看所有线程堆栈信息
描述

4、切换线程
描述
切换成功后发现“ * ”号的位置发生变化

5、查看当前锁定线程的模式
描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值