Linux操作系统环境下的C程序开发技术_第1页
Linux操作系统环境下的C程序开发技术_第2页
Linux操作系统环境下的C程序开发技术_第3页
Linux操作系统环境下的C程序开发技术_第4页
Linux操作系统环境下的C程序开发技术_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五讲Linux操作系统环境下的C程序开发技术Linux系统及程序设计韦勇信息安全教研室第五讲Linux操作系统环境下的C程序开发技术主要内容 编译器GCC简介编译器GCC使用make工具使用程序调试第五讲Linux操作系统环境下的C程序开发技术教学要求理解GCC概念;掌握GCC使用方法;学会编写makefile;掌握GDB调试方法。第五讲Linux操作系统环境下的C程序开发技术GCC简介名称:GNUprojectCandC++CompilerGNUCompilerCollection管理与维护GNU项目第五讲Linux操作系统环境下的C程序开发技术GCC简介GCC能工作在多种平台上Intelx86(Linux,Windows)Alpha(Linux)PowerPC(AIX)Sparc(Solaris)GCC可以编译多种语言CC++Objective-C(标准C的派生)FortranJavaAda第五讲Linux操作系统环境下的C程序开发技术GCC简介C语言编译过程预处理阶段(Preprocess)“#”开头的指令(伪指令/宏指令)和特殊符号进行处理。编译阶段(Compile)预处理之后的输出文件进行词法分析和语法分析汇编过程(Assemble)把汇编语言代码翻译成目标机器代码连接阶段(Link)解决外部符号访问地址问题(库函数)第五讲Linux操作系统环境下的C程序开发技术GCC的使用gcc[选项]输入文件输入文件包括源程序文件、编译中间文件等如果没有指定选项,Linux下生成的可执行文件是a.outgcc的选项主要分为四组:预处理选项编译选项优化选项连接选项第五讲Linux操作系统环境下的C程序开发技术GCC的常用选项gcc常用选项选项含义-ofile将经过gcc处理过的结果存为文件file,这个结果文件可能是预处理文件、汇编文件、目标文件或者最终的可执行文件。假设被处理的源文件为source.c,如果这个选项被省略了,那么生成的可执行文件默认名称为a.out;目标文件默认名为source.o;汇编文件默认名为source.s;生成的预处理文件则发送到标准输出设备。第五讲Linux操作系统环境下的C程序开发技术GCC的常用选项gcc常用选项选项含义-c仅对源文件进行编译,不链接生成可执行文件。在对源文件进行查错时,或只需产生目标文件时可以使用该选项。-g[gdb]在可执行文件中加入调试信息,方便进行程序的调试。如果使用中括号中的选项,表示加入gdb扩展的调试信息,方便使用gdb来进行调试-O[0、1、2、3]对生成的代码使用优化,中括号中为优化级别,缺省的情况为2级优化,0为不进行优化。注意,采用更高级的优化并不一定得到效率更高的代码。-Dname[=definition]将名为name的宏定义为definition,如果中括号中的部分缺省,则宏被定义为1第五讲Linux操作系统环境下的C程序开发技术GCC的常用选项gcc常用选项选项含义-Idir在编译源程序时增加一个搜索头文件的额外目录——dir,即include增加一个搜索的额外目录。-Ldir在编译源文件时增加一个搜索库文件的额外目录——dir-llibrary在编译链接文件时增加一个额外的库,库名为library.a-w禁止所有警告-Wwarning允许产生warning类型的警告,warning可以是:main、unused等很多取值,最常用是-Wall,表示产生所有警告。如果warning取值为error,其含义是将所有警告作为错误(error),即出现警告就停止编译。第五讲Linux操作系统环境下的C程序开发技术GCC文件扩展名规范gcc文件扩展名规范扩展名类型可进行的操作方式.cc语言源程序预处理、编译、汇编、链接.C,.cc,.cp,.cpp,.c++,.cxxc++语言源程序预处理、编译、汇编、链接.i预处理后的c语言源程序编译、汇编、链接.ii预处理后的c++语言源程序编译、汇编、链接.s预处理后的汇编程序汇编、链接.S未预处理的汇编程序预处理、汇编、链接.h头文件不进行任何操作.o目标文件链接第五讲Linux操作系统环境下的C程序开发技术使用gcc编译代码源代码示例源程序——hello.c#include<stdio.h>intmain(void){ printf("hellogcc!\r\n"); return0;}第五讲Linux操作系统环境下的C程序开发技术生成预处理文件$gcc–Ehello.c–ohello.i预处理文件hello.i的部分内容......externvoidfunlockfile(FILE*__stream);#679"/usr/include/stdio.h"3#2"hello.c"2intmain(void){printf("hellogcc!\n");return0;}第五讲Linux操作系统环境下的C程序开发技术生成汇编文件$gcc–Shello.c–ohello.s汇编文件hello.s的部分内容......main: pushl %ebp movl %esp,%ebp........ addl $16,%esp movl $0,%eax leave ret......"第五讲Linux操作系统环境下的C程序开发技术生成二进制文件生成目标文件命令:$gcc–chello.c–ohello.o生成可执行文件命令:$gcchello.c–ohello运行程序$./hello

