gcc调试总结
gcc 编译器命令总结
gcc 编译器命令总结1. 三种常用格式i.gcc C源文件-o 目标文件名。
ii.gcc -o 目标文件名C源文件。
iii.gcc C源文件。
(目标文件名默认为:a.out)2. gcc 支持的一些源文件的后缀.c C语言源代码文件。
.a 是由目标文件构成的档案库文件。
.C .cc 或.cxx 是C++ 源代码文件。
.h 是程序所包含的头文件。
.i 是已经预处理过的C源代码文件。
.ii 是已经预处理的C++源代码文件。
.m 是Objective-C源代码文件。
.o 是编译后的目标文件。
.s 是汇编语言源代码文件。
.S 是经过预处理的汇编语言源代码文件。
3.gcc 常用参数-c 只激活预处理,编译和汇编,也就是只把程序做成obj文件。
-S 只激活预处理和编译,就是把文件编译成汇编代码。
-E 只激活预处理,不生成文件,需要把它重定向到一个输出文件里面。
-g 在可执行文件中包含调试信息。
-v 显示gcc 版本信息。
-o file 把输出文件输出到文件中。
-I dir 在头文件的搜索路径中添加dir 目录。
-L dir 在库文件的搜索路径列表中添加dir目录。
-static 链接静态库。
-library 连接名为library的库文件。
4.例子实质上,上述编译过程是分为四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和连接(Linking)。
4.1 示例程序如下:#include <stdio.h>int main(void){printf("Hello World!\n");return 0;}这个程序,一步到位的编译指令是:gcc test.c -o test该命令结束后,在文件目下生成(可执行文件)test通过./test 可运行本程序。
4.2 预处理gcc -E test.c -o test.i 或gcc -E test.c可以输出test.i文件中存放着test.c经预处理之后的代码。
gcc 调试手段
gcc 调试手段
GCC提供了多种调试手段,帮助开发者定位和修复程序中的问题。
以下是一些常用的GCC调试手段:
1. 编译时加入调试信息:在编译源代码时,通过在GCC命令行中添加`-g`选项,可以生成带有调试信息的可执行文件。
这些调试信息包括源代码行号、局部变量和函数等信息,有助于在调试时更好地理解程序的执行状态。
2. 使用gdb进行调试:GCC编译的可执行文件可以使用GNU Debugger(gdb)进行调试。
通过gdb,可以设置断点、单步执行、查看变量值等操作,帮助定位问题。
在命令行中输入`gdb`命令,然后输入`run`命令即可启动程序进行调试。
3. 打印调试信息:在程序中添加打印语句是一种简单直接的调试方法。
通过打印关键变量的值、函数调用的结果等信息,可以帮助理解程序的执行流程和状态。
4. 内存检查工具:对于C/C++程序,可以使用诸如Valgrind这样的内存检查工具来检测内存泄漏、数组越界等问题。
这些工具可以帮助发现潜在的内存问题,提高程序的稳定性。
5. 日志记录:在程序中添加日志记录功能,将关键信息输出到日志文件中。
这种方法适用于跟踪程序的运行状态和异常情况,有助于定位问题。
6. 单元测试和集成测试:编写单元测试和集成测试用例,对程
序的各个模块进行测试。
通过测试用例的执行和结果分析,可以发现潜在的缺陷和问题。
这些是GCC提供的一些常用调试手段,根据具体情况选择适合的方法进行程序调试,有助于提高代码质量和开发效率。
GCC的几个重要选项解释
GCC的几个重要选项解释GCC的几个重要选项解释详细可见:[GNU Compiler Collection (GCC)]Option-Summary.html-c 编译或者汇编代码,但是不链接-S 在编译之后停止,但不汇编-E 预处理后停止,但不编译-o 指定输出文件的名称-v 显示编译的每个阶段使用的命令-std 指定要用的语言标准-g 产生调试信息-pg 产生额外信息,被gprof用来做profilling-O 优化可执行代码-W 设置编译器的警报级别-pedantic以ANSI/ISO C标准列出的所有警告,不符合该语言标准的地方将产生相应的警告信息-I 指定文件包含的目录-L 指定库目录(编译时的库搜索目录)-D 预定义在源代码中出现的宏-U 取消所有定义的宏-f 指定用来控制编译器行为的选项-m 指定与硬件相关的选项GCC相关信息查看-help 显示此帮助说明-target-help 显示目标机器特定的命令行选项-help={target|optimizers|warnings|params|[^]{joined|separate|un documented}}[,...]显示特定类型的命令行选项(使用‘-v --help’显示子进程的命令行参数)-version 显示编译器版本信息-dumpspecs 显示所有内建 spec 字符串-dumpversion 显示编译器的版本号-dumpmachine 显示编译器的目标处理器-print-search-dirs 显示编译器的搜索路径-print-libgcc-file-name 显示编译器伴随库的名称-print-file-name=<库> 显示 <库> 的完整路径-print-prog-name=<程序> 显示编译器组件 <程序> 的完整路径-print-multi-directory 显示不同版本 libgcc 的根目录-print-multi-lib 显示命令行选项和多个版本库搜索路径间的映射-print-multi-os-directory 显示操作系统库的相对路径-print-sysroot 显示目标库目录-print-sysroot-headers-suffix 显示用于寻找头文件的sysroot 后缀目前了解的GCC相关具体选项-fpic用于生成位置无关代码,位置无关码的作用:1、程序在运行期间动态加载到内存中;2、程序在不同场合与不同程序组合后加载到内存(一般用于动态链接库)3、在运行期间不同地址相互之间的映射;(如bootloader)简言之,位置无关码就是可以在进程的任意内存位置执行的目标码,动态链接库必须使用。
gcc命令的参数
gcc命令的参数一、介绍GCC(GNU Compiler Collection)是一套广泛使用的编译器工具集,用于编译C、C++、Objective-C、Fortran等多种程序语言。
GCC命令的参数是指在使用GCC编译器时可以添加的选项和参数,通过这些参数可以对编译过程进行控制和定制,以满足不同的需求。
本文将详细介绍GCC命令的参数及其使用方法。
二、常用参数1. -o <file>指定输出文件的名称。
例如,gcc main.c -o main将编译main.c文件并输出可执行文件main。
2. -c只进行编译,不进行链接。
使用该参数可以将源代码编译为目标文件(.o文件),而不生成可执行文件。
3. -E只进行预处理,生成预处理后的代码。
该参数可用于查看预处理后的代码,以便调试和分析。
4. -g生成调试信息。
使用该参数可以在编译过程中生成调试信息,以便在调试程序时进行源代码级别的调试。
5. -Wall打开所有警告信息。
使用该参数可以让编译器输出所有可能的警告信息,帮助开发者发现潜在的问题。
6. -O优化选项。
GCC提供了多个优化选项,例如-O1、-O2、-O3等,可以根据需求选择不同级别的优化。
7. -I <dir>添加头文件搜索路径。
使用该参数可以告诉编译器在指定的目录中搜索头文件。
添加库文件搜索路径。
使用该参数可以告诉编译器在指定的目录中搜索库文件。
9. -l <library>链接指定的库文件。
使用该参数可以告诉编译器链接指定的库文件,例如-lm表示链接数学库。
10. -D <macro>定义宏。
使用该参数可以在编译过程中定义宏,以控制源代码中的条件编译。
三、高级参数1. -Werror将警告视为错误。
使用该参数可以将编译过程中的警告信息视为错误,编译过程将被中断。
2. -std=<standard>指定所使用的语言标准。
GCC支持多个语言标准,例如-std=c11表示使用C11标准。
gdb调试命令的使用及总结
gdb调试命令的使用及总结
gdb是一个功能强大的调试器,用于调试C、C++等编程语言的程序。
它提供了许多命令和功能,可以帮助开发人员诊断和修复程序中的错误。
下面我将从使用和总结两个方面来回答你的问题。
首先是gdb的使用。
要使用gdb调试程序,首先需要在编译时包含调试信息。
这意味着在使用gcc或g++编译程序时,需要添加`-g`选项。
例如:
gcc -g -o program program.c.
然后可以使用以下命令启动gdb并加载程序:
gdb program.
一旦进入gdb,可以使用一系列命令来控制程序的执行和检查程序状态。
例如,可以使用`run`命令来运行程序,`break`命令来设置断点,`step`和`next`命令来逐行执行程序等等。
此外,还可以使用`print`命令来打印变量的值,`backtrace`命令来查看函数调用栈等等。
现在来总结一下gdb的使用。
gdb是一个非常强大的调试工具,它可以帮助开发人员快速定位和修复程序中的错误。
通过设置断点、逐行执行程序、查看变量的值等操作,开发人员可以深入了解程序
的执行过程,找出其中的问题。
此外,gdb还提供了丰富的文档和
在线帮助,可以帮助开发人员更好地利用它的功能。
总的来说,gdb是一个非常有用的调试工具,它可以帮助开发
人员提高程序调试的效率和准确性。
通过学习和熟练掌握gdb的使用,开发人员可以更快地修复程序中的错误,提高自己的编程水平。
希望这个回答能够帮助你更好地了解gdb的使用和功能。
GCC(警告.优化以及调试选项)
GCC(警告.优化以及调试选项)[介绍]gcc and g 分别是gnu的c & c 编译器gcc/g 在执行编译工作的时候,总共需要4步1.预处理,生成.i的文件预处理器cpp2.将预处理后的文件不转换成汇编语言,生成文件.s编译器egcs3.有汇编变为目标代码(机器代码)生成.o的文件汇编器as4.连接目标代码,生成可执行程序连接器ld1.总体选项-E只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.例子用法:gcc -E hello.c > pianoapan.txtgcc -E hello.c | more慢慢看吧,一个hello word 也要与处理成800行的代码-S只激活预处理和编译,就是指把文件编译成为汇编代码。
例子用法gcc -S hello.c他将生成.s的汇编代码,你可以用文本编辑器察看-c只激活预处理,编译,和汇编,也就是他只把程序做成obj文件例子用法:gcc -c hello.c他将生成.o的obj文件2.目录选项-Idir在你是用#include'file'的时候,gcc/g 会先在当前目录查找你所制定的头文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他回先在你所制定的目录查找,然后再按常规的顺序去找.对于#include,gcc/g 会到-I制定的目录查找,查找不到,然后将到系统的缺省的头文件目录查找-include file-i相当于“#include”包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设定,功能就相当于在代码中使用#include例子用法:gcc hello.c -include /root/pianopan.h-I-就是取消前一个参数的功能,所以一般在-Idir之后使用-idirafter dir在-I的目录里面查找失败,讲到这个目录里面查找.-iprefix prefix-iwithprefix dir一般一起使用,当-I的目录查找失败,会到prefix dir下查找-Ldir制定编译的时候,搜索库的路径。
GCC快速入门(三)——GCC调试和优化技巧
p : 告 诉 GCC 序 里 加 gi  ̄项 程 2 应 用 实 例 . 下 面 通过 一 个 具 体 的实 例 说 明 如 何 利 用 调 试 符 号 来 分 析 错 误 ,所 用 程 序 d b g e u me C如 下 .
入 额 外 的 代 码 ,执 行 时 ,产 生 g r f 的剖 析 信 息 ,以 显示 程 po用 序 的耗 时 情 况 。
G C调试和优化 技巧 C
■ 曾 江 华
G C调 试 常 用 选 项 C
GCC支 持 数 种 调 试 和 剖 析 选 项 , 这 些 选 项里 经 常 会用 到 的 在
是 一g和 P g选 项 。
一
惟 一 的 办法 就是 添 加 大量 的语 句 来产 生 特 定 的输 出 。 GDB的 出 现 减 轻 了 开 发 人 员 的 负 担 ,他 们 可 以在 程 序 运 行 的 时 候 单 步 跟 踪 自 己 的 代 码 ,或 者 通 过 断 点 暂 时 中 止 程 序 的 执 行 ,还 能 够 随 时 察 看 变 量 和 内 存 的 当 前 状 态 ,并 监 视 关 键 的数 据结 构 是如 何 影响 代 码 运行的。 GDB提 供 了 下 列 功 能 : ◆监 视 程 序 中变 量 的值 t ◆设 置 断 点 ,使 程序 在 指 定 的代 码 行上 停 止 执 行 t ◆ 可 以一 行 行地 执 行 代 码 t ◆ 动 态 地 改 变 程 序 的 执 行 环境 。
行 编译 ,同时 产 生调 试符 号 :
# gc -g e  ̄ T e. -0 c d b n C
d b q e e  ̄ n
使 用 G B调 试 程 序 D
1G . DB基 础 G C C 组 件 包 含 了 一 个 叫
gcc常用参数(静动态链接 优化 调试)
一、编译过程概览gcc编译器对程序的编译过程有四个阶段:预处理(preprocessing)、编译(com- pilation proper)、汇编(assembly)和链接(linking)。
预处理:对源文件(source file)进行预处理,进行宏定义的替换等。
编译:将进行完预处理的源文件编译成汇编文件(assembly file)。
将C源代码编译成汇编语言。
汇编:将汇编文件汇编成目标文件(object file)。
链接:将一个或多个目标文件链接成一个可执行的二进制文件(execute file)。
链接的目标文件中有且只有一个main函数,作为可执行文件的开始。
-E在预处理阶段之后停止,不进行编译。
输出是预处理之后的源码,默认发送到标准输出(standard output)。
输入文件格式为.c等,默认输出为标准输出。
-S在编译阶段之后停止,不进行汇编。
输出为每一个指定的未编译的输入文件的汇编代码文件。
输入文件格式为.c、.i等,输出文件格式为.s。
-c编译或者汇编源文件,不进行链接。
输出为每一个源文件的目标文件。
输入文件格式为.c、.i、.s,输出文件格式为.o。
-o filename-o指定输出文件的文件名,如果没有指定-o,则默认输出的可执行文件名是a.out,默认输出的source.suffix的汇编文件名为source.s、目标文件名位source.o。
默认的预处理后的源文件输出到标准输出。
main.cgcc –E main.c –o main.itali main.igcc –S main.i –o main.stail main.sps:gcc –S main.c –o main.s也是可以的。
gcc –c main.s –o main.ogcc main.o –o test./testps:gcc –c main.i(main.c) –o main.ogcc main.c(main.i main.s) –o test都是可以的二、预处理预处理阶段可以用到的一些选项。
GCC常用命令详解
GCC常⽤命令详解GCC(GNU Compiler Collection)是Linux下最常⽤的C语⾔编译器,是GNU项⽬中符合ANSI C标准的编译系统,能够编译⽤C、C++和Object C等语⾔编写的程序。
同时它可以通过不同的前端模块来⽀持各种语⾔,如Java、Fortran、Pascal、Modula-3和Ada等。
穿插⼀个玩笑: GNU意思是GNU’s not Unix⽽⾮⾓马。
然⽽GNU还是⼀个未拆分的连词,这其实是⼀个源于hacker的幽默:GNU是⼀个回⽂游戏,第⼀个字母G是凑数的,你当然可以叫他做ANU或者BNU。
下⾯开始。
⼀.CC编译程序过程分四个阶段◆预处理(Pre-Processing)◆编译(Compiling)◆汇编(Assembling)◆链接(Linking)Linux程序员可以根据⾃⼰的需要让GCC在编译的任何阶段结束转去检查或使⽤编译器在该阶段的输出信息,或者对最后⽣成的⼆进制⽂件进⾏控制,以便通过加⼊不同数量和种类的调试代码来为今后的调试做好准备。
如同其他的编译器,GCC也提供了灵活⽽强⼤的代码优化功能,利⽤它可以⽣成执⾏效率更⾼的代码。
GCC提供了30多条警告信息和三个警告级别,使⽤它们有助于增强程序的稳定性和可移植性。
此外,GCC还对标准的C和C++语⾔进⾏了⼤量的扩展,提⾼程序的执⾏效率,有助于编译器进⾏代码优化,能够减轻编程的⼯作量。
⼆.简单编译命令我们以Hello world程序来开始我们的学习。
代码如下:/* hello.c */#include <stdio.h>int main(void){printf ("Hello world!\n");return 0;}1. 执⾏如下命令:$ gcc -o hello hello.c运⾏如下: $ ./hello输出: Hello,world!2. 我们也可以分步编译如下:(1) $ gcc –E hello.c -o hello.i//预处理结束//这时候你看⼀下hello.i ,可以看到插进去了很多东西。
gcc报告解读 -回复
gcc报告解读-回复GCC(GNU C Compiler)是一种开源的C语言编译器,被广泛用于编译C语言程序。
本文将重点解读GCC编译器的报告,包括其生成的常见信息、报告的内容和作用,以及如何解读报告中的警告和错误信息。
一、报告的生成和常见信息1. 编译过程中,GCC编译器会生成一个报告,其中包含了编译过程的详细信息。
该报告通常保存在默认的文件名为“filename.gcc”的文件中。
2. 报告中包含了许多常见信息,例如编译器的版本、编译选项、目标平台等。
这些信息对于开发者来说非常重要,它们可以帮助开发者了解编译器的配置以及编译环境的设置。
3. 报告中还包含了生成的中间代码(Intermediate Code),这是编译过程中生成的一种类似于汇编语言的中间表示形式。
中间代码是将源代码转化为目标代码的过程中的一个中间步骤,它可以方便开发者进行调试和优化。
二、报告的内容和作用1. 报告中的内容主要包括三个部分:编译器的配置信息,源代码的统计信息和警告/错误信息。
2. 编译器的配置信息可以告诉开发者使用的编译器版本、编译选项和目标平台等相关信息,开发者可以根据这些信息对代码进行进一步的优化和调整。
3. 源代码的统计信息包括代码行数、函数个数、变量个数等。
这些统计信息可以帮助开发者了解代码的规模和复杂度,进而对代码进行优化和重构。
4. 警告/错误信息是报告中最重要的部分。
GCC编译器会对源代码进行静态分析,检测出潜在的问题,并生成相应的警告或错误信息。
开发者可以根据这些信息来修复代码中的问题,以保证程序的正确性和性能。
三、解读报告中的警告和错误信息1. 警告信息(Warnings)是指编译器对代码中的潜在问题发出的警告信号。
这些问题可能不会导致程序错误,但有可能会影响程序的正确性或性能。
需要注意的是,虽然警告信息并不是错误,但也不应该被忽略,开发者应该根据警告信息来进行代码修正,以避免潜在的问题。
2. 错误信息(Errors)是指编译器在编译过程中发现的无法继续编译的问题。
gcc参数详解
gcc参数详解GCC是一款广泛使用的编译器,它是GNU编译器套件(GNU Compiler Collection)的一部分。
GCC是一个功能强大且灵活的编译器,特别适用于C、C++和其他编程语言的开发。
下面是对一些常用的GCC参数进行详细讲解:1. -o <filename>:用于指定输出文件的名称。
例如,使用"-o myprogram"将生成名为"myprogram"的可执行文件。
2. -c:表示将源代码编译成目标文件,而不进行链接操作。
这对于分阶段编译和构建大型工程非常有用。
3. -g:生成调试信息。
在编译和链接过程中,使用-g参数可以在生成的可执行文件中包含用于调试的符号表和调试信息。
这些信息对于调试和追踪代码错误非常有帮助。
4. -Wall:开启所有警告信息。
使用-Wall参数可以启用所有警告选项,帮助开发人员发现潜在的问题和错误。
5. -Werror:将所有警告视为错误。
通过使用-Werror参数,所有警告将被视为编译错误,进而阻止生成可执行文件。
6. -O<level>:进行优化处理。
GCC提供了多个级别的优化选项,例如-O0表示不进行优化,-O1表示基本优化,-O2表示更高级别的优化,-O3表示最高级别的优化。
使用优化选项可以提高程序的性能和执行速度。
7. -I <directory>:添加头文件搜索路径。
使用-I参数可以指定需要搜索的额外头文件目录,这在项目中包含多个目录结构时非常有用。
8. -L <directory>:添加库文件搜索路径。
使用-L参数可以指定额外的库文件搜索路径,这对于链接外部库非常有用。
9. -l<library>:链接外部库文件。
使用-l参数可以链接指定的库文件,其中库文件名称可以省略前缀"lib"和文件扩展名,例如-lm表示链接数学库。
GCC优化级别以及GDB调试级别
GCC优化级别以及GDB调试级别GCC -O选项这个选项控制所有的优化等级。
使用优化选项会使编译过程耗费更多的时间,并且占用更多的内存,尤其是在提高优化等级的时候。
-O设置一共有五种:-O0、-O1、-O2、-O3和-Os。
你只能在/etc/make.conf里面设置其中的一种。
除了-O0以外,每一个-O设置都会多启用几个选项,请查阅gcc 手册的优化选项章节,以便了解每个-O等级启用了哪些选项及它们有何作用。
让我们来逐一考察各个优化等级:-O0:这个等级(字母“O”后面跟个零)关闭所有优化选项,也是CFLAGS或CXXFLAGS中没有设置-O等级时的默认等级。
这样就不会优化代码,这通常不是我们想要的。
-O1:这是最基本的优化等级。
编译器会在不花费太多编译时间的同时试图生成更快更小的代码。
这些优化是非常基础的,但一般这些任务肯定能顺利完成。
-O2:-O1的进阶。
这是推荐的优化等级,除非你有特殊的需求。
-O2会比-O1启用多一些标记。
设置了-O2后,编译器会试图提高代码性能而不会增大体积和大量占用的编译时间。
-O3:这是最高最危险的优化等级。
用这个选项会延长编译代码的时间,并且在使用gcc4.x的系统里不应全局启用。
自从3.x版本以来gcc的行为已经有了极大地改变。
在3.x,-O3生成的代码也只是比-O2快一点点而已,而gcc4.x中还未必更快。
用-O3来编译所有的软件包将产生更大体积更耗内存的二进制文件,大大增加编译失败的机会或不可预知的程序行为(包括错误)。
这样做将得不偿失,记住过犹不及。
在gcc 4.x.中使用-O3是不推荐的。
-Os:这个等级用来优化代码尺寸。
其中启用了-O2中不会增加磁盘空间占用的代码生成选项。
这对于磁盘空间极其紧张或者CPU缓存较小的机器非常有用。
但也可能产生些许问题,因此软件树中的大部分ebuild都过滤掉这个等级的优化。
使用-Os是不推荐的。
GDB(GNU Debugger)是GCC的调试工具。
GCC参数与使用详解
GCC参数与使用详解1.编译参数GCC提供了一系列用于控制编译过程的参数,以下是一些常用的参数:-`-c`:只编译源文件,生成目标文件,不进行链接。
- `-o <output>`:指定编译结果的输出文件名。
-`-g`:生成调试信息,用于调试程序。
-`-O0`、`-O1`、`-O2`、`-O3`:控制优化级别,O0代表不优化,O1到O3代表递增的优化级别,O3是最高级别的优化。
- `-I <include_path>`:指定头文件的路径。
- `-D <macro>`:定义预处理宏。
- `-U <macro>`:取消预定义的宏定义。
- `-W<warning>`:控制警告信息的输出,可以使用-W开启指定的警告(例如-Wall)、-Werror将警告视为错误等。
2.链接参数在编译过程中,GCC还需要进行链接操作,以下是一些常用的链接参数:- `-L <library_path>`:指定库文件的路径。
- `-l <library>`:链接指定的动态库或静态库。
- `-shared`:生成共享库。
- `-rpath=<library_path>`:设置程序运行时动态库的路径。
- `-Wl,<option>`:将<option>传递给链接器,可以用来设置链接器的参数。
- `-static`:生成静态链接的可执行文件。
3.调试参数GCC提供了一些调试相关的参数,帮助开发者进行程序调试:-`-g`:生成调试信息,用于调试程序。
- `-ggdb`:生成GDB所需的调试信息。
-`-Og`:生成适合进行调试的优化级别。
-`-dA`:指定以AT&T汇编语法显示调试信息。
- `-dB`:指定以Intel汇编语法显示调试信息。
4.优化参数GCC提供了许多用于优化程序性能的参数,以下是一些常用的优化参数:-`-O0`、`-O1`、`-O2`、`-O3`:控制优化级别,O0代表不优化,O1到O3代表递增的优化级别,O3是最高级别的优化。
《Linux网络操作系统》课件——项目九--使用gcc和make-调试程序
16
2.进行程序的编译与链接(Link)
(1)开始将源码编译成为可执行的 binary file。[root@RHEL7-2 ~]# gcc -c thanks.c thanks_2.c[root@RHEL7-2 ~]# ll thanks*-rw-r--r--. 1 root root 76 Jul 15 21:27 thanks_2.c-rw-r--r--. 1 root root 1504 Jul 15 21:27 thanks_2.o <==编译生成的目标文件!-rw-r--r--. 1 root root 91 Jul 15 21:25 thanks.c-rw-r--r--. 1 root root 1560 Jul 15 21:27 thanks.o <==编译生成的目标文件![root@RHEL7-2 ~]# gcc -o thanks thanks.o thanks_2.o[root@RHEL7-2 ~]# ll thanks*-rwxr-xr-x. 1 root root 8584 Jul 15 21:28 thanks <==最终结果会生成可执行文件(2)执行可执行文件。[root@RHEL7-2 ~]# ./thanksHello WorldThank you!
7
2.安装GCC
(1)检查是否安装GCC。[root@RHEL7-2 ~]# rpm -qa|grep gcccompat-libgcc-296-2.96-138libgcc-4.1.2-46.el5gcc-4.1.2-46.el5gcc-c++-4.1.2-46.el5上述结果表示已经安装了GCC。(2)如果系统还没有安装GCC软件包,我们可以使用yum命令安装所需软件包。① 挂载ISO安装镜像://挂载光盘到 /iso下,前面项目3已建立/iso文件夹,并且yum源已经配置好 [root@RHEL7-2 ~]# mount /dev/cdrom /iso② 制作用于安装的yum源文件(后面不再赘述):
C语言技术中的调试工具推荐与使用技巧
C语言技术中的调试工具推荐与使用技巧在C语言的开发过程中,调试是一个非常重要的环节。
通过调试,我们可以发现代码中的错误并进行修复,提高程序的稳定性和性能。
而为了更高效地进行调试工作,我们需要使用一些专门的调试工具。
本文将推荐几款常用的C语言调试工具,并分享一些使用技巧。
一、GDB调试工具GDB是GNU开源项目中的调试工具,被广泛应用于C语言的调试中。
它提供了一系列强大的功能,如断点设置、变量查看、堆栈追踪等。
使用GDB进行调试时,我们可以通过命令行界面与其进行交互,也可以使用GUI界面进行操作。
以下是几个常用的GDB命令:1. 设置断点:可以使用“break”命令在代码的某一行设置断点,当程序执行到该断点时会暂停。
例如,“break main”可以在main函数的入口处设置断点。
2. 查看变量:使用“print”命令可以查看变量的值。
例如,“print x”可以查看变量x的值。
3. 单步执行:使用“step”命令可以逐行执行代码,并进入函数内部。
例如,“step”可以进入函数的第一行。
除了这些基本命令外,GDB还提供了许多其他功能,如条件断点、内存查看等。
通过熟练掌握GDB的使用技巧,我们可以更快速地定位和解决问题。
二、Valgrind内存调试工具在C语言开发中,内存泄漏是一个常见的问题。
为了解决这个问题,我们可以使用Valgrind这个强大的内存调试工具。
Valgrind可以检测程序中的内存错误、访问越界、使用未初始化的变量等问题,并给出相应的报告。
使用Valgrind进行内存调试时,我们可以使用以下命令:1. 检测内存错误:使用“valgrind --leak-check=full ./program”命令可以检测程序中的内存错误,并给出详细的报告。
2. 检测访问越界:使用“valgrind --tool=memcheck --track-origins=yes ./program”命令可以检测程序中的访问越界问题,并追踪到具体的源头。
linux开发工具的使用gcc实验总结简短
linux开发工具的使用gcc实验总结简短在Linux开发中,GCC是一个广泛应用的编译器套件,为程序员提供了丰富的工具和功能,方便进行开发和调试。
本文将为大家总结一下使用GCC进行实验的经验与技巧。
一、安装GCC在开始使用GCC之前,首先需要安装GCC编译器。
在大多数Linux发行版中,GCC已经预安装,可以直接使用。
如果没有安装,可以通过包管理器进行安装,例如在Ubuntu上可以使用以下命令进行安装:```sudo apt-get install gcc```二、编写和编译源代码1. 创建源代码文件使用任意文本编辑器,创建一个以.c为扩展名的源代码文件,例如hello.c。
2. 编写源代码在源代码文件中,可以使用C语言来编写程序。
下面是一个简单的示例代码:```c#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}```3. 编译源代码打开终端,进入源代码所在的目录,使用以下命令进行编译:```gcc hello.c -o hello```其中,`hello.c`是源代码文件的名称,`hello`是生成的可执行文件的名称。
通过`-o`选项指定输出文件名。
三、运行和调试程序1. 运行程序编译成功后,可以直接运行生成的可执行文件。
在终端输入以下命令运行程序:```./hello```程序将会输出`Hello, World!`。
2. 调试程序GCC也提供了强大的调试功能,方便程序员进行调试和排错。
可以通过使用`-g`选项来编译生成带有调试信息的可执行文件:```gcc -g hello.c -o hello-debug```然后,可以使用`gdb`命令来启动调试器,并加载可执行文件进行调试:```gdb hello-debug```调试器提供了许多命令和功能,可以帮助你定位和修复代码中的问题。
gcc调试选项
-ds
CSE (包括有时候跟在CSE后面的跳转优化)后转储到`file.cse'.
-dL
循环优化后转储到`file.loop'.
-dt
第二次CSE处理(包括有时候跟在CSE后面的跳转优化)后转储到`file.cse2'.
-df
流程分析(flow analysis)后转储到`file.flow'.
-save-temps
保存那些通常是``临时''的中间文件;置于当前目录下,并且根据源文件命名.因此,用`-c -save-temps'选项编译`foo.c '会生成` foo.cpp'和`foo.s' 以及`foo.o'文件.
-print-file-name=library
显示库文件library的全路径名,连接时会使用这个库---其他什么事情都不作.根据这个选项, GNU CC既不编译,也不连接,仅仅显示文件名.
-dletters
编译的时候,在letters指定的时刻做调试转储(dump).用于调试编译器.大多数转储的文件名 通过源文件名添加字词获得(例如`foo.c.rtl'或`foo.c.jump').
-dM
预处理结束的时候转储所有的宏定义,不输出到文件.
-dN
预处理结束的时候转储所有的宏名.
和大多数C编译器不同, GNU CC允许结合使用`-g'和`-O'选项.优化的代码偶尔制造 一些惊异的结果:某些声明过的变量根本不存在;控制流程直接跑到没有预料到的地方;某些语句因为计算结果是常量或已经确定而 没有执行;某些语句在其他地方执行,因为他们被移到循环外面了.
gcc的使用简介与命令行参数说明
gcc的使用简介与命令行参数说明参考:《GNU gcc嵌入式系统开发作者:董文军》(一) gcc的基本用法(二) 警告提示功能选项(三) 库操作选项(四) 调试选项(五) 交叉编译选项(一) gcc的基本用法使用gcc编译器时,必须给出一系列必要的调用参数和文件名称。
不同参数的先后顺序对执行结果没有影响,只有在使用同类参数时的先后顺序才需要考虑。
如果使用了多个 -L 的参数来定义库目录,gcc会根据多个 -L 参数的先后顺序来执行相应的库目录。
因为很多gcc参数都由多个字母组成,所以gcc参数不支持单字母的组合,Linux中常被叫短参数(short options),如 -dr 与 -d -r 的含义不一样。
gcc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。
gcc最基本的用法是:gcc [options] [filenames]其中,options就是编译器所需要的参数,filenames给出相关的文件名称,最常用的有以下参数:-c只编译,不链接成为可执行文件。
编译器只是由输入的 .c 等源代码文件生成 .o 为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
-o output_filename确定输出文件的名称为output_filename。
同时这个名称不能和源文件同名。
如果不给出这个选项,gcc就给出默认的可执行文件 a.out 。
-g产生符号调试工具(GNU的 gdb)所必要的符号信息。
想要对源代码进行调试,就必须加入这个选项。
-O对程序进行优化编译、链接。
采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是编译、链接的速度就相应地要慢一些,而且对执行文件的调试会产生一定的影响,造成一些执行效果与对应源文件代码不一致等一些令人“困惑”的情况。
因此,一般在编译输出软件发行版时使用此选项。
C语言编程C++编辑器及调试工具操作命令详解
C语⾔编程C++编辑器及调试⼯具操作命令详解⽬录⼀、GCC编译器1、GNU⼯具2、GCC简介3、GCC编译器的版本4、gcc所⽀持后缀名解释5、编译器的主要组件6、GCC的基本⽤法和选项7、GCC的错误类型及对策8、GCC编译过程条件编译⼆、GDB调试⼯具1、Gdb调试流程:2、进⼊代码调试模式后⼀、GCC编译器1、GN U⼯具编译⼯具:把⼀个源程序编译成为⼀个可执⾏程序。
调试⼯具:能对执⾏程序进⾏源码及汇编级调试。
软件⼯程⼯具:⽤于协助多⼈开发或⼤型软件项⽬的管理,如make、CVS、Subvision其他⼯具:⽤于把多个⽬标⽂件链接成可执⾏⽂件的链接器,或者⽤作格式转换的⼯具。
2、GCC简介全称为GNU CC ,GNU项⽬中符合ANSI C标准的的编译系统。
编译如C、C++、Object C 、Java、Fortran 、Pascal、Modula-3和Ada等多种语⾔。
GCC是可以在多种硬件平台上编译出可执⾏程序的超级编译器,其执⾏效率与⼀般的编译器相⽐平均效率要⾼20%~30%。
⼀个交叉平台编译器,适合在嵌⼊式领域的开发编译3、GCC编译器的版本4、gcc所⽀持后缀名解释.c ----- C原始程序.C/.cc/.cxx ----- C++原始程序.m ----- Objective-C原始程序.i ----- 已经预处理过的 C原始程序.ii ----- 已经预处理过的C++原始程序.s/.S ----- 汇编语⾔原始程序.h ----- 预处理⽂件(头⽂件).o ----- ⽬标⽂件.a/.so ----- 编译后的库⽂件5、编译器的主要组件分析器:分析器将源语⾔程序代码转换成汇编语⾔。
因为要从⼀种格式转换成为另⼀种格式(C到汇编),所以分析器需要知道⽬标机器的汇编语⾔。
汇编器:汇编器将汇编语⾔代码转换成为CPU可以执⾏字节码。
链接器:链接器将汇编器⽣成的单独的⽬标⽂件组合成可执⾏的应⽤程序。
GCC 生成的符号表调试信息剖析
GCC生成的符号表调试信息剖析杨灿群赵克佳胡子昂(国防科技大学计算机学院长沙 410073)摘要GCC是一个支持多语言和多平台的开放源码编译软件,本文对GCC所生成的Stab调试信息作了具体的分析,旨在供从事GCC编译软件移植工作者参考。
关键词符号表串表汇编指导命令符号表的转换Analysis of Symbol Table Debugging InformationGenerated by GCC〖A bstract〗 GCC is a free compile software which supports several high level languages as well as many target machines. This paper analyzes the symbol table debugging information generated by GCC, in order to provide help for those who are engaging in GCC porting.〖Key words〗 symbol table,string table,assemble directives,transformations of stabGCC把C语言源文件('.c')编译成汇编语言文件('.s'),汇编器把汇编语言文件翻译成目标文件('.o'),最后由链接器链接所有的目标文件和有关的库生成可执行文件('a.out')。
如打开'-g'选项,GCC编译'.c'文件时,把附加的调试信息插进'.s'文件,这些调试信息经汇编器和链接器稍加转换一直传到可执行文件中。
这些调试信息包括行号、变量的类型和作用域、函数名字、函数参数和函数的作用域等源文件的特性。
在某些目标文件中,调试信息用'.stab'打头的一类汇编指导命令表示,这些指导命令穿插在汇编代码中,这种调试信息格式叫'Stab',即符号表(Symbol table)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用GCC编译与GDB调试一:VMwareTools安装过程1.sudo apt-get update2.sudo apt-get dist-upgrade3. 3.sudo apt-get install build-essential4.sudo apt-get install linux-headers-3.0.0-29-generic-pae5.Ubuntu与windows间的文件共享(选择VM中设置,选项,共享文件夹,添加路径,如果不能在Ubuntu下的/mnt/hgfs下找到共享文件夹还需安装Sudo apt-get instatll open-vm-dkmsSudo mount -t vmhgfs .host:/ /mnt/hgfs二:C 编程中相关文件后缀.a 静态库(archive).c C源代码(需要编译预处理).h C源代码头文件.i C源代码(不需编译预处理).o 对象文件.s 汇编语言代码.so 动态库三:Gcc的执行过程gcc and g++分别是gnu的c & c++编译器gcc/g++在执行编译工作的时候,总共需要4步1.预处理,生成.i的文件[预处理器cpp]2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]4.连接目标代码,生成可执行程序[链接器ld]四. 常用编译命令选项假设源程序文件名为test.c。
1.无选项编译链接用法:#gcc test.c作用:将test.c预处理、汇编、编译并链接形成可执行文件。
这里未指定输出文件,默认输出为a.out。
2. 选项 -o用法:#gcc test.c -o test作用:将test.c预处理、汇编、编译并链接形成可执行文件test。
-o选项用来指定输出文件的文件名。
3. 选项 -E用法:#gcc -E test.c -o test.i作用:将test.c预处理输出test.i文件。
4. 选项 -S用法:#gcc -S test.i作用:将预处理输出文件test.i汇编成test.s文件。
5. 选项-c用法:#gcc -c test.s作用:将汇编输出文件test.s编译输出test.o文件。
6. 无选项链接用法:#gcc test.o -o test作用:将编译输出文件test.o链接成最终可执行文件test。
7. 选项-O用法:#gcc -O1 test.c -o test作用:使用编译优化级别1编译程序。
级别为1~3,级别越大优化效果越好,但编译时间越长。
五. 多源文件的编译方法如果有多个源文件,基本上有两种编译方法:[假设有两个源文件为test.c和testfun.c]1.多个文件一起编译用法:#gcc testfun.c test.c -o test作用:将testfun.c和test.c分别编译后链接成test可执行文件。
2. 分别编译各个源文件,之后对编译后输出的目标文件链接。
用法:#gcc -c testfun.c //将testfun.c编译成testfun.o#gcc -c test.c //将test.c编译成test.o#gcc -o testfun.o test.o -o test //将testfun.o和test.o链接成test以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译六:gcc的各种命令1.查看gcc参数gcc --help2.设置输出的文件gcc hello.c -o do3.查看编译过程gcc -v hello.c七:gdb 调试程序1.所谓调试,指的是对编好的程序用各种手段进行查错和排错的过程。
进行这种查错处理时,并不仅仅是运行一次程序检查结果,而是对程序的运行过程、程序中的变量进行各种分析和处理。
本节将讲解使用gdb进行程序的调试。
Gdb主要进行下面5个方面的操作。
1)启动程序:在启动程序时,可以设置程序运行环境。
2)设置断点:断点就是可以在程序设计时暂停程序运行的标记。
程序会在断点处停止,3)用户便于查看程序的运行情况。
这里的断点可以是行数、程序名称或条件表达式。
4)查看信息:在断点停止后,可以查看程序的运行信息和显示程序变量的值。
5)分步运行:可以使程序一个语句一个语句的执行,这时可以及时地查看程序的信息。
6)改变环境:可以在程序运行时改变程序的运行环境和程序变量。
2.在gdb中加载需要调试的程序file a.debug(1)用gcc 命令编译程序加入了-g 命令以后,gcc -g -o a.debug a.c编译后的a.debug 程序中加入了断点。
可以用list(无法再终端运行出来出来时,首先使用file a.debug命令其次在使用list命令)命令显示程序的源代码和断点。
下面的步骤是查看加入断点以后的代码。
在(gdb)提示符后面输入下面的命令。
(2)在程序中加入断点,例如break 6(3)查看断点info breakpoint 4(4)运行程序在(ddb)提示符后输入“run”命令这时输入“next”命令,程序会在下一行停下,输入“continue”命令,程序会在下一个断点的位置停下(5)变量的查看print 命令可以在程序的运行中查看一个变量的值,例如print i 3.程序调试实例1.编写一个test.c实例使用gdb进行调试2.使用gcc -g命令生产test.debug。
3.进入gdb,输入待调试文件file test.debug,使用list 1命令查看断点,使用break增加断点,使用step查看下一步,不断进行调试查找出错地方,最终改正错误,重新使用gcc进行编译,最后使用./a.out运行出来gdb 常用命令除了前面讲述的gdb 命令以外,gdb 还有很多种命令。
这些命令可以完成程序调试的各种功能。
其他的常用命令含义如下所示。
backtrace:显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)。
breakpoint:在程序中设置一个断点。
cd:改变当前工作目录。
clear:删除刚才停止处的断点。
112Linux 系统下C 程序开发详解commands:命中断点时,列出将要执行的命令。
continue:从断点开始继续执行。
delete:删除一个断点或监测点,也可与其他命令一起使用。
display:程序停止时显示变量和表达式。
down:下移栈帧,使得另一个函数成为当前函数。
frame:选择下一条continue 命令的帧。
info:显示与该程序有关的各种信息。
info break:显示当前断点清单,包括到达断点处的次数等。
info files:显示被调试文件的详细信息。
info func:显示所有的函数名称。
info local:显示当函数中的局部变量信息。
info prog:显示被调试程序的执行状态。
info var:显示所有的全局和静态变量名称。
jump:在源程序中的另一点开始运行。
kill:异常终止在gdb 控制下运行的程序。
list:列出相应于正在执行的程序的源文件内容。
next:执行下一个源程序行,从而执行其整体中的一个函数。
print:显示变量或表达式的值。
pwd:显示当前工作目录。
pype:显示一个数据结构(如一个结构或C++类)的内容。
quit:退出gdb。
reverse-search:在源文件中反向搜索正规表达式。
run:执行该程序。
search:在源文件中搜索正规表达式。
set variable:给变量赋值。
signal:将一个信号发送到正在运行的进程。
step:执行下一个源程序行,必要时进入下一个函数。
undisplay display:命令的反命令,不要显示表达式。
until:结束当前循环。
up:上移栈帧,使另一函数成为当前函数。
watch:在程序中设置一个监测点(即数据断点)。
whatis:显示变量或函数类型。
八:编译程序常见的错误与问题(1)在编程时,出现的错误可能有逻辑错误和语法错误两种。
这两种错误的发生原因和处理方法是不同的。
本节将讲述这两种错误的处理方法。
1.逻辑错误:指的是程序的设计思路发生了错误。
这种错误在程序中是致命的,程序可能正常编译通过,但是结果是错误的。
当程序正常运行而结果错误时,一般都是编程的思路错误。
这时,需要重新考虑程序的运算方法与数据处理流程是否正确。
2.语法错误:语法错误指的是程序的思路正确,但是在书写语句时,发生了语句错误。
这种错误一般是编程时不小心或是对语句的错误理解造成的。
在发生语句错误时,程序一般不能正常编译通过。
这时会提示错误的类型和错误的位置,按照这些提示改正程序的语法错误即可完成错误的修改。
C 程序中的错误,根据严重程序的不同,可以分为异常与警误两类。
(2)异常:①在除法中,0 作除数。
②在开方运算时,对负数开平方。
③程序的主函数没有声明类型。
④程序的主函数没有返回值。
⑤程序中定义了一个变量,但是没有使用这个变量。
⑥变量的存储发生了溢出错误错误指的是程序的语法出现问题,程序编译不能正常完成,产生一个错误信息a.“In function 'main':”表示发生的异常在main 函数内。
b.“5.1.c:16:”表示发生异常的文件是5.1.c,位置是第16 行。
c.下面的信息是第16 行的异常,表明程序的返回类型不正确。
‘main’的返回类型不是‘int’常见错误类型总结①找不到包含文件的错误②错误地使用逗号③括号不匹配错误④小括号不匹配错误⑤变量类型或结构体声明错误⑥使用不存在的函数的错误⑦大小写错误⑧赋值类型错误⑨循环或判断语句中多加分号。