2022-1-14牛客C++项目 —— 第二章 Linux多线程编程(gdb多进程调试)

复习所用的问题
1、如果有多个进程,如何进行进程调试的切换?
2、当调试一个进程的时候,其他的进程会运行吗?如果会如何让他们不运行?
3、如果中途将挂起的程序修改成不挂起会有什么样的后果?如何解决?

调试所使用的代码

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(void){
    printf("begin.\n");
    if(fork() > 0){
        printf("i am parent process: pid = %d,ppid = %d\n",getpid(),getppid());
        int i;
        for(i = 0;i < 3;++i){
            printf("i = %d\n",i);
            sleep(1);
        }
    
    }
    //这个是默认一定会成功生成子进程,是不会产生错误。
    else {
         printf("i am child process: pid = %d,ppid = %d\n",getpid(),getppid());
        int j;
        for(j = 0;j < 10;++j){
            printf("j = %d\n",j);
            sleep(1);
        }
    }
    return 0;
}

使用 gdb 进行调试
在这里插入图片描述

在这里插入图片描述
设置断点,子进程和父进程各一个
在这里插入图片描述
查看断点信息
在这里插入图片描述
run —— 运行到断点处停止
start —— 只运行程序中的第一步
由于 gdb 默认调试的是父进程,因此子进程会先运行完, j 是子进程里面的变量
在这里插入图片描述
n —— 向下一步
c —— 直接运行完成
之后调试的都是父进程。
在这里插入图片描述
设置默认跟踪子进程。
(但是如果我有多个子进程应该如何调试?)
在这里插入图片描述

再次 run ,父进程先运行完,子进程为调试状态
在这里插入图片描述
调试子进程
在这里插入图片描述
再次进入调试,尝试调试父进程的时候将子进程挂起。
设置将子进程挂起

在这里插入图片描述
和第一次调试的情况不同,子进程被挂起后并没有向下执行
在这里插入图片描述
info inferiors 来查看进程的列表和当前调试的进程

  • 标号前面的进程为当前调试的进程
    在这里插入图片描述
    使用 inferior (Num)进行要调试的进程的切换。
    在这里插入图片描述
    这样便可以开始调试子进程
    在这里插入图片描述
    这样就解决了我刚才的问题,如果有多个子进程应该如何调试?
    1)使用 set detach-on-fork off 将没有运行的子进程设置为挂起状态
    2)通过 info inferiors 找到所有的进程的编号,获取要调试的进程的编号
    3)inferior + 编号,这个是自己要调试的进程

再次切换回父进程
在这里插入图片描述
运行完父进程
在这里插入图片描述
这个时候再显示调试的进程列表,发现已经调试完成后的进程显示为 null,并且会自动切换到下一个进程调试。这个时候继续执行调试命令调试的是下一个进程
在这里插入图片描述

第三次调试 —— 使得程序中途脱离调试

设置调试子进程,设置程序被挂起
在这里插入图片描述
将调试的进程切换至父进程
在这里插入图片描述
在这里插入图片描述
使用 detach inferior num 使得指定编号的进程脱离调试,这个时候进程会继续向下运行直到结束,但是结束之后并不会自动切换到下一个进程。需要手动切换
在这里插入图片描述
查看 inferior 的表格,发现将要调试的进程指向 父进程,并未完成进程的切换。
在这里插入图片描述
手动切换回来接着调试。
在这里插入图片描述
在这里插入图片描述

其他常见的命令如 kill / remove inferior 可以自行学习

总结:如果进程都在调试其他进程的时候挂起,那么调试完成一个之后会自动切换成另外一个;如果一个进程先挂起,后不挂起,运行完之后不会换成另外的进程调试。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值