hellogcc!第五讲Linux操作系统环境下的C程序开发技术编译多个文件greeting.h#ifndef_GREETING_H#define_GREETING_Hvoidgreeting(char*name);#endifgreeting.c#include<stdio.h>#include"greeting.h"voidgreeting(char*name){printf("Hello%s!\r\n",name);}my_app.c#include<stdio.h>#include"greeting.h"#defineN10intmain(void){charname[N];printf("YourName,Please:");scanf("%s",name);greeting(name);return0;}第五讲Linux操作系统环境下的C程序开发技术编译多个文件目录结构(1)编译命令$gccmy_app.cgreeting.c–omy_app目录结构(2)编译方式(1)$ gccmy_app.cfunctions/greeting.c–omy_app-Ifunctions

greeting.h./greeting.cmy_app.cgreeting.h./greeting.cmy_app.cfunctions第五讲Linux操作系统环境下的C程序开发技术编译多个文件目录结构(2)编译方式(2)分步编译命令:1、$gcc-cmy_app.c-Ifunctions2、$gcc-cfunctions/greeting.c3、$gccmy_app.ogreeting.o–omy_app思路:编译每一个.c文件,得到.o的目标文件;将每一个.o的目标文件链接成一个可执行的文件;第五讲Linux操作系统环境下的C程序开发技术使用make工具适用场合:多个文件组成的软件项目基本格式:目标:欲生成的目标文件依赖项:生成目标需要的文件原理:判断依赖项是否为最新,否则,生成新的目标目标:依赖项列表(Tab缩进)命令第五讲Linux操作系统环境下的C程序开发技术使用make工具make工具的使用格式:make[[命令选项][命令参数]]通常使用make就可以了,make会寻找Makefile作为编译指导文件;第五讲Linux操作系统环境下的C程序开发技术使用make工具Makefile示例Makefile文件1my_app:greeting.omy_app.o2 gccmy_app.ogreeting.o-omy_app3greeting.o:functions/greeting.cfunctions/greeting.h4 gcc-cfunctions/greeting.c5my_app.o:my_app.cfunctions/greeting.h6 gcc–cmy_app.c–Ifunctions第五讲Linux操作系统环境下的C程序开发技术使用make工具目标的依赖关系my_appmy_app.ogreeting.omy_app.cfunctions/greeting.hfunctions/greeting.cgcc–cmy_app.c–Ifunctionsgcc-cfunctions/greeting.cgccmy_app.ogreeting.o-omy_app第五讲Linux操作系统环境下的C程序开发技术使用make工具更实用的Makefile文件1OBJS=greeting.omy_app.o2CC=gcc3CFLAGS=-Wall-O–g4my_app:${OBJS}5 ${CC}${OBJS}-omy_app6greeting.o:functions/greeting.cfunctions/greeting.h7 ${CC}${CFLAGS}-cfunctions/greeting.c8my_app.o:my_app.cfunctions/greeting.h9 ${CC}${CFLAGS}-cmy_app.c-Ifunctions第五讲Linux操作系统环境下的C程序开发技术target:$OBJgcc……-otarget

clean:rm……

