Linu系统编程实验gccgdb的使用以及Makefile文件的编写_第1页
Linu系统编程实验gccgdb的使用以及Makefile文件的编写_第2页
Linu系统编程实验gccgdb的使用以及Makefile文件的编写_第3页
Linu系统编程实验gccgdb的使用以及Makefile文件的编写_第4页
Linu系统编程实验gccgdb的使用以及Makefile文件的编写_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、实验二:gcc、gdb、Makefile 的使用实验目的:(一)学会使用gcc编译器(二)学会gdb调试器的使用(三)学会编写 Make巾le实验要求:(一)编写一应用程序,使用gcc进行编译,并分别使用-o, -g, -static , -O2等选项(二)编写一应用程序,使用gdb调试,调试中使用到该小节所介绍的所有命令(三)实现一应用程序,该程序有两个c文件构成,使用 makefile来完成对该程序的编译实验器材:软件:安装了 Linux的vmware虚拟机硬件:PC机一台实验步骤:(一)gcc编译器1、先用vi编辑hello.c 文件,内容如下:#include <stdio,h&

2、gt;int nain(void)(printff "hello worldXn1");return 0;2、gcc指令的一般格式为:gcc 选项要编译的文件选项目标文件 例:使用gcc编译命令,编译 hello.c 生成可执行文件 hello ,并运行hellorootlocalhost rootlocalhost rootlocalhost hello worldrootglocalhostgcc# vi hello.cgcc# gcc hello.c -o hellogcc# ./hellogcc#上面的命令一步由.c文件生成了可执行文件,将 gcc的四个编译流程:预

3、处理、编译、 汇编、连接一步完成,下面将介绍四个流程分别做了什么工作 3、-E选项的作用:只进行预处理,不做其他处理。例:只对hello.c 文件进行预处理,生成文件 hello.i ,并查看rootlocdlhost gcc# gcc -E hello.c -o hello.iroot(alocalhost gcc # Ishello hello, c hello.i通过查看可以看到头文件包含部分代码 #include <stdio.h>经过预处理阶段之后,编译 器已将stdio.h 的内容贴了进来。4、-S选项的使用-S选项的作用:只是编译不汇编,生成汇编代码hello.s例:

4、将hello.i文件只进行编译而不进行汇编,生成汇编代码rootlocalhost rootglocalhost nello hellot c rootlocalhostgcc# gcc -S hello.i -o hello.s gcc# Ishello.i hello.sgcc# |5、-c选项的使用-c选项的作用:只是编译不连接,生成目标文件 .0例:将汇编代码hello.s只编译不链接成 hello.o 文件root(alocalhost gcc# gcc -c hello.s -o hell。*。rootlocalhost gcc# Ishello hello.c hello.i h

