您的位置:首页 > 运维架构 > Linux

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能够支持多种文件后缀的编译
后缀名
意义
.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为命令名
2、 断点设置与恢复
断点设置与恢复是程序调试中最频繁的操作,GDB中提供了丰富的断点设置与恢复的调试命令。
参数名
意义
Break[断点名]
设置断点,断点名可以是行号、函数名,甚至是条件表达式
Tbreak[断点名]
与break类似,采用此种方式设置断点,断点执行后,会自动取消该断点
Step/F11
单步执行,若有函数调用,会进入函数内部
Next/F10
但不运行,若有函数调用,不会进入函数内部
Continue
继续运行,直至下一个断点或程序结束
Finish
运行程序,直至当前函数完成,并打印函数返回时堆栈地址、返回值及参数值等信息
Delete[断点名]
删除指定断点
Disable[断点名]
停止指定断点
Enable[断点名]
恢复指定被disable停止的断点
Clear
清除所有断点,若有delete不使用参数,可达到同样效果
Ignore[断点名]

对指定的断点忽略n次
Condition[断点
名]<条件表达式>
为指定的断点修改条件表达式
 
 
3、 源码查看
参数名
意义
List [var]
列出当前源码,var可以是行号,也可以是函数名
Info line
查看GDB中加载到内存中的源码
Forware-search
正则表达式,从当前位置向前搜索满足条件的源代码
Reverse-search
正则表达式,从当前位置向后搜索满足条件的源代码
4、 
程序数据查看参数名
意义
Print[var]
输出表达式或变量的值
X[n/f/u]
输出内存变量的数据,其中n:长度,f:格式,u:从当前位置向后的长度
Watch[var]
为变量var设置观察点,若变量值有变化,则停止程序
Rwatch[var]
为变量var设置观察点,当变量的值被读取时,停止程序
Awatch[var]
为变量var设置观察点,当前的值被修改时,停止程序
Info watchpoints
显示所有观察点
Display[var]
显示表达式或变量的值
5、 运行参数设置时
运行参数设置是指在程序运行时,设置相应变量的值,它的基本设置命令是set。
参数名
意义
Set args 值1...
指定程序运行时的参数以及值
Show args
显示运行参数值
Set var=value
为程序中指定的变量设置值
 
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux gcc gdb