Linux第6章 常用开发工具.ppt
《Linux第6章 常用开发工具.ppt》由会员分享,可在线阅读,更多相关《Linux第6章 常用开发工具.ppt(59页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第6 6章章 常用开发工具常用开发工具6.1 概述概述vLinux开发工作经常是在Linux用户决定共同完成一个项目时开始的。当开发工作完成后,该软件就被放到Internet站点上,任何用户都可以访问和下载它。v大多数Linux软件是经过自由软件基金会(Free Software Foundation)提供的GNU(GNU 即 GNUs not UNIX)公开认证授权的,因而通常被称作GNU软件。vGNU软件免费提供给用户使用,并被证明是非常可靠和高效的。许多流行的Linux实用程序,如:C编译器、shell和编辑器都是GNU软件应用程序。6.2 gcc编译系统编译系统v目前,linux平台
2、上最常用的是C语言,其编译系统是gcc,能够编译用C,C+等语言编写的程序。v一般来说,系统安装后就已经安装和设定好了gcc。v在shell的提示符下键入gcc v,屏幕上就会显示出目前正在使用的gcc的版本。6.2.1 C语言编译过程 vC语言程序包括:源文件、头文件、库文件;在Linux系统中,C/C+程序编译命令是gcc;v当使用gcc时,gcc会完成预处理、编译、汇编和连接预处理、编译、汇编和连接;前三步生成目标文件,连接时把生成的目标文件链接成可执行文件;vgcc可以针对不同的源程序文件进行不同处理,文件格式以文件的后缀来识别,常见的如表6.1所示。1 1预处理阶段预处理阶段v预处理
3、是常规编译之前预先进行的工作,故此得名。v负责读取C语言源文件,对其中以“#”开头的指令(伪指令)和特殊符号进行处理,如:a.将将“#include”所指出的文件替代该程序行,有两种格式:所指出的文件替代该程序行,有两种格式:b.#include c.预处理程序在预处理程序在/usr/include目录下找文件目录下找文件d.#include“文件名文件名”e.首先在当前工作目录中找,然后到标准目录首先在当前工作目录中找,然后到标准目录/usr/include中找;中找;f.备注:备注:g.使用使用gcc命令时设置选项,指定查找头文件时要优先搜索的目录。命令时设置选项,指定查找头文件时要优先搜
4、索的目录。b.对对C语言源程序中的宏名进行宏替换。语言源程序中的宏名进行宏替换。c.例:例:#define EOF-1d.预处理程序将程序中有预处理程序将程序中有EOF的部分以的部分以-1取代。取代。宏定义:1.可以在C程序中:#define name value:如:#define stuname“Wang”2.也可以在gcc命令的选项中设置宏定义;如:gcc D name=definition第二种方式的优先级高于第一种方式,可以覆盖源文件中的定义。v预处理程序对源程序进行“替换”之后,输出的文件就不包含宏定义、文件包含、条件编译等指令,与源文件功能相同,而形式不同。gcc命令的使用v在L
5、inux系统中,C/C+程序编译命令是gcc,例如:$gcc options filenames1.其中filenames为所要编译的程序源文件;2.执行完成后,生成默认的可执行文件a.out;3.options部分可以有较多取值,如:预处理选项、编译选项、优化选项、连接选项,使得gcc命令的功能很多。【例例】gcc预处理选项预处理选项$cathello.c#include“test1.h”#definevar1“callforhelp”main()printf(“displayDvariable%sn”,DOPTION);printf(“displayoverwritevar1=%sn”,v
6、ar1);printf(“hello,everyone!n”);假设上述程序中,头文件test1.h存放在目录/temp中,且头文件里定义了变量var1,下面用gcc命令对上述C程序进行编译,$gcchello.c则会提示找不到头文件test1.h,以及DOPTION未定义;宏定义宏定义$gccI/temphello.c因此,编译的时候要在gcc命令的选项里面,加入头文件test1.h的路径:此时,会提示:在gcc命令的选项里加入对DOPTION的宏定义:变量var1重定义、DOPTION未定义$gccI/tempDDOPTION=”test”Ehello.c只做预处理,比如:宏替换,用参数的
7、取值替代宏名;只做预处理,比如:宏替换,用参数的取值替代宏名;不做编译,将结果显示在标准输出上。不做编译,将结果显示在标准输出上。main()printf(“displayDvariable%sn”,“test”);printf(“displayoverwritevar1=%sn”,“callforhelp”);printf(“hello,everyone!n”);此时,若要用gcc命令编译并执行hello.c程序,则去掉-E选项,编译完成后,生成默认的可执行文件a.out$a.outdisplayDvariabletestdisplayoverwritevar1=callforhelphel
8、lo,everyone!2 2编译阶段编译阶段v对预处理之后的输出文件进行词法分析、语法分析,试图找出所有不符合语法规则的部分。v并根据问题给出错误消息,终止编译,或给出警告。v当确定程序符合语法规则后,将其“翻译”为功能等价的中间代码,或汇编代码。3 3汇编过程汇编过程v汇编程序(Assembler)把汇编代码翻译成目标机器代码;v包括代码段和数据段等部分,前者包括程序指令,后者存放各种全局或局部变量。2gcc的编译程序选项常用选项及其作用 选选 项项 格格 式式 功功 能能-c 只生成目标文件,不进行连接。用于对源文件的分别编译只生成目标文件,不进行连接。用于对源文件的分别编译-S 只进行
9、编译,不做汇编,生成汇编代码文件格式,其名与源只进行编译,不做汇编,生成汇编代码文件格式,其名与源文件相同,但扩展名为文件相同,但扩展名为.s-o file 将输出放在文件将输出放在文件file中。如果未使用该选项,则可执行文件放中。如果未使用该选项,则可执行文件放在在a.out中中-g 指示编译程序在目标代码中加入供调试程序指示编译程序在目标代码中加入供调试程序gdb使用的附加使用的附加信息信息-v 在标准出错输出上显示编译阶段所执行的命令,即编译驱动在标准出错输出上显示编译阶段所执行的命令,即编译驱动程序及预处理程序的版本号程序及预处理程序的版本号$catm1.c#includemain(
10、)intr;printf(“enteranintegern”);scanf(“%d”,&r);square(r);return0;【例例】gcc编译选项编译选项$catm2.c#includeintsquare(intx)printf(“square=%dn”,x*x);return(x*x);若直接编译m1.c文件:gcc m1.c,则会提示:m1.c文件中的main函数调用的square函数,但没有事先定义和声明。因此需要使用-c选项$gcccm1.c$gcccm2.c$gccm1.om2.oom12$m12enteraninteger6square=36-c-c选项表示:选项表示:只生产
11、目标文件(后缀为只生产目标文件(后缀为.o.o,参,参见表见表6.16.1),而不进行连接,可),而不进行连接,可用于对源文件分别编译。用于对源文件分别编译。4 4连接阶段连接阶段v连接程序(Linker)要解决外部符号访问地址问题,即:将一个文件中引用的符号(如:变量、函数调用),与该符号在另外一个文件中的定义连接起来,最终成为操作系统可以执行的可执行文件。6.3 gdb程序调试工具v程序中的错误可按性质分为三种:(1)编译错误,即语法错误。在编译阶段出现,如:括号不对称、缺少分号等;(2)运行错误:运行时才能发现,如:除数为0,循环终止条件无法达到。(3)逻辑错误:程序可以正常运行,但结果
12、不对。查找程序中的错误,诊断其准确位置,并予以改正,这就是程序调试。vLinux系统中包含了调试程序gdb,它是一个用来调试C和 C+程序的调试器;vgdb可以在程序运行时观察程序的内部结构和内存的使用情况;vgdb 所提供的一些功能如下所示:运行程序,设置程序运行的参数和环境;控制程序在指定的条件下停止运行;当程序停止时,可以检查程序的状态;动态监视程序中变量的值;6.3.1 启动gdb和查看内部命令gdb程序调试的对象是可执行文件,而不是程序的源代码文件;如果要让产生的可执行文件可以用来调试,需在执行gcc指令编译程序时,加上-g参数,指定程序在编译时包含调试信息;(P181,表6.3)并
13、等待用户输入相应的内部命令并等待用户输入相应的内部命令 6.3.2 应用示例下面的这段程序有错误,以其为例,显示gdb调试程序的一般情况。宏定义,变量宏定义,变量BIGNUM值值为为1000调用函数调用函数index_m时,时,将将intary,fltary两个数组两个数组的首地址,作为参数传递的首地址,作为参数传递给函数。给函数。理论分析intary数组数组分配的分配的内存块内存块fltary数组数组分配的分配的内存块内存块内存块大小为内存块大小为100个个int型数据型数据所占用的空间所占用的空间内存块大小为内存块大小为100个个 float 型数据型数据所占用的空间所占用的空间如果进行1
14、000次循环和赋值操作,可能发生什么情况?传递给传递给index_m函数的是数组首地址函数的是数组首地址ary数组数组分配的分配的内存块内存块fary数组数组分配的分配的内存块内存块可能发生的情况:如果fltary数组在内存中的空间位于intary数组前面,则:?当进行到第当进行到第101次次循环,也就是循环,也就是i=100的时候,的时候,fary100在内存在内存中的地址与中的地址与ary0的地址相同!的地址相同!如何通过如何通过gdb调试工具验证上述错误?调试工具验证上述错误?(1 1)在使用在使用在使用在使用gccgcc编译的时候,需要保留一些信息编译的时候,需要保留一些信息编译的时候
15、,需要保留一些信息编译的时候,需要保留一些信息(如:变量的值,数组的内存地址等),(如:变量的值,数组的内存地址等),(如:变量的值,数组的内存地址等),(如:变量的值,数组的内存地址等),才能进行才能进行才能进行才能进行gdbgdb调试:方法如下:调试:方法如下:调试:方法如下:调试:方法如下:使用带-g选项的gcc命令对该程序进行编译:$gcc -g dbme.c -o dbme (2 2)用可执行程序文件名用可执行程序文件名用可执行程序文件名用可执行程序文件名dbmedbme作为参数,启动作为参数,启动作为参数,启动作为参数,启动gdbgdb。$gdb dbme 即可进入即可进入gdb环
16、境如下图所示环境如下图所示初始化完成后,回到初始化完成后,回到gdb提示符状态提示符状态(3)进入)进入gdb环境后,用环境后,用run命令运行该程序,系统给出错误提示命令运行该程序,系统给出错误提示 1.gdb在执行过程中,收到系统发送的在执行过程中,收到系统发送的SIGSEGV信号,则停止运行,表明源程序中出现了段错误,信号,则停止运行,表明源程序中出现了段错误,即:访问了错误的内存段。即:访问了错误的内存段。2.该段错误发生在源文件该段错误发生在源文件dbme.c的第的第19行中,行中,index_m函数中;函数中;并且,并且,gdb给出了两个数组给出了两个数组ary,fary的基地址,
17、的基地址,faryfary数组的基地址小于数组的基地址小于数组的基地址小于数组的基地址小于aryary数组的基地址。数组的基地址。数组的基地址。数组的基地址。使用使用backtrace命令,显示函数调用的时,用户栈的情况。命令,显示函数调用的时,用户栈的情况。v参照源码中错误行的上下文,使用参照源码中错误行的上下文,使用list命令显示相关行的内容命令显示相关行的内容栈底是最初执行的函数,栈底是最初执行的函数,即即main()函数函数栈顶是当前正在执行的函数,说明执行栈顶是当前正在执行的函数,说明执行到该函数时,出现错误被停止。到该函数时,出现错误被停止。List命令不带参数时,显示当前行命令
18、不带参数时,显示当前行的上下的上下5行,总共行,总共10行。行。用用break命令设置断点,设置当执行到某一行时停止运行;命令设置断点,设置当执行到某一行时停止运行;并且可以结合并且可以结合step命令,一行行跟踪程序执行过程命令,一行行跟踪程序执行过程设置断点设置断点程序的第程序的第19行,且行,且i=100时,程序停止运行时,程序停止运行step命令,每次执行一行命令,每次执行一行当当i=100时,时,ary0的值发生了错误的值发生了错误且此时,且此时,fary100的地址与的地址与ary的基地址的基地址一样,发生了冲突。一样,发生了冲突。当当i=100时,时,ary0的值发生了错误,的值
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux第6章 常用开发工具 Linux 常用 开发 工具
限制150内