install:……remove: ……Makefile实例第五讲Linux操作系统环境下的C程序开发技术调试静态调试在程序编译阶段查错并修正错误;主要为语法错误:输入错误;类型匹配错误;排错方式:利用错误、警告信息,并结合源文件环境排错第五讲Linux操作系统环境下的C程序开发技术静态调试举例动态调试:在程序运行阶段差错并修正错误;主要错误类型:算法错误;输入错误;排错方式:利用调试工具定位并修正错误;第五讲Linux操作系统环境下的C程序开发技术静态调试举例greeting.h#ifndef_GREETING_H#define_GREETING_Hvoidgreeting(char*name);#endifgreeting.c#include<stdio.h>#include"greeting.h"voidgreeting(char*name){printf("Hello!\r\n");

}my_app.c1#include<stdio.h>2#include"greeting.h"3#defineN104intmain(void)5{6charname[n];7printf("YourName,Please:");8scanf("%s",name)9greeting(name);10/*return0;*/11}第五讲Linux操作系统环境下的C程序开发技术静态调试举例分块编译greeting.c$gcc

-g-Wall

-cfunctions/greeting.c-g:将调试信息加入到编译的目标文件中;-Wall:将编译过程中的所有级别的警告都打印出来;无错误my_app.c$gcc-g-Wall-cmy_app.c-Ifunctions参数含义同上错误信息:

