第六章 源代码编译和调试_第1页
第六章 源代码编译和调试_第2页
第六章 源代码编译和调试_第3页
第六章 源代码编译和调试_第4页
第六章 源代码编译和调试_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

Page1/40,第五章内容回顾,Samba和NFS的区别Windows与Linux之间的互访,第六章,源代码编译和调试,预习检查,什么是Gcc什么是Gdb,3,Page4/40,本章目标,能够使用Gcc来编译程序能够使用Gdb调试有问题的程序,Page5/40,本章结构,Gcc,源代码编译和调试,Gcc编译流程解析,Gdb使用流程,Gdb基本命令,Gdb,Gcc编译选项分析,GCC是什么?,GCC是一套由GNU工程开发的,支持多种编程语言的编译器集合GCC以前是GNUCCompiler。GCC现在是GNUCompilerCollection.可编译:c语言(gcc),c+(g+),java(gcj)包含工具:cc1(预编译),cpp(预处理和编译),as(汇编),ld(链接),runtimelibrary(运行时库)适用OS:GCC除了是大多数类Unix操作系统(如Linux、BSD、MacOSX等)的标准的编译器,GCC也同样适用于微软的Windows,其他还有vxwork等操作系统适用硬件平台:X86,sparc,arm,OSX是苹果公司为Mac系列产品开发的专属操作系统sparc:RISC微处理器架构的可扩充处理器架构。vxwork:美国WindRiver公司于1983年开发的一种嵌入式实时操作系统(RTOS),什么是运行时库,运行时库:为了支持基本的程序运行而提供的基本库,比如支持main调用函数,支持printf,memcpy,malloc这些基本函数的使用,只要是那些不需要主动链接库就是能使用的函数,基本就是由运行时库提供的。一些像数学函数如power,则是有libm.so提供,就不是由运行库提供的。c、c+、java都有自己的运行时库。编译运行时库:由编译器自动编译链接进程序,我们无需关心。运行时库包含两大部分:一部分用于生成程序启动代码由crt1.o,crti.o,crtbegin.o,crtend.o,crtn.o等和daemon.o目标文件提供动态库/lib/libc.so.6(windows下叫DDL库)用于支持一些如printf、scanf、等常用的,专门针对不同os和硬件平台的标准Io函数和malloc等标准库函数以及其它函数。同样是printf函数,但在windows和在linux的实现完全是不一样,这些不一样就是由运行时库实现和区分的,但是我们所使用的都是printf函数。在编译时只会留下这些函数的接口,只有真正运行时,才会去调用它。,谁写的GCC,RichardStallman是GCC最初的作者.区别GCC和gcc现在,自由软件基金会(FSF)指定GCCsteeringCommittee为GCC的官方维护者。,为什么选择GCC,GCC是免费的。GCC具备可移植性。大家都用GCC,易于发现问题.,gcc最基本的用法是gccoptionsfilenamesoptions:编译器所需要的编译选项filenames:要编译的文件名。,6.1.1Gcc基本用法,6.1.1Gcc编译流程解析,预处理编译汇编链接,hello.c-预编译E-hello.i-编译Shello.s-汇编chello.o-链接ohello,预处理过的C程序,编译后的汇编代码,汇编后的二进制代码,链接后的可执行文件,6.1.1文件类型,Gcc通过后缀来区别输入文件的类别:v.c为后缀的文件:C语言源代码文件v.a为后缀的文件:是由目标文件构成的静态库文件,v.C,.cc或.cxx为后缀的文件:,是C+源代码文件,v.h为后缀的文件:头文件v.i为后缀的文件:是已经预处理过的C源代码文件v.ii为后缀的文件:是已经预处理过的C+源代码文件v.o为后缀的文件:是编译后的目标文件v.s为后缀的文件:是汇编语言源代码文件v.S为后缀的文件:是经过预编译的汇编语言源代码文件。,.so:动态库文件,6.1.1可执行文件格式,Linux系统中可执行文件有两种格式。第一种格式是a.out格式,这种格式用于早期的Linux系统以及Unix系统的原始格式。a.out同时也是默认生成的可执行文件名。后期一种新的文件格式被引入Unix系统5的第四版本和Solaris系统中。它被称为“可执行和链接”的格式(ELF)。这种格式很容易实现共享库。ELF格式已经被Linux系统作为标准的格式采用。gcc编译程序产生的所有的二进制文件都是ELF格式的文件(即使可执行文件的默认名仍然是a.out)。较旧的a.out格式的程序仍然可以运行在支持ELF格式的系统上。,6.1.2Gcc编译选项分析,总体选项告警和出错选项优化选项体系结构相关选项,/*hello1.c*/#includeintmain()printf(Hello!n);return0;/*my.h*/#include,依赖选项“-Idir”和“-Ldir”,在调试的时候最好不使用任何优化选项,只有当程序在最终发行的时候才考虑对其进行优化。,O0,O1,O2,O3,#includevoidmain()longlongtmp=1printf(Thisisabadcode!n);return0;,rootlocalhostGcc#gcc-Wallwarning.c-owarning,6.2Gdb调试器,GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,6.2Gdb的作用,GDB主要完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。4、动态的改变你程序的执行环境。,6.2.1Gdb调试,前提:,1、Gdb进行调试的是可执行文件,而不是源代码。2、对.c文件进行编译一定要加上选项“-g”,这样编译出的可执行代码才包含调试信息。3、gdb调试命令,均可以用tab键补全,6.2.1Gdb常用调试命令,设置断点b在主函数所在文件设置断点,blinenum跨文件设置断点,b(break)filename:linenum以函数名设置断点:bfunname查看所有断点情况infob(breakpoints)NumTypeDispEnbAddressWhatNum:列表示断点的编号Type:指明类型,类型位breakpoints说明是中断。Disp:指示中断点在生效一次后是否就失去作用,如果是则为dis,不时则为keep。enb:表明当前中断点是否有效,如果是y,如果被disable了则为n。Address:列表中断所处的内存地址。What:列出中断发生在哪个函数的第几行。,6.2.1Gdb调试命令,使断点暂时失效:disable断点编号如果是夸文件,disableilename:linenum删除断点:删除单个断点:clear或delete+断点所在行号删除断点集合只能用delete,如:delete1-n,断点编号1-n不连续也没关系运行代码r(run)查看变量值:p(print)n单步运行:n(next不进入函数),s(step进入函数)显示某个变量或常量的类型:whatisxxx(变量或常量),6.2.1Gdb调试命令,恢复程序运行:c(countine)l(list)l:默认显示10行代码ln1,n2:显示,程序运行到的当前所在文件的,n1行到n2行之间的代,一般默认显示main函数所在文件。lfilename:n1,n2:显示filename文件中,n1到n2行的代码lfunname:显示某个函数周围的代码kill:结束当前程序的调试q(quit):退出gdb,6.2.2Gdb基本命令,1、工作环境相关命令setargsshowargspathdirshowpathssetenVironmentvar=valueshowenVironmentvarcddirpwdshellcommand,2、设置断点与恢复命令infobbreaktbreakdeletedisableenableconditionignorestepnextfinishc,6.2.2Gdb基本命令,3、Gdb中源码查看相关命令listfile载入程序forward-searchreverse-searchdirdirshowd

温馨提示

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

评论

0/150

提交评论