|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!我们进修的历程应当是一个堆集的历程,有没有到有,又少到多,而不克不及像下山的山公。9月份的时分是第一次体系进修gcc,gdb,makefile(详见后面博客)。现在作为嵌进式体系的一个构成部分,决意重学一次,感到了解加深了一些。
gcc编译器
条件编纂工具的利用:vivimEmacs等。
实际篇
gcc可使步伐员天真地把持编译历程。编译历程一样平常能够分为上面四个阶段,每一个阶段分离挪用分歧的工具举行处置,如-18所示。
Linux体系中可实行文件有两种格局。第一种格局是a.out格局,这类格局用于初期的Linux体系和Unix体系的原始格局。a.out来自于UnixC编译步伐默许的可实行文件名。当利用同享库时,a.out格局就会产生成绩。把a.out格局调剂为同享库是一种十分庞大的操纵,因为这个缘故原由,一种新的文件格局被引进Unix体系5的第四版本和Solaris体系中。它被称为可实行和毗连的格局(ELF)。这类格局很简单完成同享库。
ELF格局已被Linux体系作为尺度的格局接纳。gcc编译步伐发生的一切的二进制文件都是ELF格局的文件(即便可实行文件的默许名仍旧是a.out)。较旧的a.out格局的步伐仍旧能够运转在撑持ELF格局的体系上。
注:GCC撑持数种调试和分析选项。在这些选项里,最经常使用的是-g和-pg选项。
理论篇
gcc的利用格局:gcc[options][filenames]
个中filenames为所要编译的步伐源文件。options见下文gcc的次要参数。
当利用gcc时,gcc会完成预处置、编译、汇编和毗连。前三步分离天生方针文件,毗连时,把天生的方针文件链接成可实行文件。gcc能够针对撑持分歧的源步伐文件举行分歧处置,文件格局以文件的后缀来辨认。
vihello.c
1、罕见步骤:
关于只要一个源文件的复杂步伐,经常只要编译,运转两步。
1,gcchello.c-ohello
2,./hello
2、gcc编译流程
gccandg++分离是gnu的c&c++编译器gcc/g++在实行编译事情的时分,统共必要4步
hello.c(源码)
1,hello.i天生预处置文件,
参数是“-E”,把hello.c->hello.i。完全下令为gcchello.c-ohello.i-E
2,hello.s编译天生汇编文件,
参数是“-S”,把hello.i->hello.s。完全下令为gcchello.i-ohello.s-S
3,hello.o将汇编文件变成方针代码,
参数是“-c”,把hello.s->hello.o。完全下令为gcchello.s-ohello.o-c
4,hello链接方针代码,天生可实行步伐,
参数无,把hello.o->hello。完全下令为gcchello.o-ohello
./hello(运转)
3、gcc的次要参数
1,整体参数
-E只举行预编译,不做其他处置
-S只是编译不汇编,天生汇编代码
-c只是编译不链接,天生方针文件“.o”
-ofile把输入文件输入到file里
-g在可实行步伐中包括尺度调试信息
-v打印出编译器外部编译各历程的下令行信息和编译器的版本
-Idir在头文件的搜刮路径列表中增加dir目次
-Ldir在库文件的搜刮路径列表中增加dir目次
-static链接静态库
-llibrary毗连名为library的库文件
2,告诫和堕落参数。
-w封闭告诫
-ansi显现不切合ANSIC尺度语法的告诫信息
-pedantic
-Wall跟踪调试的无力工具,最初养成利用此参数的习气。
3,查找选项
gcc一样平常利用默许路径查找头文件和库文件。假如文件所用的头文件或库文件不在缺省目次下,则编译时要指定它们的查找路径。
-I选项:指定头文件的搜刮目次
例:gccCI/export/home/stCotest1test1.c
-L选项:指定库文件的搜刮目次
例:gccCL/usr/X11/R6/libCotest1test1.c
4,优化参数。
经由过程参数“-On”来天生优化代码。个中n是一个代表优化级其余整数,较典范局限是从0到2或3.数字越年夜优化的品级越高,步伐运转速率越快。经常使用-O2,由于它在优化长度,编译工夫和代码年夜学之间获得一个对照幻想的均衡点。对照:1-8.c(代码略)
gcc1-8.c-o1-8
time./1-8
gcc1-8.c-o1-8-O2
time./1-8
注:以下场所应制止优化代码。
(1)步伐开辟时。只要到软件刊行或开辟停止时,才思索对终极天生的代码举行优化。
(2)资本受限时。如内存资本十分严重时(一些及时嵌进式设备)。
(3)跟踪调试时。优化大概会删除、改写或重组代码,从而使跟踪调试变得非常坚苦。
gdb调试器
实际篇
gdb调试的不是.c源文件而是可实行文件,但是,并非一切的可实行文件都能够用gdb调试。假如要让发生的可实行文件能够用来调试,需在实行gcc指令编译步伐时,加上-g参数,指定步伐在编译时包括调试信息。调试信息包括步伐里的每一个变量的范例和在可实行文件里的地点映照和源代码的行号。gdb使用这些信息使源代码和呆板码相干联。
理论篇
gdb利用格局:gdbfilename
个中,filename是要调试的可实行文件。用这类体例运转gdb能够间接指定想要调试的步伐。这和启动gdb后实行filefilename(file下令:装进想要调试的可实行文件)下令效果完整一样。也能够用gdb往反省一个因步伐非常停止而发生的core文件,大概与一个正在运转的步伐相连。
gdb撑持良多的下令且能完成分歧的功效,这些下令从复杂的文件装进到同意你反省所挪用的仓库内容的庞大下令。
1,编纂源文件。
比方,vi1-9
增加以下内容
#include<stdio.h>
intmin(intx,inty);
intmain()
{
inta1,a2,min_int;
printf("pleaseinputthefristintnumber:/n");
scanf("%d",&a1);
printf("pleaseinputthesecondintnumber:/n");
scanf("%d",&a2);
min_int=min(a1,a2);
printf("theminnumberis:%d/n",min_int);
return0;
}
intmin(intx,inty)
{
if(x<y)
returnx;
else
returny;
}
2,编译时要加上选项“-g”,如许编译出的可实行代码才包括调试信息。
gcc1-9.c-o1-9-g
3,进进gdb调试情况。
gdb1-9
回车就进进了gdb调试形式。在gdb的调试情况中,提醒符是“(gdb)”。
4,用gdb调试步伐。
(1)检察源文件
语法:l是list缩写。list<行号>|<函数名>。检察源代码,一次显现10行
下令(gdb)l
(2)设置断点
语法:break行号|函数名<前提表达式>
本例能够输出下令
(gdb)bmin在自界说的min函数出设置断点。
(gdb)b17功效同上
(3)检察断点信息
语法:infobreak#info下令是显现XX信息,经常使用有files,func,local,proc.
下令(gdb)infob
(4)运转步伐
语法:run#实行以后被调试的步伐
下令(gdb)r
注:gdb默许从第一行入手下手运转,假如要从呈现中指定行入手下手运转,只需输出“r”+行号。
(5)检察变量值
语法:p变量名。步伐运转到断点处会主动停息,此时可检察指定变量的值。
本例下令
(gdb)pa1
(gdb)pa2
(gdb)pmin_int
调试步伐时,如需修正变量值,可在步伐运转至断点处是,输出“set变量=设定值”。
例,给变量“a2”赋值11,输出“seta2=11”。
(6)单步伐试
语法:
“n”(next),如有函数,不进进函数挪用。
“s”(step),如有函数,则进进函数挪用。
(7)持续运转步伐
语法:continue
下令(gdb)c
(8)加入gdb调试情况。
语法:quit
下令(gdb)q
其他经常使用下令另有:
Tbreak下令:设置一时断点。它的语法与break不异。区分在于用tbreak设置的断点实行一次以后当即消散。
watch下令:设置监督点,监督表达式的变更。
awatch下令:设置读写监督点。当要监督的表达式被读或写时将使用步伐挂起。它的语法与watch下令不异。
rwatch下令:设置读监督点,当监督表达式被读时将步伐挂起,等侍调试。此下令的语法与watch不异。
display下令:在使用步伐每次中断运转时显现表达式的值。
print下令:显现表达式的值。
delete下令:删除断点。指定一个断点号码,则删除指定断点。不指定参数则删除一切的断点。
Shell下令:实行LinuxShell下令。
make下令:不加入gdb而从头编译天生可实行文件。
注:这些指令能够在今后利用过程当中查,不用融会贯通。今后用很多了,天然就会记着。
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们! |
|