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

linux——C程序的编译与调试

一、编译链接的过程(4个)

1.预处理/预编译

①删除所有的#define,展开所有的宏定义

②处理所有的条件预处理指令。

③删除所有注释。

2.编译

进行词法分析,语法分析,语义分析,代码优化等。

3.汇编

将汇编指令翻译成二进制格式,生成各个section。

4.链接

合并各个section,并进行符号的重定位。

二、管理工程实现自动化编译

1.引入原因:在进行多个文件编译时,需要人工手动编译,为了减少人为干预,提高生产力,引入管理工程。

2.举例说明

以main函数为例子,给出makeflie文件,并使用make生成可执行的程序

(1)makefile文件

(2)make生成可执行的文件

三、GDB调试

1.Release版本和Debug版本

(1)Release版本

特点:提供给用户使用的版本,不含有调试的信息。

注意:linux系统下默认使用的是release版本。

(2)Debug版本

特点:含有调试信息。

调试的对象:可执行的文件

注意:window系统下默认使用的是debug版本。

2.linux系统下如何切换到debug版本

(1)前提:

因为调试的信息是在编译过程时加入到中间文件(.O)中,所以在编译时就要控制生成包含调试信息的中间文件(gcc -o 可执行文件 原文件 -g)

(2)切换:

①将源代码编译、链接生成Debug版本的可执行文件

②gdb Debug版本的可执行文件名

3.基本调试的命令

(1)l  显示main函数所在文件的所有代码

(2)b 行号 给指定的行添加一个断点

(3)info break 查看断点信息

(4)r(run)  运行程序

(5)n(next) 单步执行

(6)c(continue)继续执行,直接执行到下一个断点

(7)s 进入被调用的函数中执行

(8)finish 跳出函数

(9)p val 打印val的值

(10)delete 断点号  删除指定的断点

(11) info threads 查看线程信息

(12)thread id 调试目标id指定的线程

相关文章:

  • Kotlin 中ArrayList、listOf、arrayListOf 和 mutableListOf区别
  • 学习路之uniapp--uniapp扩展uni-ui
  • 常用绘图工具网站推荐合集:打造高效可视化表达力!
  • 亚马逊云科技中国峰会
  • 如何在服务器终端下载百度网盘数据
  • 搭建pikachu靶场
  • 礼让行人:深圳 vs 上海
  • tkinter 的 pack() 布局管理器学习指南
  • AI 时代,数仓建模还有价值吗?
  • 第32周———Tensorflow|LSTM-火灾温度预测
  • 【unity游戏开发——热更新】什么是Unity热更新
  • AI觉醒:从实验室幻影到社会氧气——一部穿透60年的智能进化史诗
  • Vue 比较两个数组对象,页面展示差异数据值
  • 算法-每日一题(DAY10)打家劫舍
  • 关于Seata的一个小issue...
  • 基于大模型的三叉神经痛预测及治疗方案研究报告
  • windows中通过git从远程快速只下载指定一个文件的批处理命令
  • Agent轻松通-P3:分析我们的Agent
  • Linux系统时间不对导致mysql初始化失败:Data Dictionary initialization failed.(数据字典版本验证失败)
  • Rust使用tokio(二)HTTPS相关
  • 网站开发预算成本价/免费引流推广的方法
  • 免费网站建站页面/seo短视频网页入口引流
  • 设计说明室内设计/seo推广软件排名
  • 在线原型设计网站/南京百度推广优化排名
  • 上海网络广告推广平台/南阳seo优化
  • 方维制网站/最好看免费观看高清大全