GCC与GDB
2018-03-12 21:35
162 查看
GCC 的使用GCC是Linux系统中最为著名得编译器,它是由Richard Stallman在1984年编写的,当时仅仅把它当作一个免费的,能够被使修改的C语言编译器。
一、GCC的基本使用
与很多Linux上的软件一样,GCC也是一款开源的软件,GCC经过几年得发展不仅能够支持C语言,还支持Ada,C++,Java,Pascal等多种语言,因此当前得GCC已变成了GNU编译器家族(GNU Compiler Collection)
除了支持众多开发语言外,GCC也对各种硬件平台进行支持,正是由于这种跨平台的能力,加速了GCC成为Linux首选的编译器。
1、GCC基础
由于GCC支持多种语言,因此GCC能够支持多种文件后缀的编译
2、GCC的编译方式
GCC指令得一般格式:
gcc [选项] 源文件名 [选项] 目标文件名
◆采用默认得方式编译源文件,系统会生成a.out可执行文件
◆采用显式编译成目标文件,在编译成可执行文件
gcc -c hello.c
gcc -o hello hello.o
◆直接编译成可执行文件
gcc -o hello hello.c
3、GCC编译流程
编译器的输入是程序的源文件,输出是可执行得文件或者可分发得二进制代码,中间过程便是编译器要完成得工作。其程序得编译流程为:
程序的编译流程图
事实上编译器也是按照上图中的流程来进行编译的,分为四个步骤:
◆预处理
本阶段是针对头文件(.h)进行编译,即将这些头文件编译到当前源文件中,预处理常用得选项是-E,它的作用是告诉编译器,当预处理结束后停止编译。
预处理的输入是.c文件,输出是.i文件
命令:gcc -E 源文件 -o 目标文件
◆编译
本阶段是对代码得规范性,语法得正确性进行检查,并编译成汇编语言。编译常用的选项是-S,它的作用是告诉编译器,当编译结束时,停止编译。
编译的输入是.i文件,输出是.s文件
命令:gcc -S源文件 -o 目标文件
◆汇编
本阶段是将汇编语言翻译成目标文件,汇编常用的选项是-c,它的作用是告诉编译器,当汇编阶段结束时停止编译
汇编的输入是.s文件,输出是.o文件
命令:gcc -c 源文件 -o 目标文件
◆链接
本阶段是将所有的目标文件以及相应的库文件编译成可执行文件,链接并不需要选项,只需要制定生成的可执行文件名。
链接的输入是.o文件,输出是可执行文件
命令:gcc 源文件 -o 目标文件
4、GCC命令分类
GCC有12类选项,分别是总体选项、语言选项、预处理选项、汇编器选项、链接器选项、目录选项、警告选项、调试选项、优化选项、目标选项、机器相关选项、代码生成选项。
◆总体选项
总体选项是GCC中最常用的选项
◆目录选项
目录选项用于搜索编译时头文件、库文件或者编译器其他参数得路径
◆警告选项
警告选项用于显示程序在编译时的警告信息
◆调试选项
调试选项用于用户程序得调试
◆优化选项
优化选项用于GCC对可执行代码进行优化操作,通常会用到得是O、O0、O1、O2|、O3五种优化方式,通常O后面得数字代表优化的效果,数字越大,优化的内容就越多。
【注意】这里得优化是指编译时的优化,有时候为了实现程序的高效率执行,需要在程序代码上做代码级的优化。
Gcc -o hello1 hello.c -O1
Gcc -o hello2 hello.c -O2
Gcc -o hello hello.c -O
Gcc -o hello0 hello.c -O0
Gcc -o hello3 hello.c -O3
GDB使用
GDB是GNU组织在Linux系统中发布的程序调试器,它功能强大,使用方便,已经成为Linux系统中C/C++程序调试的必备工具。
1、 GDB命令
GDB是Linux系统上的一款强有力的调试工具,它能够帮助开发者观察程序运行时的内部结构和内存的使用状态。
一般说来,GDB能够完成4个方面的工作:
● 调试程序:支持程序代码级调试,可以一行一行地执行程序代码
● 动态断点设置:可以动态设置断点,设置设置条件表达式,并自定义程序停止或运行
● 检查运行状态:提供丰富的检查机制,能够查看变量,内存等感兴趣资源的使用状况
● 执行环境动态改变:支持动态改变程序的执行环境
1、 GDB的启动
GDB有两种加载被调试程序的方式:一种是在启动时输入gdb filename,可以自动加载被调试文件,另一种是在启动GDB后输入file filename,其中file是GDB内置命令,用于指明要加载的调试文件。
在使用GDB时,要注意一点是,被调试的可执行程序在编译时,一定要打开-g选项,不然没有办法使用GDB。另外GDB中执行调试的命令是run,即成功加载被调试文件后,输入run才可以在GDB中执行被调试的可执行文件。
2、 GDB的退出
退出GDB的命令是quit,输入quit后即可退出GDB,有时候可能需要只终止被调试的可执行程序,这时候可以输入kill命令,kill的意义是终止当前正在调试的程序。
2、 GDB命令的分类
GDB的命令可分为5类,运行环境设置与查看、断点设置与恢复、源码查看、程序数据查看和运行参数设置。
1、 运行环境设置与查看
运行环境设置与查看包括在GDB中设置环境变量、查看环境变量、设置程序的运行路径、查看已设的路径、设置工作目录、查看工作目录、shell命令等。
2、 断点设置与恢复
断点设置与恢复是程序调试中最频繁的操作,GDB中提供了丰富的断点设置与恢复的调试命令。
3、 源码查看
4、
5、 运行参数设置时
运行参数设置是指在程序运行时,设置相应变量的值,它的基本设置命令是set。
一、GCC的基本使用
与很多Linux上的软件一样,GCC也是一款开源的软件,GCC经过几年得发展不仅能够支持C语言,还支持Ada,C++,Java,Pascal等多种语言,因此当前得GCC已变成了GNU编译器家族(GNU Compiler Collection)
除了支持众多开发语言外,GCC也对各种硬件平台进行支持,正是由于这种跨平台的能力,加速了GCC成为Linux首选的编译器。
1、GCC基础
由于GCC支持多种语言,因此GCC能够支持多种文件后缀的编译
后缀名 | 意义 |
.c | C源文件 |
.C/.cpp/.cc/.cxx | C++源文件 |
.h | 头文件 |
.m | Object C源文件 |
.i | 已经预处理过的C源文件 |
.ii | 已经预处理过的C++源文件 |
.s | 汇编语言源文件 |
.o | 目标源文件 |
.a | 编译后得静态库文件 |
.so | 编译后得动态库文件 |
2、GCC的编译方式
GCC指令得一般格式:
gcc [选项] 源文件名 [选项] 目标文件名
◆采用默认得方式编译源文件,系统会生成a.out可执行文件
◆采用显式编译成目标文件,在编译成可执行文件
gcc -c hello.c
gcc -o hello hello.o
◆直接编译成可执行文件
gcc -o hello hello.c
3、GCC编译流程
编译器的输入是程序的源文件,输出是可执行得文件或者可分发得二进制代码,中间过程便是编译器要完成得工作。其程序得编译流程为:
程序的编译流程图
事实上编译器也是按照上图中的流程来进行编译的,分为四个步骤:
◆预处理
本阶段是针对头文件(.h)进行编译,即将这些头文件编译到当前源文件中,预处理常用得选项是-E,它的作用是告诉编译器,当预处理结束后停止编译。
预处理的输入是.c文件,输出是.i文件
命令:gcc -E 源文件 -o 目标文件
◆编译
本阶段是对代码得规范性,语法得正确性进行检查,并编译成汇编语言。编译常用的选项是-S,它的作用是告诉编译器,当编译结束时,停止编译。
编译的输入是.i文件,输出是.s文件
命令:gcc -S源文件 -o 目标文件
◆汇编
本阶段是将汇编语言翻译成目标文件,汇编常用的选项是-c,它的作用是告诉编译器,当汇编阶段结束时停止编译
汇编的输入是.s文件,输出是.o文件
命令:gcc -c 源文件 -o 目标文件
◆链接
本阶段是将所有的目标文件以及相应的库文件编译成可执行文件,链接并不需要选项,只需要制定生成的可执行文件名。
链接的输入是.o文件,输出是可执行文件
命令:gcc 源文件 -o 目标文件
4、GCC命令分类
GCC有12类选项,分别是总体选项、语言选项、预处理选项、汇编器选项、链接器选项、目录选项、警告选项、调试选项、优化选项、目标选项、机器相关选项、代码生成选项。
◆总体选项
总体选项是GCC中最常用的选项
参数名 | 意义 |
-E | 只进行预处理 |
-c | 将源文件生成目标文件 |
-S | 生成汇编文件 |
-o outfile | 输出的结果放到outfile文件中 |
-g | 在可执行程序中添加调试代码 |
-v | 打印出编译器编译过程中的信息 |
-static | 静态链接库 |
-llibrary | 链接名为library得库文件 |
◆目录选项
目录选项用于搜索编译时头文件、库文件或者编译器其他参数得路径
参数名 | 意义 |
-I dir | 用于添加头文件查找目录 |
-L dir | 用于添加库文件查找目录 |
-B prefix | 在何处寻找可执行文件、编译器自己得数据文件 |
◆警告选项
警告选项用于显示程序在编译时的警告信息
参数名 | 意义 |
-ansi | 支持符合ANSI标准的所有C程序 |
-w | 关闭所有警告 |
-wall | 允许发出所有有用的警告信息 |
werror | 把所有得警告转换成错误信息,并在出现错误时终止编译 |
-pedanti | 允许发出所有标准C程序得警告信息 |
-pedanti c080 -erroc | 允许发出所有标准C程序得警告信息 |
◆调试选项
调试选项用于用户程序得调试
参数名 | 意义 |
-g | 产生调试信息,GDB能使用这些调试信息 |
-ggdb | 以本地格式输出调试信息,是GDB的扩展 |
-gstabs | 以stabs方式输出调试信息 |
-gstabls+ | 以stabs方式输出调试信息,不过只有GDB能够读取这些信息 |
-gcoff | 以coff格式输出调试信息 |
-gxcoff | 以xcoff格式输出调试信息 |
◆优化选项
优化选项用于GCC对可执行代码进行优化操作,通常会用到得是O、O0、O1、O2|、O3五种优化方式,通常O后面得数字代表优化的效果,数字越大,优化的内容就越多。
【注意】这里得优化是指编译时的优化,有时候为了实现程序的高效率执行,需要在程序代码上做代码级的优化。
Gcc -o hello1 hello.c -O1
Gcc -o hello2 hello.c -O2
Gcc -o hello hello.c -O
Gcc -o hello0 hello.c -O0
Gcc -o hello3 hello.c -O3
GDB使用
GDB是GNU组织在Linux系统中发布的程序调试器,它功能强大,使用方便,已经成为Linux系统中C/C++程序调试的必备工具。
1、 GDB命令
GDB是Linux系统上的一款强有力的调试工具,它能够帮助开发者观察程序运行时的内部结构和内存的使用状态。
一般说来,GDB能够完成4个方面的工作:
● 调试程序:支持程序代码级调试,可以一行一行地执行程序代码
● 动态断点设置:可以动态设置断点,设置设置条件表达式,并自定义程序停止或运行
● 检查运行状态:提供丰富的检查机制,能够查看变量,内存等感兴趣资源的使用状况
● 执行环境动态改变:支持动态改变程序的执行环境
1、 GDB的启动
GDB有两种加载被调试程序的方式:一种是在启动时输入gdb filename,可以自动加载被调试文件,另一种是在启动GDB后输入file filename,其中file是GDB内置命令,用于指明要加载的调试文件。
在使用GDB时,要注意一点是,被调试的可执行程序在编译时,一定要打开-g选项,不然没有办法使用GDB。另外GDB中执行调试的命令是run,即成功加载被调试文件后,输入run才可以在GDB中执行被调试的可执行文件。
2、 GDB的退出
退出GDB的命令是quit,输入quit后即可退出GDB,有时候可能需要只终止被调试的可执行程序,这时候可以输入kill命令,kill的意义是终止当前正在调试的程序。
2、 GDB命令的分类
GDB的命令可分为5类,运行环境设置与查看、断点设置与恢复、源码查看、程序数据查看和运行参数设置。
1、 运行环境设置与查看
运行环境设置与查看包括在GDB中设置环境变量、查看环境变量、设置程序的运行路径、查看已设的路径、设置工作目录、查看工作目录、shell命令等。
命令名 | 意义 |
set environment var[=value] | 设置环境变量,其中var是环境变量名,value为变量的值 |
Show environment[var] | 查看环境变量 |
Path dirpath | 设置程序的运行路径,其中dirpath为运行路径名 |
Show path | 查看程序运行路径 |
Cd dir | 设置工作目录,其中dir为工作目录名 |
Pwd | 查看工作目录 |
Shell command | 支持shell命令,其中command为命令名 |
断点设置与恢复是程序调试中最频繁的操作,GDB中提供了丰富的断点设置与恢复的调试命令。
参数名 | 意义 |
Break[断点名] | 设置断点,断点名可以是行号、函数名,甚至是条件表达式 |
Tbreak[断点名] | 与break类似,采用此种方式设置断点,断点执行后,会自动取消该断点 |
Step/F11 | 单步执行,若有函数调用,会进入函数内部 |
Next/F10 | 但不运行,若有函数调用,不会进入函数内部 |
Continue | 继续运行,直至下一个断点或程序结束 |
Finish | 运行程序,直至当前函数完成,并打印函数返回时堆栈地址、返回值及参数值等信息 |
Delete[断点名] | 删除指定断点 |
Disable[断点名] | 停止指定断点 |
Enable[断点名] | 恢复指定被disable停止的断点 |
Clear | 清除所有断点,若有delete不使用参数,可达到同样效果 |
Ignore[断点名] | 对指定的断点忽略n次 |
Condition[断点 名]<条件表达式> | 为指定的断点修改条件表达式 |
| |
参数名 | 意义 |
List [var] | 列出当前源码,var可以是行号,也可以是函数名 |
Info line | 查看GDB中加载到内存中的源码 |
Forware-search | 正则表达式,从当前位置向前搜索满足条件的源代码 |
Reverse-search | 正则表达式,从当前位置向后搜索满足条件的源代码 |
程序数据查看参数名 | 意义 |
Print[var] | 输出表达式或变量的值 |
X[n/f/u] | 输出内存变量的数据,其中n:长度,f:格式,u:从当前位置向后的长度 |
Watch[var] | 为变量var设置观察点,若变量值有变化,则停止程序 |
Rwatch[var] | 为变量var设置观察点,当变量的值被读取时,停止程序 |
Awatch[var] | 为变量var设置观察点,当前的值被修改时,停止程序 |
Info watchpoints | 显示所有观察点 |
Display[var] | 显示表达式或变量的值 |
运行参数设置是指在程序运行时,设置相应变量的值,它的基本设置命令是set。
参数名 | 意义 |
Set args 值1... | 指定程序运行时的参数以及值 |
Show args | 显示运行参数值 |
Set var=value | 为程序中指定的变量设置值 |
相关文章推荐
- gcc gdb
- vim+gcc+gdb
- notepad++构建编译器调试器。vs自带编译器和gcc,gdb两个版本。
- 学习如何使用命令安装gcc/g++, gdb, vim
- Linux程序设计基础(gcc、makefile、gdb)
- Solaris10安装gcc和gdb
- gcc和gdb简单命令总结
- gcc和gdb使用手册
- 用 gdb 调试 GCC 程序
- Redhat(linux)GDB与GCC版本兼容问题
- gcc和gdb使用笔记
- ubuntu12.04安装gcc、gdb和arm-Linux-gcc4.4.3
- GCC,GDB,Makefile
- 实例学习gcc+gdb+make
- LINUX下的C编程实战之gcc/gdb/make
- linux笔记(gcc及gdb调试)
- gcc,gdb,makefile
- vim中文手册,gcc中文手册,gdb中文手册打包赠送
- Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)
- 实例学习gcc+gdb+make