《实验五常用软件开发工具(共7页).docx》由会员分享,可在线阅读,更多相关《实验五常用软件开发工具(共7页).docx(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上实验五、常用软件开发工具一、实验目的 1、熟悉字符模式下的C程序编译和调试环境,基本掌握Linux字符模式下的编译工具和调试工具的使用;2、本实验需要综合使用Linux基本文件命令、编辑器的使用,练习在Linux的字符模式下,编辑、编译及调试一个C程序的基本方法。二、实验内容和步骤1 gcc和 g+ 语言编译器 GCC是GNU Compiler Collection的缩写,它是世界上最为重要的开放源代码软件18。因为所有其他的开放源代码项目都依赖于GCC进行编译。比如,没有GCC,Linux的产生就不会成为可能。GCC能工作在很多平台上,这里所说的平台是指计算机硬件芯
2、片和运行在其上的操作系统的组合。下表是GCC运行的平台。表 GCC运行的平台硬件操作系统AlphaRed Hat Linux 7.1HPPAHPUX 11.0Intel x86Debian Linux 2.2, Red Hat Linux 6.2, FreeBSD 4.5MIPSIRIX 6.5PowerPCAIX4.3.3SparcSolaris 2.7GCC可以编译多种语言:C,C+,对象C(标准C的派生),Fortran,Java, Ada。正如GCC缩写所代表的对象一样,GCC实际上是多种编译器的统称,gcc是所有编译器的统一的程序接口,在本书中,并没有区分GCC和gcc。同时,GCC
3、 也能够进行代码优化,提高执行程序的运行速度。g+是构建于 gcc 基础上的 C+语言编译器。 gcc 编译过程分为 4个阶段: l 预处理 l 编译 l 汇编 l 连接 最简单的C 语言编译的例子: 用 vi建立一个 hello.c文件 $vi hello.c 输入字符 i,插入文本以下文本 /* * hello.c */ #include int main(void) printf( Hello World!n); return 0; 最后输入字符:wq,返回命令行,键入以下编译命令: $gcc hello.c (-lstdc+)如果没有错误 gcc 将生成默认的可执行文件 a.out,执
4、行 a.out: $./a.out Hello World! $ gcc 带有多达数页的编译选项,我们仅列出最常用的几项: -o 可执行文件名 指定输出的可执行文件名,而不是默认的 a.out -c 只编译生成.o 的目标文件,不连接生成可执行文件 -s 只编译生成.s的汇编文件,不连接生成可执行文件 -g 在可执行文件中加入标准调试信息 -Wall 允许GCC发出警告型错误信息选项使用的例子: 对以上 hello.c使用-o,-g 常用选项重新编译、执行: $gcc -g hello.c -o hello $./hello Hello World! $ GCC默认的扩展文件名: .c C 语
5、言源代码 .C .cc C+语言源代码 .i 预处理后的 C语言源代码 .ii 预处理后的 C+语言源代码 .S .s 汇编语言源代码 .o 编译后的目标代码 .a .so 编译后的库代码 下面的例子由两个文件组成: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);sc
6、anf(%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编译器,
7、前面讲到了gcc是GCC的众多编译器的统一入口,gcc靠后缀名决定调用什么编译器,-o 参数指定了可执行文件的文件名为main。第二种方法是编译calc.c为静态库,编译main.c时指定静态库的位置。需要将calc.c编译成中间文件calc.o,使用如下命令行:$gcc -c calc.c生成静态库文件,添加calc.o到静态库中,使用如下命令行:$ar -r libcalc.a calc.o命令行中,-r libcalc.a参数表示建立静态库,名字为libcalc.a。接下来,使用如下命令行:$gcc main.c libcalc.a -o main上面这条命令也可以用下面的命令完成:$g
8、cc main.c -lcalc o main-l参数可以指定库名称,这里calc表示使用库libcalc.a,库名字前面的lib和后面的.a被省略掉了,遵从了命名法。第三种方法是建立共享库,编译时指定共享库。首先,编译calc.c为calc.o,使用命令行:$gcc -c -fpic calc.c命令行中,-fpic指定calc.o为可重分配地址属性,pic是position independence code的缩写。接下来使用calc.o生成共享库calc.so:$gcc -shared calc.o o calc.so这两条命令也可以缩减为一行:$gcc -shared -fpic ca
9、lc.c -o calc.so最后编译main.c,链接生成的共享库:$gcc main.c calc.so -o main2 make项目管理器 make 项目管理器(GNU 中的名称为 gmake)可以根据项目开发者说明的项目开发文件 Makefile 自动的进行编译配置和重复编译,能实现复杂项目的编译自动化。 项目开发文件 Makefile 的编写使用以下规则: 目标体 1: 依赖体 1 依赖体2 . 命令行 1 命令行 2 . 目标体 2: 依赖体 1 依赖体2 . 命令行 1 命令行 2 . . 其中目标体是命令行要生成的输出文件,依赖体是命令行要输入的文件或选项,命令行序列是要创建
10、目标体文件所需要的步骤,例如编译命令。无特别指定,make总是使用当前目录中的 Makefile 进行自动编译。 例如我们在当前目录中有两个项目开发文件hello.c和hello.h,则Makefile文件可以编写为: hello: hello.o gcc hello.o -o hello hello.o: hello.c hello.h gcc -c hello.c clean: rm hello *.o make 命令的使用: $g make 输入make或make hello将生成Makefile中所有的目标文件,即hello,hello.o,hello.s。 $g make hello
11、.o将仅生成目标文件 hello.o $g make clean 是一条伪目标生成命令,该目标没有依赖体,它只执行对已生成目标文件的删除。当我们对以上依赖体中的任意一个进行了修改,重新 make 时仅会引发对应目标体的重新生成,从而提高了编译的效率并保证了项目开发的正确性。 3 gdb程序调试器 GDB是GNU Project Debugger的缩写,用于调试Ada, C, C+, Objective-C, Pascal 和其他语言编写的程序20,这些程序可以运行在本地计算机上,也可以运行在远程计算机上。GDB可以运行在几乎所有的UNIX和微软Windows平台上。GDB主要能做下面4种事(以
12、及由它们所支持的其他事情):1)启动程序,指定可能影响程序运行的任何条件;2)指定程序在一定条件下停止;3)检查当程序停止时发生的事情;4)通过改变程序中的某些条件,测试可能造成的软件错误,还可以由此学习其他的软件错误。GDB可以做源代码级别的程序调试(需要在编译时指定相应条件),也可以做二进制级别的程序调试。如果您在 gcc 编译选项中用到了-g 调试选项,则编译出的可执行文件就会带有符号表。这样的程序就可以使用 gdb 跟踪调试,观察到它的高级语言源代码的执行过程和变量的中间结果,从而能快速的排除程序运行时发生的错误。以下是一个带有运行时错误的C程序,注意程序想通过传地址方式在一个函数中为
13、字符变量 C赋一个字符,但它引用了一个空指针,这将引发运行时的段非法错误使得程序异常终止。但我们可以通过 gdb 跟踪到它产生错误的位置,从而分析出产生错误的原因。 /* * debugmy.c */ #include void myputc(char * cptr) *cptr = a; printf(myputc=%cn,*cptr); int main(void) char c; char * cptr; c = A; myputc(cptr); return 0; 使用带-g 选项的 gcc编译、执行: $gcc -g debugmy.c -o debugmy $ ./debugmy
14、段错误 $ 使用 gdb 跟踪查错 $ gdb ./debugmy GNU gdb Red Hat Linux (6.3.0.0-1.122rh) Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type show copying to see
15、the conditions. There is absolutely no warranty for GDB. Type show warranty for details. This GDB was configured as i386-redhat-linux-gnu.Using host libthread_db library /lib/libthread_db.so.1.(gdb) 现在进入了 gdb 调试状态,可以使用 gdb 的调试 子 命令跟踪程序的执行。Gdb 常用命令: list 行号 列出指定行号的上下行(缺省为 10行) break 源程序文件名: 行号 建立一个断点
16、 run 启动被调试的程序 next 从断点处向下执行一行 step 从断点处向下执行一行,当前行为函数则跟踪进入函数 continue 继续从断点处连续执行 print 变量名 打印变量当前值 quit 退出 gdb 让我们现使用 list命令查看一下要调试的程序是否已经装入,输入: (gdb)list 10 5 void myputc(char * cptr) 6 7 *cptr = a; 8 printf(myputc=%cn,*cptr); 9 10 int main(void) 11 12 char c; 13 char * cptr; 14 c = A; 我们将断点设在第 15 行
17、上,输入: (gdb) break 15 Breakpoint 1 at 0x80483c0: file debugmy.c, line 15. 开始跟踪执行,输入: (gdb) run Starting program: /root/ipc/debugmy Reading symbols from shared object read from target memory.done. Loaded system supplied DSO at 0xffffe000 Breakpoint 1, main () at debugmy.c:15 15 myputc(cptr); 程序执行到第 15 行上停止,我们采用单步执行跟踪错误的发生,输入: (gdb) step myputc (cptr=0x9bbe40 U211? WVS203? L? 215s) at debugmy.c:7 7 *cptr = a; 程序执行一行,进入函数myputc,再单步执行一行,再次输入: (gdb) step Program received signal SIGSEGV, Segmentation fault. 0xd in myputc (cptr=0x9bbe40 U211? WVS203? L? 215s) at debugmy.c:7 7 *cptr = a; 专心-专注-专业
限制150内