第6讲 Linux编程基础.ppt
Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系第第2单元单元Linux操作系统的安装、使用及用户接口操作系统的安装、使用及用户接口Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系第第6讲讲 Linux程序设计基础程序设计基础 Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系6.1 概述概述 uLinux软件开发一直在软件开发一直在Internet环境下讲行。这个环境是环境下讲行。这个环境是全球性的,编程人员来自世界各地。全球性的,编程人员来自世界各地。uLinux开发工作完成后,该软件就被放到开发工作完成后,该软件就被放到Internet站点上,站点上,任何用户都可以访问和下载它。任何用户都可以访问和下载它。u由于这个活跃的开发环境,新的以由于这个活跃的开发环境,新的以Linux为基础的软件功为基础的软件功能日益强大,而且呈现爆炸式的增长态势。能日益强大,而且呈现爆炸式的增长态势。u大大多多数数Linux软软件件是是经经过过自自由由软软件件基基金金会会提提供供的的GNU公公开认证授权的,因而通常被称作开认证授权的,因而通常被称作GNU软件。软件。u许许多多流流行行的的Linux实实用用程程序序如如C编编译译器器、shell和和编编辑辑器器都都是是GNU软件应用程序。软件应用程序。Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系uLinux程序需要首先转化为低级机器语言即所谓程序需要首先转化为低级机器语言即所谓的二进制代码以后,才能被操作系统执行。的二进制代码以后,才能被操作系统执行。u例如编程时,先用普通的编程语言生成一系列例如编程时,先用普通的编程语言生成一系列指令,这些指令可被翻译为适当的可执行应用程指令,这些指令可被翻译为适当的可执行应用程序的二进制代码。序的二进制代码。u这个翻译过程可由解释器一步步来完成,或者这个翻译过程可由解释器一步步来完成,或者也可以由编译器明确地完成。也可以由编译器明确地完成。6.1 概述概述 Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系6.2 使用使用GNU cc开发应用程序开发应用程序 6.2.1使用使用GNUcc1gcc的简介的简介gcc可以使程序员灵活地控制编译过程。编译过程一般可以使程序员灵活地控制编译过程。编译过程一般可以分为下面四个阶段,每个阶段分别调用不同的工具进可以分为下面四个阶段,每个阶段分别调用不同的工具进行处理,如图所示。行处理,如图所示。Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系2gcc的使用的使用gcc的使用格式如下:的使用格式如下:$gccoptionsfilenames其中其中filenames为所要编译的程序源文件。为所要编译的程序源文件。当使用当使用gcc时,时,gcc会完成预处理、编译、汇编和连接。会完成预处理、编译、汇编和连接。前三步分别生成目标文件,连接时,把生成的目标文件链前三步分别生成目标文件,连接时,把生成的目标文件链接成可执行文件。接成可执行文件。gcc可以针对支持不同的源程序文件进行可以针对支持不同的源程序文件进行不同处理,文件格式以文件的后缀来识别。不同处理,文件格式以文件的后缀来识别。6.2.1 使用使用GNU ccNeusoft Institute of Information嵌入式系统工程系嵌入式系统工程系3使用优化选项使用优化选项当当用用gcc编编译译C代代码码时时,它它会会试试着着用用最最少少的的时时间间完完成成编编译译并并且且使使编编译译后后的的代代码码易易于于调调试试。易易于于调调试试意意味味着着编编译译后后的的代代码码与与源源代代码码有有同同样样的的执执行行次次序序,编编译译后后的的代代码码没没有有经经过过优优化化。有有很很多多选选项项可可用用于于告告诉诉gcc,在在耗耗费费更更多多编编译译时时间间和和牺牺牲牲易易调调试试性性的的基基础础上上,产产生生更更小小更快的可执行文件。这些选项中最典型的是更快的可执行文件。这些选项中最典型的是-O和和-O2选项。选项。-O选选项项告告诉诉gcc对对源源代代码码进进行行基基本本优优化化。这这些些优优化化在在大大多多数数情情况下都会使程序执行的更快。况下都会使程序执行的更快。-O2选选项项告告诉诉gcc产产生生尽尽可可能能小小和和尽尽可可能能快快的的代代码码。-O2选选项项将将使使编编译译的的速速度度比比使使用用-O时时慢慢。但但通通常常产产生生的的代代码码执执行行速速度度会会更更快。快。6.2.1 使用使用GNU ccNeusoft Institute of Information嵌入式系统工程系嵌入式系统工程系4使用调试和剖析选项使用调试和剖析选项GCC支支持持数数种种调调试试和和剖剖析析选选项项。在在这这些些选选项项里里最最常常用用的的是是-g和和-pg选项。选项。-g选选项项告告诉诉gcc产产生生能能被被GNU调调试试器器使使用用的的调调试试信信息息以以便便调调试试程程序序。在在gcc里里能能使使-g和和-O(产产生生优优化化代代码码)连连用用。同同时时使使用用这这两两个个选选项时必须清楚所写的某些代码已经在优化时被项时必须清楚所写的某些代码已经在优化时被gcc作了改动。作了改动。-pg选选项项告告诉诉gcc在在程程序序里里加加入入额额外外的的代代码码,执执行行时时,产产生生gprof用用的剖析信息以显示程序的耗时情况。的剖析信息以显示程序的耗时情况。6.2.1 使用使用GNU ccNeusoft Institute of Information嵌入式系统工程系嵌入式系统工程系6.2.2 使用使用GNU make编辑编辑makefile 1准备工作准备工作要要使使用用make,必必须须编编写写一一个个叫叫做做makefile的的文文件件,这这个个文文件件描描述述了了软软件件包包中中文文件件之之间间的的关关系系,提提供供更更新新每每个个文文件件的的命命令令。一一般般在在一一个个软软件件包包里里,通通常常是是可可执执行行文文件件靠靠目目标标文文件件来来更更新新,目目标标文文件件靠靠编编译译源源文文件件来来更新。更新。makefile写好之后,每次改变了某些源文件,只要执行写好之后,每次改变了某些源文件,只要执行make命令:命令:#make所所有有必必要要的的重重新新编编译译将将执执行行。make程程序序利利用用makefile中中的的数数据据和和每每个个文文件件的的最最后后修修改改时时间间来来确确定定哪哪个个文文件件需需要要更更新新,对对于于需需要要更更新新的的文文件件,make程序执行程序执行makefile数据中定义的命令来更新。数据中定义的命令来更新。Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系2makefile文件的基本结构文件的基本结构GNU make的的主主要要功功能能是是读读进进一一个个文文本本文文件件makefile并并根根据据makefile的的 内内 容容 执执 行行 一一 系系 列列 的的 工工 作作。makefile的的 默默 认认 文文 件件 名名 为为GNUmakefile、makefile或或Makefile,当当然然也也可可以以在在make的的命命令令行行中中指指定定别别的的文文件件名名。如如果果不不特特别别指指定定,make命命令令在在执执行行时时将将按按顺顺序序查查找找默默认认的的makefile文文件件。多多数数Linux程程序序员员使使用用第第三三种种文文件件名名Makefile。因因为为第第一个字母是大写,通常被列在一个目录的文件列表的最前面。一个字母是大写,通常被列在一个目录的文件列表的最前面。Makefile是是一一个个文文本本形形式式的的数数据据文文件件,其其中中包包含含一一些些规规则则来来告告诉诉make处处理理哪哪些些文文件件以以及及如如何何处处理理这这些些文文件件。这这些些规规则则主主要要是是描描述述哪哪些些文文件件(称称为为target目目标标文文件件,不不要要和和编编译译时时产产生生的的目目标标文文件件相相混混淆淆)是是从从哪哪些些别别的的文文件件(称称为为dependency依依赖赖文文件件)中中产产生生的的,以以及及用用什什么么命命令令(command)来执行这个过程。)来执行这个过程。6.2.2 使用使用GNU make编辑编辑makefile Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系依依靠靠这这些些信信息息,make会会对对磁磁盘盘上上的的文文件件进进行行检检查查,如如果果目目标标文文件件的的生生成成或或被被改改动动时时的的时时间间(称称为为该该文文件件时时间间戳戳)至至少少比比它它的的一一个个依依赖赖文文件件还还旧旧的的话话,make就就执执行行相相应应的的命命令令,以以更更新新目目标标文文件件。目目标标文文件件不不一一定定是是最最后后的的可可执执行行文件,可以是任何一个中间文件并可以作为其他目标文件的依赖文件。文件,可以是任何一个中间文件并可以作为其他目标文件的依赖文件。一个一个Makefile文件主要含有一系列的规则,每条规则包含以下内容:文件主要含有一系列的规则,每条规则包含以下内容:一一个个目目标标(target),即即make最最终终需需要要创创建建的的文文件件,如如可可执执行行文文件件和和目目标标文件;目标也可以是要执行的动作,如文件;目标也可以是要执行的动作,如“clean”。一一个个或或多多个个依依赖赖文文件件(dependency)列列表表,通通常常是是编编译译目目标标文文件件所所需需要要的其他文件。的其他文件。一一系系列列命命令令(command),是是make执执行行的的动动作作,通通常常是是把把指指定定的的相相关关文文件件编编译译成成目目标标文文件件的的编编译译命命令令,每每个个命命令令占占一一行行,且且每每个个命命令令行行的的起起始始字字符符必必须须为为TAB字符。字符。6.2.2 使用使用GNU make编辑编辑makefile Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系6.2.2 使用使用GNU make编辑编辑makefile 除除非非特特别别指指定定,否否则则make的的工工作作目目录录就就是是当当前前目目录录。target是是需需要要创创建建的的二二进进制制文文件件或或目目标标文文件件,dependency是是在在创创建建target时时需需要要用用到到的的一一个个或或多多个个文文件件的的列列表表,命命令令序序列是创建列是创建target文件所需要执行的步骤,比如编译命令。文件所需要执行的步骤,比如编译命令。Makefile规则的一般形式如下:规则的一般形式如下:target:dependencydependency(tab)Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系例如,有以下的例如,有以下的Makefile文件:文件:#一个简单的一个简单的Makefile的例子的例子(以(以#开头的为注释行)开头的为注释行)test:prog.ocode.ogccotestprog.ocode.oprog.o:prog.cprog.hcode.hgcccprog.coprog.ocode.o:code.ccode.hgccccode.cocode.oclean:rmf*.o6.2.2 使用使用GNU make编辑编辑makefile Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系上上面面的的Makefile文文件件中中共共定定义义了了四四个个目目标标:test、prog.o、code.o和和clean。目目标标从从每每行行的的最最左左边边开开始始写写,后后面面跟跟一一个个冒冒号号(:),如如果果有有与与这这个个目目标标有有依依赖赖性性的的其其他他目目标标或或文文件件,把把它它们们列列在在冒冒号号后后面面,并并以以空空格格隔隔开开。然然后后另另起起一一行行开开始始写写实实现现这这个个目目标标的的一一组组命命令令。在在Makefile中中,可可使使用用续续行行号号()将将一一个个单单独独的的命命令令行行延延续续成成几几行行。但但要要注注意意在在续续行行号号()后后面面不不能能跟跟任任何何字字符符(包包括括空格和键)。空格和键)。一般情况下,调用一般情况下,调用make命令可输入:命令可输入:#maketargettarget是是Makefile文文件件中中定定义义的的目目标标之之一一,如如果果省省略略target,make就就将将生生成成Makefile文文件件中中定定义义的的第第一一个个目目标标。对对于于上上面面Makefile的的例例子子,单单独独的的一一个个“make”命令等价于:命令等价于:#maketest因因为为test是是Makefile文文件件中中定定义义的的第第一一个个目目标标,make首首先先将将其其读读入入,然然后后从从第第一一行行开开始始执执行行,把把第第一一个个目目标标test作作为为它它的的最最终终目目标标,所所有有后后面面的的目目标标的的更更新新都都会会影影响响到到test的的更更新新。第第一一条条规规则则说说明明只只要要文文件件test的的时时间间戳戳比比文文件件prog.o或或code.o中的任何一个旧,下一行的编译命令将会被执行。中的任何一个旧,下一行的编译命令将会被执行。6.2.2 使用使用GNU make编辑编辑makefile Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系但但是是,在在检检查查文文件件prog.o和和code.o的的时时间间戳戳之之前前,make会会在在下下面面的的行行中中寻寻找找以以prog.o和和code.o为为目目标标的的规规则则,在在第第三三行行中中找找到到了了关关于于prog.o的的规规则则,该该文文件件的的依依赖赖文文件件是是prog.c、prog.h和和code.h。同同样样,make会会在在后后面面的的规规则则行行中中继继续续查查找找这这些些依依赖赖文文件件的的规规则则,如如果果找找不不到到,则则开开始始检检查查这这些些依依赖赖文文件件的的时时间间戳戳,如如果果这这些些文文件件中中任任何何一一个个的的时时间间戳戳比比prog.o的的新新,make将将执执行行“gcccprog.coprog.o”命命令令,更更新新prog.o文件。文件。以以同同样样的的方方法法,接接下下来来对对文文件件code.o做做类类似似的的检检查查,依依赖赖文文件件是是code.c和和code.h。当当make执执行行完完所所有有这这些些套套嵌嵌的的规规则则后后,make将将处处理理最最顶顶层层的的test规规则则。如如果果关关于于prog.o和和code.o的的两两个个规规则则中中的的任任何何一一个个被被执执行行,至至少少其其中中一一个个.o目目标标文文件件就就会会比比test新新,那那么么就就要要执执行行test规规则则中中的的命命令令,因因此此make去去执执行行gcc命命令令将将prog.o和和code.o连连接接成成目目标标文文件件test。在在上上面面Makefile的的例例子子中中,还还定定义义了了一一个个目目标标clean,它它是是Makefile中常用的一种专用目标,即删除所有的目标模块。中常用的一种专用目标,即删除所有的目标模块。6.2.2 使用使用GNU make编辑编辑makefile Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系现现在在来来看看一一下下make做做的的工工作作:首首先先make按按顺顺序序读读取取makefile中中的的规规则则,然然后后检检查查该该规规则则中中的的依依赖赖文文件件与与目目标标文文件件的的时时间间戳戳哪哪个个更更新新,如如果果目目标标文文件件的的时时间间戳戳比比依依赖赖文文件件还还早早,就就按按规规则则中中定定义义的的命命令令更更新新目目标标文文件件。如如果果该该规规则则中中的的依依赖赖文文件件又又是是其其他他规规则则中中的的目目标标文文件件,那那么么依依照照规规则则链链不不断断执执行行这这个个过过程程,直直到到Makefile文文件件的的结结束束,至至少少可可以以找找到到一一个个不不是是规规则则生生成成的的最最终终依依赖赖文文件件,获获得得此此文文件件的的时时间间戳戳,然然后后从从下下到到上上依依照照规规则则链链执执行行目目标标文文件件的的时时间间戳戳比比此此文文件件时时间间戳戳旧旧的的规规则,直到最顶层的规则。则,直到最顶层的规则。通通过过以以上上的的分分析析过过程程,可可以以看看到到make的的优优点点,因因为为.o目目标标文文件件依依赖赖.c源源文文件件,源源码码文文件件里里一一个个简简单单改改变变都都会会造造成成那那个个文文件件被被重重新新编编译译,并并根根据据规规则则链链依依次次由由下下到到上上执执行行编编译译过过程程,直直到到最最终终的的可可执执行行文文件件被被重重新新连连接接。例例如如,当当改改变变一一个个头头文文件件的的时时候候,由由于于所所有有的的依依赖赖关关系系都都在在Makefile里里,因因此此不不再再需需要要记记住住依依赖赖此此头头文文件件的的所所有有源源码码文文件件,make可可以以自自动动的的重重新新编编译译所所有有那那些些因因依依赖赖这这个个头头文文件件而而改改变变了了的的源源码文件,如果需要,再进行重新连接。码文件,如果需要,再进行重新连接。6.2.2 使用使用GNU make编辑编辑makefile Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系3Makefile中的变量中的变量Makefile里里的的变变量量就就像像一一个个环环境境变变量量。事事实实上上,环环境境变变量量在在make中中也也被被解解释释成成make的的变变量量。这这些些变变量量对对大大小小写写敏敏感感,一一般般使使用用大大写写宇宇母。几乎可以从任何地方引用定义的变量,变量的主要作用如下:母。几乎可以从任何地方引用定义的变量,变量的主要作用如下:保保存存文文件件名名列列表表。在在前前面面的的例例子子里里,作作为为依依赖赖文文件件的的一一些些目目标标文文件件名名出出现现在在可可执执行行文文件件的的规规则则中中,而而在在这这个个规规则则的的命命令令行行里里同同样样包包含含这这些些文文件件并并传传递递给给gcc做做为为命命令令参参数数。如如果果使使用用一一个个变变量量来来保保存存所所有有的的目标文件名,则可以方便地加入新的目标文件而且不易出错。目标文件名,则可以方便地加入新的目标文件而且不易出错。保保存存可可执执行行命命令令名名,如如编编译译器器。在在不不同同的的Linux系系统统中中存存在在着着很很多多相相似似的的编编译译器器系系统统,这这些些系系统统在在某某些些地地方方会会有有细细微微的的差差别别,如如果果项项目目被被用用在在一一个个非非gcc的的系系统统里里,则则必必须须将将所所有有出出现现编编译译器器名名的的地地方方改改成成用用新新的的编编译译器器名名。但但是是如如果果使使用用一一个个变变量量来来代代替替编编译译器器名名,那那么么只只需需要改变该变量的值。其他所有地方的命令名就都改变了。要改变该变量的值。其他所有地方的命令名就都改变了。6.2.2 使用使用GNU make编辑编辑makefile Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系保保存存编编译译器器的的参参数数。在在很很多多源源代代码码编编译译时时,gcc需需要要很很长长的的参参数数选选项项,在在很很多多情情况况下下,所所有有的的编编译译命命令令使使用用一一组组相相同同的的选选项项,如如果果把把这这组组选选项项使使用用一一个个变变量量代代表表,那那么么可可以以把把这这个个变变量量放放在在所所有有引引用用编编译译器器的的地地方方。当当要要改变选项的时候,只需改变一次这个变量的内容即可。改变选项的时候,只需改变一次这个变量的内容即可。Makefile中中的的变变量量是是用用一一个个文文本本串串在在Makefile中中定定义义的的,这这个个文文本本串串就就是是变变量量的的值值。只只要要在在一一行行的的开开始始写写下下这这个个变变量量的的名名字字,后后面面跟跟一一个个“”号,以及要设定这个变量的值即可定义变量,下面是定义变量的语法:号,以及要设定这个变量的值即可定义变量,下面是定义变量的语法:VARNAME=string使使用用时时,把把变变量量用用括括号号括括起起来来,并并在在前前面面加加上上$符符号号,就就可可以以引引用用变变量的值:量的值:$VARNAMEmake解解释释规规则则时时,VARNAME在在等等式式右右端端展展开开为为定定义义它它的的字字符符串串。变变量量一一般般都都在在Makefile的的头头部部定定义义。按按照照惯惯例例,所所有有的的Makefile变变量量都都应应该该是是大大写写。如如果果变变量量的的值值发发生生变变化化,就就只只需需要要在在一一个个地地方方修修改改,从从而而简简化化了了Makefile的维护。的维护。6.2.2 使用使用GNU make编辑编辑makefile Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系现在利用变量把前面的现在利用变量把前面的Makefile重写一遍:重写一遍:OBJS=prog.ocode.oCC=gcctest:$OBJS$CCotest$OBJSprog.o:prog.cprog.hcode.h$CCcprog.coprog.ocode.o:code.ccode.h$CCccode.cocode.oclean:rmf*.o6.2.2 使用使用GNU make编辑编辑makefile Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系4Makefile的隐含规则的隐含规则在在上上面面的的例例子子中中,几几个个产产生生目目标标文文件件的的命命令令都都是是从从“.c”的的C语语言言源源文文件件和和相相关关文文件件通通过过编编译译产产生生“.o”目目标标文文件件,这这也也是是一一般般的的步步骤骤。实实际际上上,make可可以以使使工工作作更更加加自自动动化化,也也就就是是说说,make知知道道一一些些默默认认的的动动作作,它它有有一一些些称称作作隐隐含含规规则则的的内内置置的的规规则则,这这些些规规则则告告诉诉make当当用用户户没没有有完完整整地给出某些命令的时候,应该怎样执行。地给出某些命令的时候,应该怎样执行。例例如如,把把生生成成prog.o和和code.o的的命命令令从从规规则则中中删删除除,make将将会会查查找找隐隐含含规规则则,然然后后会会找找到到并并执执行行一一个个适适当当的的命命令令。由由于于这这些些命命令令会会使使用用一一些些变变量量,因因此此可可以以通通过过改改变变这这些些变变量量来来定定制制make。象象在在前前面面的的例例子子中中所所定定义义的的那那样样,make使使用用变变量量CC来来定定义义编编译译器器,并并且且传传递递变变量量CFLAGS(编编译译器器参参数数)、CPPFLAGS(C语语言言预预处处理理器器参参数数)、TARGET_ARCH(目目标标机机器器的的结结构构定定义义)给给编编译译器器,然然后后加加上上参参数数-c,后后面面跟跟变变量量“$”(第第一一个个依依赖赖文文件件名名),然然后后是是参参数数-o加加变变量量“$”(目目标标文文件件名名)。综综上上所所述述,一个一个C编译的具体命令将会是:编译的具体命令将会是:$CC$CFLAGS$CPPFLAGS$TARGET_ARCHc$-o$6.2.2 使用使用GNU make编辑编辑makefile Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系在上面的例子中,利用隐含规则,可以简化为:在上面的例子中,利用隐含规则,可以简化为:OBJS=prog.ocode.oCC=gcctest:$OBJS$CCo$/$表示所有依赖文件名表示所有依赖文件名 prog.o:prog.cprog.hcode.hcode.o:code.ccode.hclean:rmf*.o6.2.2 使用使用GNU make编辑编辑makefile Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系6.3 调试工具调试工具GDB 6.3.1GDB调试器简介调试器简介Linux系系统统中中包包含含了了GNU调调试试程程序序gdb,它它是是一一个个用用来来调调试试C和和C+程程序序的的调调试试器器。可可以以使使程程序序开开发发者者在在程程序序运运行行时时观观察察程程序序的的内内部部结结构构和和内内存存的的使使用用情情况况。gdb所所提提供供的一些功能如下所示:的一些功能如下所示:运行程序,设置所有的能影响程序运行的参数和环境;运行程序,设置所有的能影响程序运行的参数和环境;控制程序在指定的条件下停止运行;控制程序在指定的条件下停止运行;当程序停止时,可以检查程序的状态;当程序停止时,可以检查程序的状态;修改程序的错误,并重新运行程序;修改程序的错误,并重新运行程序;动态监视程序中变量的值;动态监视程序中变量的值;可以单步执行代码,观察程序的运行状态。可以单步执行代码,观察程序的运行状态。Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系gdb程程序序调调试试的的对对象象是是可可执执行行文文件件,而而不不是是程程序序的的源源代代码码文文件件。然然而而,并并不不是是所所有有的的可可执执行行文文件件都都可可以以用用gdb调调试试。如如果果要要让让产产生生的的可可执执行行文文件件可可以以用用来来调调试试,需需在在执执行行gcc指指令令编编译译程程序序时时,加加上上-g参参数数,指指定定程程序序在在编编译译时时包包含含调调试试信信息息。调调试试信信息息包包含含程程序序里里的的每每个个变变量量的的类类型型和和在在可可执执行行文文件件里里的的地地址址映映射射以以及及源源代代码码的的行行号号。gdb利利用用这些信息使源代码和机器码相关联。这些信息使源代码和机器码相关联。6.3.1 GDB调试器简介调试器简介Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系在在命命令令行行上上输输入入gdb并并按按回回车车键键就就可可以以运运行行gdb了了,如如果果一一切切正正常常的的话话,将启动将启动gdb,可以在屏幕上看到以下的内容:,可以在屏幕上看到以下的内容:GNUgdbRedHatLinux(5.3post-0.20021129.18rh)Copyright2003FreeSoftwareFoundation,Inc.GDBisfreesoftware,coveredbytheGNUGeneralPublicLicense,andyouarewelcometochangeitand/ordistributecopiesofitundercertainconditions.Typeshowcopyingtoseetheconditions.There is absolutely no warranty for GDB.Type show warranty fordetails.ThisGDBwasconfiguredasi386-redhat-linux-gnu.(gdb)6.3.1 GDB调试器简介调试器简介Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系启启动动gdb后后,可可以以在在命命令令行行上上指指定定很很多多的的选选项项。输输入入:help,可可以以获获得得gdb的的帮帮助助信信息息。如如果果想想要要了了解解某某个个具具体体命命令令(比比如如break)的的帮帮助助信信息息,在在gdb提提示示符符下下输输入下面的命令:入下面的命令:break屏屏幕幕上上会会显显示示关关于于break的的帮帮助助信信息息。从从返返回回的的信信息息可可知知,break是是用用于于设设置置断断点点的的命命令令。另另一一个个获获得得gdb帮帮助助的的方方法法是是浏浏览览gdb的的手手册册页页。在在LinuxShell提提示示符符输入:输入:mangdb可以看到可以看到man的手册页。的手册页。6.3.1 GDB调试器简介调试器简介Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系6.3.2 GDB命令的基本使用和应用命令的基本使用和应用 1gdb基本命令基本命令还可以用下面的方式来运行还可以用下面的方式来运行gdb:gdbfilename其其中中,filename是是要要调调试试的的可可执执行行文文件件。用用这这种种方方式式运运行行gdb可可以以直直接接指指定定想想要要调调试试的的程程序序。这这和和启启动动gdb后后执执行行filefilename命命令令效效果果完完全全一一样样。也也可可以以用用gdb去去检检查查一一个个因因程程序序异异常常终终止止而而产产生生的的core文文件件,或者与一个正在运行的程序相连。或者与一个正在运行的程序相连。gdb支支持持很很多多命命令令且且能能实实现现不不同同的的功功能能。这这些些命命令令从从简简单单的的文文件件装装入入到到允允许许你你检检查查所所调调用用的的堆堆栈栈内内容容的的复复杂杂命命令令,下下面面列列出出了了在在使使用用gdb调试时会用到的一些命令。调试时会用到的一些命令。1)file命令:装入想要调试的可执行文件。命令:装入想要调试的可执行文件。2)cd命令:改变工作目录。命令:改变工作目录。3)pwd命令:显示当前工作目录。命令:显示当前工作目录。4)run命令:执行当前被调试的程序。命令:执行当前被调试的程序。Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系5)kill命令:停止正在调试的应用程序。命令:停止正在调试的应用程序。6)list命令:列出正在调试的应用程序的源代码。命令:列出正在调试的应用程序的源代码。7)break命令:设置断点。命令:设置断点。8)tbreak命命令令;设设置置临临时时断断点点。它它的的语语法法与与break相相同同。区区别别在在于于用用tbreak设置的断点执行一次之后立即消失。设置的断点执行一次之后立即消失。9)watch命令:设置监视点,监视表达式的变化。命令:设置监视点,监视表达式的变化。10)awatch命命令令:设设置置读读写写监监视视点点。当当要要监监视视的的表表达达式式被被读读或或写写时时将将应应用程序挂起。它的语法与用程序挂起。它的语法与watch命令相同。命令相同。11)rwatch命命令令:设设置置读读监监视视点点,当当监监视视表表达达式式被被读读时时将将程程序序挂挂起起,等等待调试。此命令的语法与待调试。此命令的语法与watch相同。相同。12)next命命令令:执执行行下下一一条条源源代代码码,但但是是不不进进入入函函数数内内部部。也也就就是是说说,将将一一条条函函数数调调用用作作为为一一条条语语句句执执行行。执执行行这这个个命命令令的的前前提提是是已已经经run,开开始了代码的执行。始了代码的执行。6.3.2 GDB命令的基本使用和应用命令的基本使用和应用 Neusoft Institute of Information嵌入式系统工程系嵌入式系统工程系13)step命命令令:执执行行下下一一条条源源代代码码,进进入入函函数数内内部部。如如果果调调用用某某个个函函数数,会会跳跳到到函数代码中等候一步步执行。执行这个命令的前提是已经用函数代码中等候一步步执行。执行这个命令的前提是已经用run开始执行代码。开始执行代码。14)display命令:在应用程序每次停止运行时显示表达式的值。命令:在应用程序每次停止运行时显示表达式的值。15)infobreak命令:显示当前断点列表,包括每个断点到达的次数。命令:显示当前断点列表,包括每个断点到达的次数。16)infofiles命令:显示调试文件的信息。命令:显示调试文件的信息。17)infofunc命令:显示所有的函数名。命令:显示所有的函数名。18)infolocal命令:显示当前函数的所有局部变量的信息。命令:显示当前函数的所有局部变量的信息。19)infoprog命令:显示调试程序的执行状态。命令:显示调试程序的执行状态。20)print命令;显示表达式的值。命令;显示表达式的值。21)delete命命令令:删删除除断断点点。指指定定一一个个断断点点号号码码,则则删删除除指指定定断断点点。不不指指定定参参数数则删除所有的断点。则删除所有的断点。22)Shell命令:执行命令:执行LinuxShell命令。命令。23)make命令:不退出命令:不退出gdb而重新编译生成可执行文件。而重新编译生成可执行文件。24)Quit命令:退出命令:退出gdb。6.3.2 GDB命令的基本使用和应用命令的基本使用和应用