【Linux系统】C/C++的调试器gdb/cgdb,从入门到精通

【Linux系统】C/C++的调试器gdb/cgdb,从入门到精通

各位读者大佬好,我是落羽!一个坚持不断学习进步的学生。
如果您觉得我的文章还不错,欢迎多多互三分享交流,一起学习进步!
也欢迎关注我的blog主页:
落羽的落羽

文章目录

一、调试前的预备知识

程序发布的方式有两种,debug模式和release模式。

  • debug模式:生成的可执行程序中会包含程序的调试信息,便于程序员进行调试代码。
  • release模式:会剥离或不生成这些调试信息。这使得文件更小,但也意味着调试器几乎无法工作,release版本程序无法进行调试。

Linux的gcc/g++,按照我们之前的写法gcc -o $@ $^,默认生成的是release版本的程序,是无法进行调试的。要在命令后加-g选项,指定以debug方式发布,debug模式下的程序我们才能进行调试。

gcc -o $@ $^ -g 

二、gdb/cgdb的使用

1. 启动,查看代码

开始使用gdb/cgdb调试,首先要确定系统里已安装gdb/cgdb,其次要调试的程序确定是debug版本的。

gdb 文件名 

gdb和cgdb中,需要用各种指令完成调试过程的不同操作:

  • 退出调试:ctrl + d或输入quit回车

使用gdb,一开始是看不到我们的代码的,要使用l相关命令:

  • 输入(list)l:显示源代码,每次显示10行
  • 输入l 函数名/文件名:列出指定函数/指定文件的代码

输入l 文件名:行号:列出指定文件以某一行为中的几行代码

在这里插入图片描述

但是,实际开发中要靠自己显式出代码,还是很麻烦。因此cgdb诞生了,cgdb是gdb的前端界面增强版本,能够直接将代码显示在屏幕上面,初次之外其他命令操作没有区别:

在这里插入图片描述

后面我们就在cgdb中进行演示了。

2. 基础调试命令

  • 命令(run)r:开始调试,从程序开始执行,调试中途随时可以输入r重头调试
  • 命令(break)b [文件名:]行号:在指定行号设置断点
  • 命令info b:查看当前所有断点的信息
  • 命令d:删除所有断点
  • 命令d 断点序号:删除指定序号的断点

断点会在行号处标明:

在这里插入图片描述

每一个断点都有一个序号,通过info b查看,删除指定断点需要指明这个序号,而不是断点的行号:

在这里插入图片描述
  • 命令(continue)c:从当前位置开始连续执行程序,到下一个断点
  • 命令(next)n:单步逐过程执行,遇到函数时不进入函数内部
  • 命令(step)s:单步逐语句执行,遇到函数时进入函数内部
  • 命令(finish)f:执行到当前函数返回时
  • 命令until 行号:执行到指定行号
gdb/cgdb中,回车自动执行上一条命令

3. 监视变量相关命令

在调试过程中,我们经常需要观察一个变量的值:

  • 命令(print)p 变量/表达式:打印出变量/表达式的值。
  • 命令set var 变量 = 值:修改一个变量的值
  • 命令display 变量:持续显示一个变量的值
  • 命令undisplay 变量序号:取消对指定序号的变量的持续追踪显示
  • 命令watch 变量:监视一个变量的值,如果该变量的值在程序运行期间发生变化,cgdb会暂停程序的执行并通知用户。这一命令常用在,如果有不应该被修改的变量,你怀疑他被修改了,就可以watch他。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 设置条件断点

一个断点,也可以为其设置触发的条件。

b 位置 if 条件 #条件满足时,断点才会生效

举个栗子:b 10 if i == 5,表示在第10行新增一个断点,只有 i == 5 时才会生效

在这里插入图片描述

也可以给一个已存在断点新增触发条件:

condition 断点序号 条件 
在这里插入图片描述

非常好理解!

本篇完,感谢阅读

Read more

Spring Cloud+AI :实现分布式智能推荐系统

Spring Cloud+AI :实现分布式智能推荐系统

