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 可以自行学习
总结:如果进程都在调试其他进程的时候挂起,那么调试完成一个之后会自动切换成另外一个;如果一个进程先挂起,后不挂起,运行完之后不会换成另外的进程调试。
2022-1-14牛客C++项目 —— 第二章 Linux多线程编程(gdb多进程调试)相关推荐
- 2022-1-15 牛客C++项目——第二章 Linux 多进程开发
一.进程的的退出 问题:为什么使用标准 C 库函数和使用 Linux 的系统函数最后会有两个截然不同的结果呢? exit() #include<stdio.h> #include<s ...
- 2021-11-25牛客网项目第一章——Linux系统编程入门
b1.1Linux开发环境搭建 1)Linux虚拟机的配置 2)Xshell.Xftp.vscode与Linux虚拟机的连接 1.2GCC 1.3静态库的制作和使用 静态库制作的全过程 首先进入放置要 ...
- 仿牛客网项目第二章:开发社区登录模块(详细步骤和思路)
目录 1. 发送邮件 1.0 三步走 1.1 邮箱设置 1.2 Spring Email 1.3 模板引擎 1.4 发送邮件的过程 1.5 检验发送邮件的过程 2. 开发注册功能 2.0 注册功能的步 ...
- 2022-1-13牛客网C++项目—— 第二章 Linux 多进程开发(一)
复习用的问题 进程和程序之间的关系是什么? 进程包含了哪些信息? 一.程序当中包含了一系列的信息,这些信息用于描述如何创建一个进程. 1)二进制格式标识:描述文件的格式,内核根据这个信息来解释文件中的 ...
- 仿牛客论坛项目(上)
代码仓库:https://gitee.com/qiuyusy/community 仿牛客论坛项目(下) 仿牛客论坛项目上 1. Spring 在测试类中使用Spring环境 @Primary的作用 @ ...
- 仿牛客论坛项目(下)
代码仓库:https://gitee.com/qiuyusy/community 仿牛客论坛项目(上) 仿牛客论坛项目 15.kafka 1.阻塞队列 2.Kafka入门 简介 术语解释 下载 配置 ...
- 仿牛客论坛项目(3)
仿牛客论坛项目 一.阻塞队列 1.1 测试 二.kafka入门 2.1 kafka下载 2.2 测试 三.Spring整合kafka 3.1 引入依赖 3.2 修改配置文件 3.3 测试 四.发布系统 ...
- 仿牛客论坛项目(5)
仿牛客论坛项目 一.SpringSecurity入门案例 1.1 添加依赖 1.2 配置文件 1.3 工具类 CommunityUtil 1.4 配置类 SecurityConfig 1.5 实体类 ...
- 仿牛客论坛项目(4)
仿牛客论坛项目 一.Elasticsearch入门 1.1 elasticsearch安装 1.2 修改config目录下的elasticsearch.yml配置文件 1.3 配置环境变量 1.4 下 ...
最新文章
- java学习笔记(一) ----java下常用的包功能
- 人工智能给全球治理带来怎样的变革契机?
- 1.1 Spring的整体架构--Spring源码深度解析
- 求职特训营火热来袭 阿里大咖教你制作专业简历
- mysql int 最大显示宽度_mysql int 整数类型 解释显示宽度 和 存储宽度
- Java 9代码工具:使用Java微型基准测试工具的实践会话
- [jQuery基础] jQuery动效案例(一) -- 弹窗广告、对联广告
- html相对路径之前,HTML之绝对路径与相对路径
- PRD产品需求文档原型模版
- excel自动合并两列
- python乘积函数_Python中的乘法函数
- BeyondCompare密钥过期怎么办?不用再找新的密钥,一招帮你搞定!
- dubbo 2标签解析 ServiceBeanT 生产者服务暴漏过程
- 星星泪用计算机怎么弹,星星泪简谱
- xamarin Android activity生命周期详解
- vivo手机怎么添加日程提醒?vivo手机添加日程方法
- 程序员面试闪充--iOS密码学
- 百度的工业互联网新解,“开物”加速工业智能化升级
- 谷歌网页自动翻译,赞一个
- (分享) 英语邮件要点
热门文章
- 申报高企科技成果转化是什么?
- 怎么把图片文件大小压缩到25k到40k还比较清晰
- 【Proteus】51单片机交通灯信号模拟仿真示例二
- chosen插件--(二)使得chosen插件没有搜索框
- calculate cumulative probability cumprob = np.cumsum(prob)含义是什么
- 高仿新闻教程-开源框架的简单实现——网易新闻的标题栏(一)
- 源码编译freeswitch-1.10.7遇到问题总结
- 跨平台基础网络框架Mars初探
- Scrum板与Kanban如何抉择?pqtofaaae板与按照bdyefr
- 9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度、形态平滑、高帽变换、低帽变换)