c语言开发环境构建及简单的c程序设计.doc_第1页
c语言开发环境构建及简单的c程序设计.doc_第2页
c语言开发环境构建及简单的c程序设计.doc_第3页
c语言开发环境构建及简单的c程序设计.doc_第4页
c语言开发环境构建及简单的c程序设计.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

实验x C语言开发环境构建及简单的C程序设计一、实验目的1、熟悉字符模式下的C程序编译和调试环境,基本掌握麒麟Linux字符模式下的编译工具和调试工具的使用;2、本实验需要综合使用麒麟Linux基本文件命令、编辑器的使用,练习在麒麟Linux的字符模式下,编辑、编译及调试一个C程序的基本方法。二、预备知识1、GNU C编译器目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C+和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、 Fortran、Pascal、Modula-3和Ada等。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%30%。(1)使用GCC通常后跟一些选项和文件名来使用GCC编译器。GCC命令的基本用法如下: gcc options filenames命令行选项指定的编译过程中的具体操作(2)GCC常用选项在使用Gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。Gcc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。 -c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。 -o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。 -g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。 -O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。 -O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。很多的GCC选项包括一个以上的字符,因此必须为每个选项指定各自的连字符,并且就像大多数LINUX 命令一样不能在一个单独的连字符后跟一组选项。例如,下面的命令是不同的:gcc -p-g test.cgcc -pg test.c第一条命令告诉GCC编译test.c时为prof命令建立剖析(profile)信息并且把调试信息加入到可执行文件里。第二条命令告诉GCC只为gprof命令建立剖析信息。当不用任何选项编译一个程序时,GCC将建立(假定编译成功)一个名为a.out的可执行文件。例如, gcc test.c编译成功后,当前目录下就产生了一个a.out文件。也可用-o选项来为即将产生的可执行文件指定一个文件名来代替a.out。例如:gcc o test test.c此时得到的可执行文件就不再是a.out,而是test。GCC也可以指定编译器处理步骤多少。-c选项告诉GCC仅把源代码编译为目标代码而跳过汇编和连接步骤。这个选项使用得非常频繁因为它编译多个C程序时速度更快且更易于管理。默认时GCC建立的目标代码文件有一个.o的扩展名。(3)执行文件 格式: ./可执行文件名例:./a.out ./test2、gdb调试工具在Linux平台下,GNU发布了一款功能强大的调试工具,称为gdb(GNU Debugger),该软件最早是由Richard Stallman编写的,gdb是一个用来调试C和C+程序的调试工具。其工作在命令模式下,需要通过输入命令来实现对应用程序的调试。通过此调试工具可以在程序运行时观察程序的内部结构和内存的使用情况。关于gdb调试器,它是在终端,通过输入命令,进入调试界面的,在调试的过程中,也是通过命令来进行调试的。在终端中输入gdb命令,就可以进入到gdb调试的界面。GDB主要能做下面4种事(以及由它们所支持的其他事情):1)启动程序,指定可能影响程序运行的任何条件;2)指定程序在一定条件下停止;3)检查当程序停止时发生的事情;4)通过改变程序中的某些条件,测试可能造成的软件错误,还可以由此学习其他的软件错误。以下是利用gdb进行调试的步骤:1、调试编译代码为了使gdb正常工作,必须使你的程序在编译时包含调试信息。调试信息里包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb利用这些信息使源代码和机器码相关联。在编译时用 g 选项打开调试选项。2、gdb基本命令命 令描 述file装入欲调试的可执行文件kill终止正在调试的程序list列出产生执行文件的源代码部分next执行一行源代码但不进入函数内部step执行一行源代码并进入函数内部run执行当前被调试的程序quit终止gdbwatch监视一个变量的值而不管它何时被改变break在代码里设置断点,使程序执行到这里时被挂起三、实验内容及步骤本次实验以一个简单的C程序为例,介绍GCC和GDB的编译、调试过程。例子由两个文件组成:main.c, calc.c,其中,main.c文件内容为:#include int calc(int);int main(int argc, char* argv)int iInput=0, iOutput=0;int i=0;scanf(%i,&iInput);while(iInput 0)printf(Please input a positive integer!n);scanf(%i,&iInput);iOutput = calc(iInput);printf(Result is:%in, iOutput);return 0;calc.c的文件内容为:#include int calc(int iIn)int i = 0, iOut = 0;iOut = iIn;for(i = 0; i iIn; i+)iOut += iOut * iIn;return iOut;1、编译过程编译这两个源程序,一是直接使用如下命令行完成编译、链接过程:$gcc main.c calc.c -o main命令行中,main.c calc.c的后缀名指明了调用c编译器,gcc靠后缀名决定调用什么编译器,-o 参数指定了可执行文件的文件名为main。2、调试过程要完成源代码级别的调试,需要在编译时指定将调试信息添加到可执行文件中,也就是说可以在调试时看到程序的函数名、变量名等,而不是内存地址。gcc命令的-g参数可以完成这个功能。例如使用如下命令:$gcc main.c calc.c -o main -g1)启动GDB用以下方式启动GDB:gdb program ,其中program也就是执行文件。启动gdb后,进入gdb的调试环境中,可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示:saserverlocalhost code$ gdbGNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1)Copyright (C) 2010 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law. Type show copyingand show warranty for details.This GDB was configured as x86_64-neokylin-linux-gnu.For bug reporting instructions, please see:.(gdb) gdb的命令很多,gdb把之分成许多个种类。help命令只是例出gdb的命令种类,如果要看种类中的命令,可以使用help 命令,如:help breakpoints,查看设置断点的所有命令。也可以直接help 来查看命令的帮助。gdb中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令,在麒麟Linux下,可以敲击两次TAB键来补齐命令的全称,如果有重复的,那么gdb会把其例出来。示例一:在进入函数func时,设置一个断点。可以敲入break func,或是直接就是b func(gdb) b calcBreakpoint 1 at 0x40060f: file calc.c, line 4.示例二:敲入b按两次TAB键,会看到所有b打头的命令:(gdb) bbacktrace bookmark break bt示例三:只记得函数的前缀,可以这样:(gdb) b cal (再按下一次TAB键,会看到:)(gdb) b calcalc calc.c call_gmon_start (gdb) b calGDB把所有cal开头的函数全部例出来给查看。要退出gdb时,只用发quit或命令简称q就行了。2)在GDB中运行程序当以gdb 方式启动gdb后,gdb会在PATH路径和当前目录中搜索的源文件。如要确认gdb是否读到源文件,可使用l或list命令,看看gdb是否能列出源代码。在gdb中,运行程序使用r或是run命令。程序的运行,有可能需要设置下面四方面的事。i) 程序运行参数。set args 可指定运行时参数。show args 命令可以查看设置好的运行参数。ii) 运行环境。Path可设定程序的运行路径。show paths 查看程序的运行路径。show environment varname 查看环境变量。iii) 工作目录。cd相当于shell的cd命令。pwd 显示当前的所在目录。iv) 程序的输入输出。使用重定向控制程序输出。如:run outfile3)暂停 / 恢复程序运行调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行。可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于查看运行时的变量,以及运行时的流程。当进程被gdb停住时,可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)。如果要恢复程序运行,可以使用c或是continue命令。i) 设置断点(BreakPoint)用break命令来设置断点,有几点设置断点的方法:break在进入指定函数时停住。break +offset,break offset,在当前行号的前面或后面的offset行停住。offiset为自然数。break filename:linenum,在源文件filename的linenum行处停住。break filename:function,在源文件filename的function函数的入口处停住。break . if condition,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。查看断点时,可使用info命令,如下所示:(注:n表示断点号)info breakii) 设置观察点(WatchPoint)观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。有下面的几种方法来设置观察点:watch expr,为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。rwatch,当表达式(变量)expr被读时,停住程序。awatch,当表达式(变量)的值被读或被写时,停住程序。info watchpoints,列出当前所设置了的所有观察点。) 维护停止点上面说了如何设置程序的停止点,GDB中的停止点也就是上述的三类。在GDB中,如果觉得已定义好的停止点没有用了,可以使用delete、clear、disable、enable这几个命令来进行维护。clear line:清除所有设置在指定行上的停止点。delete breakpoints删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当还需要时,enable即可,就好像回收站一样。disable breakpoints 设置断点失效,程序执行时不在此断点处停住。breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。enable breakpoints range.恢复暂时不起作用的断点,breakpoints为停止点号。4)检查数据的功能及其命令4.1 显示变量或表达式的值print命

温馨提示

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

评论

0/150

提交评论