GDB调试之多进程/线程

目录

  • 选择调试进程
  • 进程切换
  • 实例
  • 多线程调试

选择调试进程

在GDB中有两个选项来确定调试的进程:

  • follow-fork-mode,设置调试哪个进程
  • detach-on-fork,GDB在fork之后是否断开(detach)某个进程的调试

这两个选项的参数组合起来的效果如下表

follow-fork-modedetach-on-fork效果
parenton只调试父进程
childon只调试子进程
parentoff同时调试两个进程,子进程暂停
childoff同时调试两个进程,子进程暂停

进程切换

  • info inferiors,查看当前所有进程
  • inferiors <num>,切换当前GDB调试进程,其中num为上一条指令中列出的进程Num

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(void)
{
    pid_t pid;
    pid = fork();
    if(pid < 0)
    {
        printf("fork error\n");
    }
    else if(pid == 0)
    {
        printf("in child \n");
    }
    else
    {
        printf("in father,pid of child:%d\n", pid);

    }

}

首先展示如何选择跟踪父子进程,如图

若同时调试两个进程,并且切换进程的效果如下

多线程调试

在另一篇博客《GDB调试之基本指令介绍》中第6章提到了在线程中打断点,这里再介绍下

当你的程序是多线程时,你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。
break line thread threadNo
其中line为你的源码行数,threadNo为info threads命令中GDB给出的线程ID,若不指定threadNo,则为所有线程打断点。

  1. 在多线程调试时,可以设置其余线程的阻塞状态

    • show scheduler-locking,查看设置

    • set scheduler-locking <on><off><step>

      • on,表示调试线程执行时,其余线程锁定,阻塞等待,
      • off ,表示不锁定其他线程
      • step ,表示在step(单步)调试时,只有当前线程运行

      这样就可以避免next调试时总是跳转到其他线程啦

  2. 线程和进程一样,同样支持切换

    • info thread, 列出当前所有线程
    • thread <num>,切换线程,num为上一条指令给出的

https://kind-ptolemy-135b80.netlify.app/gdb%E8%B0%83%E8%AF%95/gdb%E8%B0%83%E8%AF%95%E4%B9%8B%E5%A4%9A%E8%BF%9B%E7%A8%8B%E5%88%87%E6%8D%A2/

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值