1.9 linux下c程序的调试和编译

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

大连东软信息学院大学生创业实训中心第九章Linux下C程序编译及调试2目录•gcc编译器•调试器gdb3目录¾gcc编译器¾调试器gdb4•gcc(GNUCCompiler)–是GNU推出的功能强大、性能优越的多平台编译器,可以在多种硬体平台上编译出可执行程序,其执行效率与一般的编译器相比平均效率要高20%~30%。–能将C、C++语言源程序、汇编语言程序和目标程序编译、连接成可执行文件。gcc编译器5处理头文件和预编译语句,生成.i文件检查正确后生成.s汇编代码文件将编译阶段生成的.s文件转换成目标文件.o生成可执行文件源代码.ccppcc1asldGCC的执行过程gcc编译器6gcc的基本用法和选项•gcc[选项][源文件名,如.c]•无选项:可执行文件名字默认为a.out。•-o可执行文件名:指定可执行文件名如:gcc-oex1.oex1.c或:gccex2.c-oex2.o•-c:不连接,生成.o目标文件。通常用于编译不包含主程序的子程序文件。•-S:只预处理和编译,把文件编译成为汇编代码,可查看。如:gcc-Shello.c•-g:若使用gdb工具调试,则必须加此选项。•-O或-O1:进行优化编译连接,提高执行效率,但编译连接过程速•O0不进行优化处理。•-O2:比-O更好的优化,当然整个编译、连接过程会更慢。•-Wall生成所有警告信息。•-w不生成任何警告信息。gcc编译器7gcc编译器•-includefile功能相当于在代码中使用#include例子用法:gcc-oexampleexample.c-include/usr/include/stdio.h•-I用来指定头文件目录./usr/include目录一般是不用指定的,但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-Imyinclude参数了,如果不加你会得到一个xxxx.h:Nosuchfileordirectory的错误。8目录¾gcc编译器¾调试器gdb9调试器gdbLinux包含了一个叫gdb的GNU调试程序。gdb是一个用来调试C和C程序的强力调试器。它使你能在程序运行时观察程序的内部结构和内存的使用情况。gdb功能非常强大,适用于修复程序代码中的问题。•查看程序的内部结构•打印变量值•可设置断点以使程序在指定的代码行上停止执行•单步调试源代码10调试器gdbgdb基本命令(1)file:装入想要调试的可执行文件.(2)kill:终止正在调试的程序.(3)list:列出产生执行文件的源代码的一部分.(4)next:执行一行源代码但不进入函数内部.(5)step:执行一行源代码而且进入函数内部.(6)run:执行当前被调试的程序(7)quit:终止gdb(8)watch:使你能监视一个变量的值而不管它何时被改变.(9)break:在代码里设置断点,这将使程序执行到这里时被挂起(10)make:使你能不退出gdb就可以重新产生可执行文件.(11)shell使你能不离开gdb就执行UNIXshell命令.11调试器gdb•//greeting.c•#includestdio.h•voidmy_print(char*string)•{•printf(Thestringis%s\n,string);•}•voidmy_print2(char*string)•{•char*string2;•intsize,i;•size=strlen(string);•string2=(char*)malloc(size+1);•for(i=0;isize;i++)•string2[size-i]=string[i];•string2[size+1]='\0';•printf(Thestringprintedbackwardis%s\n,string2);•}•intmain()•{•charmy_string[]=hellothere;•my_print(my_string);•my_print2(my_string);•return;•}12•编译:gcc-ogreetinggreeting.c显示如下结果:ThestringishellothereThestringprintedbackwardis所设想的输出应该是:Thestringprintedbackwardiserehtolleh调试器gdb13•调试程序键入命令:gdbgreeting•【注意】编译时打开调试选项:gcc–ggreeting.c–ogreeting如果忘了打开,可用如下命令(gdb)filegreeting•运行程序:(gdb)runStartingprogram:/root/greetingThestringishellothereThestringprintedbackwardisProgramexitedwithcode040调试器gdb14•列出源代码:(gdb)list(gdb)回车(gdb)回车•设置断点:(gdb)break13gdb将作出如下的响应:Breakpoint1at0x80483e6:filegreeting.c,line13(gdb)调试器gdb15•现在再键入run命令,将产生如下的输出:Startingprogram:/root/greetingThestringishellothereBreakpoint1,my_print2(string=0xbfffe7b0hellothere)atgreeting.c:1313string2[size-i]=string[i]•设置观察点:(gdb)watchstring2[size-i]gdb将作出如下回应:Watchpoint1:string2[size-i]调试器gdb16•单步执行:(gdb)nextgdb显示如下信息:Watchpoint1,string2[size-i]Oldvalue=0`\000'Newvalue=104`h'my_print2(string=0xbfffe7b0hellothere)atgreeting.c:1212for(i=0;isize;i++)调试器gdb171、键入vi,编辑一个新文件exam.c。其内容如下:#includestdio.hmain(){inta,i=0;a=0;while(i10){a=a+2;printf(thevalueofa=%d\n,a);sleep(1);i=i+1;}}练习18•2、保存退出exam.c–编译exam.c。•使用gcc-oexam.oexam.c•使用gcc-g-ogexam.oexam.c•比较gexam.o与exam.o的大小•执行exam.o键入./exam.o。这里./表示当前目录•执行gexam.o键入./gexam.o。练习19•3、利用gdb调试exam.c。•4、利用屏幕输出字符(printf())调试exam.c。练习20思考题•在编译后,执行时,为什么需要./,直接执行a.out为什么不可以呢?21答疑时间Q&A

1 / 21
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功