复习所用的问题
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 可以自行学习

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

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

  1. 2022-1-15 牛客C++项目——第二章 Linux 多进程开发

    一.进程的的退出 问题:为什么使用标准 C 库函数和使用 Linux 的系统函数最后会有两个截然不同的结果呢? exit() #include<stdio.h> #include<s ...

  2. 2021-11-25牛客网项目第一章——Linux系统编程入门

    b1.1Linux开发环境搭建 1)Linux虚拟机的配置 2)Xshell.Xftp.vscode与Linux虚拟机的连接 1.2GCC 1.3静态库的制作和使用 静态库制作的全过程 首先进入放置要 ...

  3. 仿牛客网项目第二章:开发社区登录模块(详细步骤和思路)

    目录 1. 发送邮件 1.0 三步走 1.1 邮箱设置 1.2 Spring Email 1.3 模板引擎 1.4 发送邮件的过程 1.5 检验发送邮件的过程 2. 开发注册功能 2.0 注册功能的步 ...

  4. 2022-1-13牛客网C++项目—— 第二章 Linux 多进程开发(一)

    复习用的问题 进程和程序之间的关系是什么? 进程包含了哪些信息? 一.程序当中包含了一系列的信息,这些信息用于描述如何创建一个进程. 1)二进制格式标识:描述文件的格式,内核根据这个信息来解释文件中的 ...

  5. 仿牛客论坛项目(上)

    代码仓库:https://gitee.com/qiuyusy/community 仿牛客论坛项目(下) 仿牛客论坛项目上 1. Spring 在测试类中使用Spring环境 @Primary的作用 @ ...

  6. 仿牛客论坛项目(下)

    代码仓库:https://gitee.com/qiuyusy/community 仿牛客论坛项目(上) 仿牛客论坛项目 15.kafka 1.阻塞队列 2.Kafka入门 简介 术语解释 下载 配置 ...

  7. 仿牛客论坛项目(3)

    仿牛客论坛项目 一.阻塞队列 1.1 测试 二.kafka入门 2.1 kafka下载 2.2 测试 三.Spring整合kafka 3.1 引入依赖 3.2 修改配置文件 3.3 测试 四.发布系统 ...

  8. 仿牛客论坛项目(5)

    仿牛客论坛项目 一.SpringSecurity入门案例 1.1 添加依赖 1.2 配置文件 1.3 工具类 CommunityUtil 1.4 配置类 SecurityConfig 1.5 实体类 ...

  9. 仿牛客论坛项目(4)

    仿牛客论坛项目 一.Elasticsearch入门 1.1 elasticsearch安装 1.2 修改config目录下的elasticsearch.yml配置文件 1.3 配置环境变量 1.4 下 ...

最新文章

  1. java学习笔记(一) ----java下常用的包功能
  2. 人工智能给全球治理带来怎样的变革契机?
  3. 1.1 Spring的整体架构--Spring源码深度解析
  4. 求职特训营火热来袭 阿里大咖教你制作专业简历
  5. mysql int 最大显示宽度_mysql int 整数类型 解释显示宽度 和 存储宽度
  6. Java 9代码工具:使用Java微型基准测试工具的实践会话
  7. [jQuery基础] jQuery动效案例(一) -- 弹窗广告、对联广告
  8. html相对路径之前,HTML之绝对路径与相对路径
  9. PRD产品需求文档原型模版
  10. excel自动合并两列
  11. python乘积函数_Python中的乘法函数
  12. BeyondCompare密钥过期怎么办?不用再找新的密钥,一招帮你搞定!
  13. dubbo 2标签解析 ServiceBeanT 生产者服务暴漏过程
  14. 星星泪用计算机怎么弹,星星泪简谱
  15. xamarin Android activity生命周期详解
  16. vivo手机怎么添加日程提醒?vivo手机添加日程方法
  17. 程序员面试闪充--iOS密码学
  18. 百度的工业互联网新解,“开物”加速工业智能化升级
  19. 谷歌网页自动翻译,赞一个
  20. (分享) 英语邮件要点

热门文章

  1. 申报高企科技成果转化是什么?
  2. 怎么把图片文件大小压缩到25k到40k还比较清晰
  3. 【Proteus】51单片机交通灯信号模拟仿真示例二
  4. chosen插件--(二)使得chosen插件没有搜索框
  5. calculate cumulative probability cumprob = np.cumsum(prob)含义是什么
  6. 高仿新闻教程-开源框架的简单实现——网易新闻的标题栏(一)
  7. 源码编译freeswitch-1.10.7遇到问题总结
  8. 跨平台基础网络框架Mars初探
  9. Scrum板与Kanban如何抉择?pqtofaaae板与按照bdyefr
  10. 9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度、形态平滑、高帽变换、低帽变换)