欢迎文末添加好友交流,共同进步! “ 俺はモンキー・D・ルフィ。海贼王になる男だ!” 引言 * 在当今数字化时代,推荐系统已成为电商平台、内容分发平台、社交网络等互联网产品的核心竞争力之一。从淘宝的"猜你喜欢"、抖音的精准内容推送,到 Netflix 的影视推荐,优秀的推荐系统不仅能显著提升用户留存率和转化率,更能为企业带来可观的商业价值。据统计,亚马逊约 35% 的销售额来自推荐系统,Netflix 则通过推荐算法为用户节省了每年约 10 亿美元的搜索成本。 * 然而,随着业务规模的增长和推荐算法的复杂化,传统的单体架构逐渐暴露出诸多瓶颈。首先,推荐系统涉及用户画像构建、实时行为收集、特征工程、模型推理等多个环节,单体应用难以应对日益复杂的业务逻辑;其次,推荐服务需要处理海量并发请求,单机部署无法满足弹性伸缩的需求;再者,AI 模型的迭代更新日益频繁,单体架构下模型部署往往需要重启整个应用,严重影响线上服务稳定性;最后,企业需要支持 A/B

By Ne0inhk
【Spring】Spring事务和事务传播机制

【Spring】Spring事务和事务传播机制

🎬 那我掉的头发算什么:个人主页 🔥 个人专栏: 《javaSE》《数据结构》《数据库》《javaEE》 ⛺️待到苦尽甘来日 文章目录 * 事务三连 * 什么是事务 * 为什么要有事务 * 事务的操作 * Spring中事务的实现 * 准备工作 * Spring编程事务 * Spring 声明式事务 @Transactional * @Transactional详解 * rollbackFor * 事务隔离级别 * Mysql事务隔离级别 * Spring事务隔离级别 * Spring事务传播机制 * 总结 事务三连 什么是事务 事务是⼀组操作的集合, 是⼀个不可分割的操作. 事务会把所有的操作作为⼀个整体, ⼀起向数据库提交或者是撤销操作请求. 所以这组操作要么同时成功, 要么同时失败. 为什么要有事务 我们在进行程序开发时,也会有事务的需求。 比如转账操作: 第一步:A 账户 -100 元。 第二步:B 账户 +100

By Ne0inhk
数据库SQL防火墙构建主动防御,让恶意SQL无处遁形

数据库SQL防火墙构建主动防御,让恶意SQL无处遁形

在数字化转型的浪潮中,数据已成为企业的核心资产。然而,SQL注入攻击如同潜伏在阴影中的“不速之客”,时刻威胁着数据库的安全。即使开发团队严守预编译、输入过滤等防线,遗留代码、第三方组件的漏洞或人为疏忽仍可能给攻击者可乘之机。难道只能被动挨打、疲于补漏吗? 金仓数据库(KingbaseES)V009R002C014版本内置的SQL防火墙,给出了一种更聪明的答案——从数据库内核层构建主动防御,让恶意SQL无处遁形,安全团队从此告别“亡羊补牢”,真正实现“规则先行”。 一、SQL注入:那个偷偷溜进房子的“不速之客” SQL注入的原理并不复杂,却极其致命:攻击者将恶意代码伪装成正常输入,欺骗数据库执行非预期操作。 举个简单的例子:一个登录表单中,用户在用户名栏输入 ' OR '1'='1,后台的查询语句可能就变成了: SELECT * FROM users WHERE OR '1'='

By Ne0inhk
Spring Boot + jQuery 前后端分离图书管理系统:从接口设计到问题排查

Spring Boot + jQuery 前后端分离图书管理系统:从接口设计到问题排查

图书管理系统 1.1 准备前端代码 在本地想要的可以去我的gitee中下载 library 的相关前端代码 1.2 约定前后端交互接口 需求分析 图书管理系统是⼀个相对较大一点的案例,咱们先实现其中的⼀部分功能. 用户登录 1. 登录接口 2. 图书列表展示 字段说明: 字段说明id图书 IDbookName图书名称author作者count数量price定价publish图书出版社status图书状态 1 - 可借阅 其他 - 不可借阅statusCN图书状态中文含义 3.4.3 服务器代码 创建图书类 BookInfo @Data public class BookInfo { //图书ID private Integer id; //书名 private String bookName; //作者 private String

By Ne0inhk