day_10 C语言编译环境及GDB调试

来源:互联网 发布:马克斯cms标签 编辑:程序博客网 时间:2024/05/01 05:28

Linux 编程环境

1.编辑器 vi

(1)编辑器 vi 简介
编辑器 vi 最初是由 Sun Microsystrms 公司的 Bill Joy 在1976 年开发的。启初,开发出了 Ex 编辑器,也称为行编辑器,后来开发了vi作为Ex的可视接口,一次能看到一屏的文本而不仅仅是一行,vi因此得名。vi在通过命令操作,界面不友好,对普通人不容易掌握。但是,其丰富的命令和强大的功能,以及占用资源少的特性,使得它在嵌入式Linux系统中,广泛使用。

(2)vi用法
vi有三种模式:
插入模式: 写代码
可视模式: 复制、粘贴、删除、查找等
命令模式:使用命令进行操作

2.编译器 gcc

(1)编译器 gcc 简介
Linux系统下的 gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,它是GNU的代表作品之一,gcc是可以在多种硬件平台上编译出可执行文件的超级编译器,其执行效率比一般的编译器要高出20%-30%。编译器能将C、C++语言源程序、汇编语言源程序和目标程序编译、链接成可执行文件如果没有给出可执行文件的名字,gcc将生成一个默认名为a.out的可执行文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件,而gcc则通过后缀来区别输入文件的类型。

自己查找:
GNU 又称革奴计划,他的目标是创建一套完全自由的操作系统。是“GNU is Not Unix”的递归缩写。
GPL 所有GNU软件都有一份在禁止其他人添加任何限制的情况下授权使用给所有人的协议条款,GNU通用公共许可证(GNU General Public License,即GPL)

GPIO General Purpose Input Output(通用输入/输出)简称GPIO,或总线扩展器,人们利用工业标准接口简化了I/O口的扩展。

(2)gcc 的编译过程
源文件(.c .h)-> 预处理->编译->汇编->(静态库,动态库)链接->可执行文件

预处理(Preprocessing):

主要处理源文件中,以'#'开头的语句,如#include  #ifdef  #define等,该阶段会产生一个中间文件 (*.i)。-E  生成 .i 文件   .c  -->  .i

编译阶段(Compilation):

预处理完成后,gcc首先检查代码的规范性,以及是否有语法错误等。检查无误后,开始把代码翻译成汇编语言。-S    生成 .s 文件   .i  -->  .s

汇编阶段(Assembly):

在汇编阶段,将输入的汇编文件 *.s,转换成目标文件 *.o, *.o 已经是二进制文件,即 0 和 1的机器语言,但是,它不是可执行的二进制文件。-c    生成 .o 文件   .s  -->  .o

链接阶段(Linking):-o

汇编之后,进入链接。在链接阶段,通过链接各种静态库和动态库,得到可执行文件。-o    生成可执行文件 .o  -->  可执行文件 

(3)gcc 常见的用法

gcc -c  gcc -E  gcc -S  gcc -o  生成指定的输出文件gcc -v  查询gcc版本信息gcc -g  生成调试信息,gdb调试器可以利用该信息gcc -I  指定额外的头文件搜索路径gcc -L  指定额外的函数库搜索路径gcc -static 静态链接库,默认都是动态链接库gcc -w      不生成任何警告信息gcc -Wall   生成所有警告信息gcc -c zmx.c -o zmxgcc -o zmx zmx.cgcc zmx.c -g -o zzz

3.调试器 gdb

重中之重设断点调试

(1)调试器 gdb 简介
gdb是Linux系统上缺省使用的调试器。gdb也可以被移植到不同的平台上,如ARM系列处理器的调试器

(2)gdb 用法
1.进入gdb调试环境,有两种方式。
(1)在shell终端,直接输入 gdb ,会看到gdb的一些版本信息;然后使用file 命令调试可执行程序。 file star (star 为需要调试的可执行程序)
(2)在终端直接输入 gdb star.

2.gdb 的常用命令:

命令 简写 格式 含义

file file 文件名 加载文件
display display 变量名 显示参数(设置监听变量)
run r run args 运行程序
list l list [开始,结束] 列出文件的代码清单
print p print 变量名 打印变量的内容
break b break [行号或函数名] 设置断点
continue c continue [开始,结束] 继续运行
info i info 变量名 列出信息
next n next 下一行
step S step 进入函数(步入)

quit q 退出

delete 删除断点 delete breakNum (breakNum表示第几个断点,而不是第几行的断点)
disable 禁用断点
enable 恢复禁用的断点

4.make 和 Makefile

(1)make 和 Makefile 概述
make 是一个命令,用来解析Makefile文件;
Makefile 是一个文件,用来告诉 make 命令如何编译整个工程,生成可执行文件。

(2)make 命令
make [选项] [Makefile 文件]

make 执行的流程:

1. 查找当前目录下的 Makefile 文件;2. 初始化 Makefile 文件中的变量;3. 分析 Makefile 中的所有规则;4. 为所有的文件创建依赖关系;5. 根据依赖关系,决定哪些目标文件要重新生成;6. 执行生成命令。

(3)Makefile 文件内容
1. 规则
(1)Makefile 是由规则来实现的: 目标 依赖 命令

(2)Makefile 的格式:        目标:  依赖        <Tab>   命令    目标和依赖之间,通过“:”分隔,命令前面,是由“Tab”键产生的空格。    当 make 命令去执行 Makefile 文件时,其规则被这样处理:·目标是文件,依赖也是文件。若依赖文件的时间,比目标文件的时间新,说明依赖文件被更新了。则运行规则包含的命令,产生新的目标文件。·如果依赖的是另一条规则的目标,则先跳到另一条规则去执行命令,再返回当前规则。·如果目标不是一个存在的文件,则一定执行。(目标不存在,必须执行)**main.c 中可能有对 自定义.h 文件的引用 需要相对应的 .h 文件。**

今日小结

vi编辑器的部分由于之前在练习编写代码涉及到,就详细说明了,现在不再赘述。
讲一讲gcc 编译器的主要步骤:
1、预处理:检查自定义的函数有没有声明,找不找得到加载的头文件等。主要过程 就是讲 .c 文件生成 .i 文件。一般是这步弹出警告。
2、编译:检查语法及代码规范性等。主要过程将 .i 文件生成 .s 文件(汇编语言);
3、汇编:将汇编语言转换成机器码(0和1),这个二进制文件并不能执行。.s 文件转换成 .o 文件。
4、链接:链接各种静态库和动态库以得到可执行的二进制文件。.o 文件转换为 可执行文件。
GDB的重中之重就是设置断点进行调试
首先使用:gcc -g -o filename(可执行文件) filename.c
通过 -g 生成调试信息。
gdb filename(可执行文件)
break lineNumber 进行设置断点
info b 查看断点详情。