5、ello.o hello.s6、将编译好的hello.o 链接库,生成可执行文件 hellorootlocalhost root(alocalhost hello hello.c root(alocalhost hello worldgcc# gcc hello.o -o hello gcc# Ishello.i hello.o hello.s gcc# ./hello7、-static 选项的使用-static 选项的作用:链接静态库例:比较hello.c连接动态库生成的可执行文件hello和链接静态库生成的可执行文件hellol 的大小-o hellohello.c -o hellolro

6、otlocalhost gcc# gcc hello.c rootlocalhost gcc# gcc - static rootlocalhost gcc# lltotal 636-rwxr-xrx-rwxr-xr-x- rw - r r - rw - r- - r- rw-r-r - rw - r r 1 root root1 root root1 root root1 root root1 root root1 root root4641 Jun605990 Jun75 Jun18880 Jun844 Jun416 Jun1 03:47 hello1 03:47 hellol1 03:1

7、5 hello.c1 03:27 hello.i1 03:41 hello.o1 03:35 hello.s可以看到静态链接库的可执行文件hellol比动态链接库的可执行文件hello要大的多,他们的执行效果是一样的8、-g选项的使用-g选项的作用:在可执行程序中包含标准调试信息例:将hello.c编译成包含标准调试信息的可执行文件hello2rootlocalhost roQtOlocalhost hello hello2 hellol hello.cgcc# gcc -g hello.c -o hello2 gcc# Ishello.i hello.shello.o带有标准调试信息的可执行

8、文件可以使用gdb调试器进行调试,以便找出逻辑错误 9、-O2选项的使用-O2选项的作用:完成程序的优化工作例:将hello.c 用O2优化选项编译成可执行文件hello3 ,和正常编译产生的可执行文件hello进行比较root(alocalhos t rootlocalhost hello hello2 hellol hello3 root(alocalhost hello worldroot(alocalhost hello worldgcc# gcc -02 hello,c -o hello3 gcc# Ishello.c hello.。hello.i hello.sgcc# ./hel

9、logcc# ./Ihello3(二)gdb调试器1、先用vi编辑文件test.c 用于gdb调试器调试,内容如下#include <stdio.h>int main(void)int sum(int sum);int i,result=0;sum(100);for(i=1;i<=100;i+)result+=i;printf("The sum in main function is %dn",result);return 0;int sum(int num)int i,n=0;for(i=0;i<=num;i+)n+=i;printf("

10、The sum in sum function is %dn",n);test2、将test.c文件编译成包含标准调试信息的文件root(alocalhost gdbj# gcc -g test.c -o test rootfaiocalhost gdb# Is test test.c3、启动gdb进行调试raotlocalhost gdb# gdb testGNU gdb Red Hat Linux (6.5-25.e15rh)Copyright (C 2006 Free Software Foundation, Inc.GDB is free software, covered

11、by the GNU General Public Licenser and you arewelcome to change it and/or distribute copies of it und er certain conditions*Type "show copying" to see the conditions.There is absolutely no warranty for GDB, Type "show wa rranty1* for details.This GDB was configured as ”i386-edh己t-linu

12、x-gnu”.Us ing host libthreaddb library "/lib/i686/nosegneg/libth read db.so.1".(gdb)可以看到gdb启动界面中显示了 gdb的版本、自由软件等信息,然后进入了有“gdb”开头的命令行界面4、l (list )命令 l命令用于查看文件(gdb) list1 #include <;5tdio. h> int maim(void) (int sum(int sum);int i,result=0;sum(LOG);for(i-l;i<=100;i+) result+=i;)prin

13、tf("The sum in main function is %dlln", result);(gdb) I11 return 6;12 13 int sum(int num)可以看到每行代码面前都有对应的行号,这样方便我们设置断点。5、b (breakpoint )命令b用于设置断点,断点调试时调试程序的一个非常重要的手段,设置方法:在”b"命令之后加上对应的行号,如下图(gdb) b 6Breakpoint 2 at 0x804839c: file test.c, line 6.在gdb中可以设置多个断点。 代码运行时会到断点对应的行之前暂停,上图中,代码就

14、会运行到第7行之前暂停(并没有运行第 7行)。6、info命令info命令用于查看断点情况,设置好断点后可以用它来查看7、r(run)命令(gdb) b 7Breakpoint 1 at 0x8O483a8: file test.c, line 7. (gdb) info bNum TypeDi5P Enb AddressWhat1 breakpointkeep y 0xG8O483a8 in mainat test.c:7(gdb) |r命令用于运行代码,默认是从首行开始运行,也可以在r后面加上行号,从程序中指定行开始运行。(gdb) rStarting program: /home/Lin

15、ux C/test/gdb/testThe sum in sum function is 5050Breakpoint 1, main () at testtc:7 7for(i=l;i<=100;i+)(gdb) |可以看到程序运行到断点处就停止了8、p (print )命令p命令用于查看变量的值,在调试的时候我们经常要查看某个变量当前的值与我们逻辑 设定的值是否相同,输入 p+变量名即可(gdb) p result$1 = 0(gdb) p numNo symbol "num" in current context( (gdb) p i$2 = 2420724(g

16、db) |可以看到result在第6行已被赋值为零,而i目前还没有被赋值所以是一个随机数, 在主函数里看不到 num的值,只有进入子函数才能看到9、s (step )命令s命令用于单步运行,另外 n (next)命令也用于单步运行,他们的区别在于:如果有 函数调用的时候,s会进入该函数而 n不会进入该函数。Breakpoint 2, main () at test.c:66sum(lOO);(gdb) sisum (num=100) at test.c:15 15int i,n=0;(gdb) (gdb) p num $3 = 100 (gdb) I可以看到进入了 sum子函数,这时候就能看到

17、 num的值为100。 10、n (next )命令n命令用于单步运行,下面是 n命令的使用:Breakpoint 2* main () at test.c:66 sum(100);(gdb) nThe sum in sum function is 505G7 for(i-l;i<=10O;i+)(gdb) I和s命令的运行效果对比会发现, 使用n命令后,程序显示函数sum的运行结果并向下 执行,而使用s命令后则会进入到 sum函数之中单步运行 11、finish 命令finish 命令用于运行程序,直到当前函数结束。例如我们进入了 sum函数,使用finish 命令的情况Breakpo

18、int 2t main () at test,c:6 6sum(100);(gdb) s sum (num=100) at test.c:15 15int i,n=0;(gdb) p num i $4 = 100 (gdb) finishRun till exit f rem #0 sum (num=10G) at test.c:15The sum in sum function is 5056 main () at test.c:77for(i=l;i<=10G;i+)Value returned is $5 = 32(gdb)当我们调试的时候如果觉得某个函数存在问题,进入函数调试之后

19、发现问题不在这个函数,那么我们就可以使用 finish 命令运行程序,知道当前函数结束。12、c命令用于恢复程序的运行,例如我们再一个程序中设置了两个断点,而觉得问题不会 再这两个断点之间的代码上,那么我们局可以在查看完第一个断点的变量及堆栈情况后,使(gdb) b 5 Breakpoint 4 at (gdb) b 12 Breakpoint 5 at (gdb) info b Num Type 4 breakpoint5 breakpoint用c命令恢复程序的正常运彳T,代码就会停在dier个断点处0x8048395: file test tct line 5.Ox80483d9: fil

20、e test.ct line 12.Disp Enb Address What keep y 0x08048395 in main at lest,c:5 keep y 0x080483d9 in main at test.c;12(gdb) c Continuing The sum in sum function is 5050 The sum in main function is 5G50Breakpoint 5, main () at teste 1212(gdb) c Continuing .Program exited normally. (gdb)13、q (quit )命令q命

21、令用于退出gdb调试器(gdb) qrootlocalhost gdb#(三)Makefile 文件的编写1、先用vi编辑一个简单的c程序,由两个文件组成文件fun.c内容#include "fun.h"int max_fun(int x,int y)if(x>=y)return x;elsereturn y;文件main.c内容#include "fun.h"int main(void)int a,b;printf("Please enter the number a and bn");scanf("%d%d&quo

22、t;,&a,&b);int max=0;max=max_fun(a,b);printf("The max number is %dn",max);return 0;文件fun.h内容#include <stdio.h>extern int max_fun(int x,int y);2、使用gcc编译命令直接编译出可执行文件main,并运行查看结果rootfalocalhost makefile# gcc m 己 in.c fun . c -o main rootlocalhost makefile# Is fun,c fun.h main mai

23、n,croot(alocaLhost makefile# ./mainPlease enter the number a and b1256The max number is 56root(alocalhost makefile#3、用vi编辑makefile ,内容如下所示 main:main.o fun.ogcc main.o fun.o -o mainmain.o:main.c fun.hgcc -c main.c -o main.o fun.o:fun.c fun.hgcc -c fun.c -o fun.oclean:rm -f main *.o4、退出并保存,在 shell中键入m

24、ake,查看并运行产生的可执行文件mainrootlocalhost makefile# makegcc -c main-c -q main.ogcc -c fun.c -o fun.ogcc main.。 fun.o -o mainrootlocalhost makefile# Isfun.c fun.h fun.o main ma i n,c main.o makefile rootilccalhost makefile# , /mainPlease enter the number a and b2367 The max number is 67rootlocalhost makefil

25、e# |5、用vi打开makefile进行改写,用变量进行替换,经变量替换后的makefile如下OBJS=main.o fun.oCC=gccCFLAGS=-c main:$(OBJS) $(CC) $(OBJS) -o main main.o:main.c fun.h$(CC) $(CFLAGS) main.c -o main.o fun.o:fun.c fun.h$(CC) $(CFLAGS) fun.c -o fun.o clean:rm -f main *.o退出保存后,在 shell中执行make和make clean命令的效果和前面第 4步是一样的 6、改写makefile ,使用自动变量,改写后的情

温馨提示

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

评论

0/150

提交评论