第五讲Linux操作系统环境下的C程序开发技术静态调试举例错误信息:错误记录格式:文件名:行号:错误描述my_app.c:Infunction`main':my_app.c:6:`n'undeclared(firstuseinthisfunction)my_app.c:6:(Eachundeclaredidentifierisreportedonlyoncemy_app.c:6:foreachfunctionitappearsin.)my_app.c:9:parseerrorbefore"greeting"my_app.c:6:warning:unusedvariable`name'第五讲Linux操作系统环境下的C程序开发技术静态调试举例分析、定位错误(警告):my_app.c的第6行:描述含义:n是一个没有声明的变量;分析:声明数字name时用到了变量n,但变量n在之前没有声明;改正:声明一个新变量n;或者将n改为宏N这里取第2种改正方法;第五讲Linux操作系统环境下的C程序开发技术静态调试举例my_app.c的第9行:描述含义:在“greeting”之前出现解析错误;分析:c中每行程序以;结束,第9行greeting之前的程序行没有以;结束;改正:第8行末尾增加“;”重新编译错误信息:my_app.c:Infunction`main':my_app.c:11:warning:controlreachesendofnon-voidfunction第五讲Linux操作系统环境下的C程序开发技术静态调试举例分析、定位错误(警告):警告:my_app.c的11行描述含义:控制以非空函数结束;分析:main函数返回类型为int,源程序没有以return整数形式结束;改正:将main改为返回void类型;或者:在main程序后增加return返回语句;采用第2种解决方式;重新编译,无错误或警告信息,完成静态调试第五讲Linux操作系统环境下的C程序开发技术静态调试举例静态调试总结主要为语法错误:输入错误;类型匹配错误;分析信息:主要来自gcc编译时产生的提示信息错误警告定位:不一定在提示信息描述的地方;综合分析提示信息及提示行的上下文环境,定位并修正错误、警告。有的警告可以不用修复。第五讲Linux操作系统环境下的C程序开发技术动态调试常见的动态调试方法:增加调试语句;记录程序的执行状况;观察内存变化;使用调试工具;GNUDebuger的功能:启动程序,设置程序执行的上下文环境;在指定的条件下停止程序;程序停止时,检查程序的状态;在程序运行时,改变程序状态,使其按照改变后的状态继续执行。第五讲Linux操作系统环境下的C程序开发技术GDB的使用基本命令显示源程序查看运行时数据改变和显示目录或路径控制程序的执行其他命令获得帮助启动gdb后使用help命令第五讲Linux操作系统环境下的C程序开发技术GDB的使用gdb常用的调试命令命令含义file指定需要进行调试的程序step单步(行)执行,如果遇到函数会进入函数内部next单步(行)执行,如果遇到函数不会进入函数内部run启动被执行的程序quit退出gdb调试环境print查看变量或者表达式的值break设置断点,程序执行到断点就会暂停起来shell执行其后的shell命令list查看指定文件或者函数的源代码,并标出行号第五讲Linux操作系统环境下的C程序开发技术GDB的使用显示源程序Listlist显示当前行后面的程序list-显示当前行前面的程序list[file:]linenum显示linenum行周围的程序liststartline,endline

list[file:]function显示函数名为function的程序showlistsize显示listsize设置setlistsizenum设置listsize设置源代码搜索forward-search,search,reverse-search第五讲Linux操作系统环境下的C程序开发技术GDB的使用查看运行时数据printp(p为变量名)printfunction(1,0)print*pwhatisp第五讲Linux操作系统环境下的C程序开发技术GDB的使用改变和显示目录和路径directorycdpathpwdshowdirectoriesshowpath第五讲Linux操作系统环境下的C程序开发技术GDB的使用控制程序的执行设置/显示断点break,infobreak维护断点deletebreakpoint;deletebreakpoint1;enable/disablebreakpoint1;clearlinenum;运行程序run单步调试和连续执行step,next,continue函数调用call,return第五讲Linux操作系统环境下的C程序开发技术GDB的使用其他命令执行shell命令其格式是:shellcommand-string修改变量值printx=10setvariablex=10跳转执行jumplinenumjump*addr第五讲Linux操作系统环境下的C程序开发技术动态调试举例对静态调试中的例子继续进行动态调试工具:gdb启动gdb$gdb

GNUgdbRedHatLinux(5.3post-0.20021129.18rh)Copyright2003FreeSoftwareFoundation,Inc.GDBisfreesoftware,coveredbytheGNUGeneralPublicLicense,andyouarewelcometochangeitand/ordistributecopiesofitundercertainconditions.Type"showcopying"toseetheconditions.ThereisabsolutelynowarrantyforGDB.Type"showwarranty"fordetails.ThisGDBwasconfiguredas"i386-redhat-linux-gnu".(gdb)启动命令启动提示启动完毕第五讲Linux操作系统环境下的C程序开发技术动态调试举例调试指定程序(./my_app)问题:期望的输出和实际输出不一致(gdb)file./my_app Readingsymbolsfrom./my_app...done(gdb)runStartingprogram:/home/tom/shell_script/cpp/my_app/my_appYourName,Please:tomHello!Programexitednormally.(gdb)加载调试程序启动调试程序程序输出提示信息第五讲Linux操作系统环境下的C程序开发技术动态调试举例初次错误定位:输出有错误错误定位重新开始一次调试;启动gdb;加载调试程序(./my_app);查看程序源代码命令:list文件名第五讲Linux操作系统环境下的C程序开发技术动态调试举例(gdb)listmy_app.c:1,201 #include<stdio.h>2 #include"greeting.h"3 #defineN104 intmain(void)5 {6 charname[N];7 printf("YourName,Please:");8 scanf("%s",name);9 greeting(name);10 return0;11 }(gdb)break7BreakPoint1at0x8048384: ,line7.在程序第7行设置断点命令:(gdb)break7查看源代码设置断点提示信息第五讲Linux操作系统环境下的C程序开发技术动态调试举例错误详细定位1(gdb)run2Startingprogram:/home/tom/shell_script/cpp/my_app/my_app3Breakpoint1,main()atmy_app.c:747 printf("YourName,Please:");5(gdb)next68scanf("%s",name);7(gdb)next8YourName,Please:tom99greeting(name);启动调试程序断点激活步进下一步第五讲Linux操作系统环境下的C程序开发技术动态调试举例10(gdb)printname11$1=“tom\000ò·000©®12(gdb)step13greeting(name=0xbfffdf20“tom”)atfunctions/greeting.c:5145printf(”Hello!\r\n”);15(gdb)step16Hello!176}18(gdb)kill19Killtheprogramebeingdebugged?(yorn)y20(gdb)quit查看变量值进入函数内部步进执行停止调试退出gdb第五讲Linux操作系统环境下的C程序开发技术动态调试举例分析:11行说明name变量被正确赋值(tom)13行说明name变量值被正确赋予greeting的参数变量name16说明打

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论