当前位置: 首页 > news >正文

【Linux取经之路】编译器gcc/g++的使用 调试器gdb的使用

目录

背景知识

编译器gcc/g++的安装

编译器gcc/g++的使用

调试器gdb的使用

cgdb 

条件断点


背景知识

子曰:“温故而知新”。在谈gcc/g++的使用之前,我们先来复习编译的4个阶段,也算是为下面的内容做一些铺垫,请看思维导图。

编译器gcc/g++的安装

在CentOS下,安装的指令为 sudo yum install -y gcc

在Ubuntu下,安装的指令为 sudo apt install -y gcc

编译器gcc/g++的使用

gcc和g++的使用方法很类似,因为它们的选项基本一样。

● -E,在预处理结束后停止编译过程。

● -S,编译完成就停下。

● -c,汇编完成就停下。

● -g,生成调试信息。

编译器优化选项的4个级别:

● -O0

● -O1

● -O2

● -O3

其中,-O0表示没有优化,-O1为缺省值,-O3的优化级别最高。

其他选项:

● -w,不生成任何警告信息。

● -Wall,生成所有警告信息。

下面,我们来练练手。

1)将test.c进行预处理,生成test.i文件。

我们打开test.i瞅一眼。

2)将test.i进行编译生成test.s文件。

 

我们打开test.s看看。

可以看到,已经变成汇编指令了。

3)将test.s进行汇编生成test.c文件。

 

当我们在打开test.o时,会发现我们已经看不懂了,汇编指令已经被转换成机器可识别的二进制代码。

4)-g选项有无的对比

我们可以看到,加了-g选项生成的_g_test文件要比没加-g选项生成的test文件要大,这是因为_g_test文件里包含了调试信息,而test中没有包含。 

调试器gdb的使用

程序的发布方式有两种,debug模式和release模式,gcc/g++直接编译出来的二进制程序,默认是release模式。如果我们要使用gdb调试,就必须在编译的时候加上-g选项。至于-g选项怎么加,上面已经演示过了。下面我们正式进入gdb的使用。

指令:gdb code   / /打开code进行调试 

● ctrl + d 或 quit,退出调试。

● list 或 l 行号,以所指定行号为中心显示源代码,一次10行。

● list 或 l 函数名,列出指定函数的源代码。

● run 或 r,运行程序。

● n 或 next,逐过程调试(不会进入函数内部)。

● s 或step,逐语句调试(会进入函数内部)。 

● b 或 break 行号,在指定行设置断点。

● break 函数名,在指定函数开头设置断点。

● info break,查看断点信息。

● finish,执行当前函数,然后停下。

● p 变量,打印变量的值。

● set var,修改变量的值。

● c 或continue,从当前位置开始运行。

● delete breakpoints,删除所有断点。

● d n,删除序号为n的断点。

● delete breakpoints,删除所有断点。

● disable breakpoints,禁用所有断点。

● disable breakpoint n,禁用n号断点。

● enable breakpoints,启用所有断点。

● enable breakpoint n,启用n号断点。

● info b,查看所有断点信息。

● until 行号,跳到指定行。

● display 变量名,跟踪查看一个变量,每次停下来都显示它的值。

● undisplay,取消对先前设置的变量的跟踪。 

cgdb 

cgdb是gdb的一个图形界面版本,它具有gdb的所有功能,相较于gdb,cgdb便于我们查看源代码。

CentOS下,安装指令 sudo yum install -y cgdb。

Ubuntu下,安装指令 sudo apt install -y cgdb。

用法:cgdb 文件,例如,cgdb code。

条件断点

通过前面的学习,我们已经掌握了如何打断点,现在我们来学习如何打条件断点。

关键字:condition

语法:condition 断点编号 条件

下面举个简单的例子。

上述设置的条件断点的意思是:如果a等于20就停下来,否则不停下。我们可以看到,在运行起来后,程序停在了第12行,也就是说跳过了第一个断点,因为a不等于20,导致条件断点没生效。


本文到这就结束啦~如有错误,请您不吝指出! 

http://www.lryc.cn/news/440538.html

相关文章:

  • 自动化流程机器人(RPA)
  • Unity persistentDataPath使用案例
  • Android 测试手册
  • 各大平台统遭入侵??区块链市场遭攻击损失近3亿!
  • Java泛型(“代码模板”,一套代码套用各种类型)
  • 速响低代码平台:升级营销管理系统,开启高效无忧新体验!
  • Gitlab升级14.0.12-->14.3.6遇到的gitlab-ctl reconfigure错误
  • JDBC导图
  • 飞思实验室与中飞院联合开发教学课程,校企联袂共绘教育蓝图
  • Telephony Call
  • Python--TCP/UDP通信
  • 【已解决】请教 “Sa-Token 集成 xxl-job,报错:非 web 上下文无法获取 HttpServletRequest” 如何解决
  • Redis——常用数据类型string
  • 架构设计:负责网络、定时、坐下、站起、重连等,支持多类游戏的无锁房间
  • 个人随想-gpt-o1大模型中推理链的一个落地实现
  • python解析ip范围,判断ip是否在ip范围内
  • Springboot错误日志切面,找到post请求体被消费后的数据
  • 【二十】【QT开发应用】listwidget右键菜单和删除item
  • LabVIEW机动车动态制动性能校准系统
  • Linux(CentOS8)服务器安装RabbitMQ
  • R语言进行无序多分类Logistic回归
  • Maven从入门到精通(三)
  • Red Hat 和 Debian Linux 对比
  • Axure设计之全屏与退出全屏交互实现
  • 如何测试出自己电脑的网络速度(网速)?
  • 如何利用AI进行有效的科技产品发布
  • 二层、三层网络基本原理
  • 全面掌握 Jest:从零开始的测试指南(上篇)
  • Go 交叉编译
  • goctl安装失败