版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 海量资料 超值下载 Linux下的C程序开发一、实验目的1、熟悉字符模式下的C程序编译和调试环境,基本掌握Linux字符模式下的编译工具和调试工具的使用;2、本实验需要综合使用Linux基本文件命令、编辑器的使用,练习在Linux的字符模式下,编辑、编译及调试一个C程序的基本方法。二、相关知识GCC是GNU Compiler Collection的缩写,它是世界上最为重要的开放源代码软件18。因为所有其他的开放源代码项目都依赖于GCC进行编译。比如,没有GCC,Linux的产生就不会成为可能。GCC能工作在很多平台上,这里所说的平台是指计算机硬件芯片和运行在其上的操作系统的组合。下表3-2是
2、GCC运行的平台。表3-2 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的主页地址为文献19。GDB是GNU
3、Project Debugger的缩写,用于调试Ada, C, C+, Objective-C, Pascal 和其他语言编写的程序20,这些程序可以运行在本地计算机上,也可以运行在远程计算机上。GDB可以运行在几乎所有的UNIX和微软Windows平台上。GDB主要能做下面4种事(以及由它们所支持的其他事情):1)启动程序,指定可能影响程序运行的任何条件;2)指定程序在一定条件下停止;3)检查当程序停止时发生的事情;4)通过改变程序中的某些条件,测试可能造成的软件错误,还可以由此学习其他的软件错误。GDB可以做源代码级别的程序调试(需要在编译时指定相应条件),也可以做二进制级别的程序调试。三
4、、实验内容及步骤本次实验以一个简单的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:
5、%in, iOutput);return 0;calc.c的文件内容为:#include int calc(int iIn)int i = 0, iOut = 0;iOut = iIn;for(i = 0; i gdbGNU gdb 5.1.1Copyright 2002 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 unde
6、r certain conditions.Type show copying to see the conditions.There is absolutely no warranty for GDB. Type show warranty for details.This GDB was configured as i386-suse-linux.(gdb) helpList of classes of commands:aliases - Aliases of other commandsbreakpoints - Making program stop at certain points
7、data - Examining datafiles - Specifying and examining filesinternals - Maintenance commandsobscure - Obscure featuresrunning - Running the programstack - Examining the stackstatus - Status inquiriessupport - Support facilitiestracepoints - Tracing of program execution without stopping the programuse
8、r-defined - User-defined commandsType help followed by a class name for a list of commands in that class.Type help followed by command name for full documentation.Command name abbreviations are allowed if unambiguous.(gdb)gdb的命令很多,gdb把之分成许多个种类。help命令只是例出gdb的命令种类,如果要看种类中的命令,可以使用help 命令,如:help breakpo
9、ints,查看设置断点的所有命令。也可以直接help 来查看命令的帮助。gdb中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令,在Linux下,可以敲击两次TAB键来补齐命令的全称,如果有重复的,那么gdb会把其例出来。示例一:在进入函数func时,设置一个断点。可以敲入break func,或是直接就是b func(gdb) b funcBreakpoint 1 at 0x8048458: file hello.c, line 10.示例二:敲入b按两次TAB键,会看到所有b打头的命令:(gdb) bbacktrace bre
10、ak bt(gdb)示例三:只记得函数的前缀,可以这样:(gdb) b make_ (再按下一次TAB键,会看到:)make_a_section_from_file make_environmake_abs_section make_function_typemake_blockvector make_pointer_typemake_cleanup make_reference_typemake_command make_symbol_completion_list(gdb) b make_GDB把所有make开头的函数全部例出来给查看。示例四:调试C+的程序时,可以同样看到函数名。如:(g
11、db) b bubble( M-?bubble(double,double) bubble(int,int)(gdb) b bubble(可以查看到C+中的所有的重载函数及参数。(注:M-?和“按两次TAB键”是一个意思)要退出gdb时,只用发quit或命令简称q就行了。2)GDB中运行Linux的shell程序 在gdb环境中,可以执行Linux的shell的命令,使用gdb的shell命令来完成:shell调用Linux的shell来执行,环境变量SHELL中定义的Linux的shell将会被用来执行,如果SHELL没有定义,那就使用Linux的标准shell:/bin/sh。(在Wind
12、ows中使用C或cmd.exe)3)在GDB中运行程序当以gdb 方式启动gdb后,gdb会在PATH路径和当前目录中搜索的源文件。如要确认gdb是否读到源文件,可使用l或list命令,看看gdb是否能列出源代码。在gdb中,运行程序使用r或是run命令。程序的运行,有可能需要设置下面四方面的事。i) 程序运行参数。set args 可指定运行时参数。(如:set args 10 20 30 40 50)show args 命令可以查看设置好的运行参数。ii) 运行环境。Path可设定程序的运行路径。show paths 查看程序的运行路径。set environment varname =v
13、alue 设置环境变量。如:set env USER=hchenshow environment varname 查看环境变量。iii) 工作目录。cd相当于shell的cd命令。pwd 显示当前的所在目录。iv) 程序的输入输出。info terminal 显示程序用到的终端的模式。使用重定向控制程序输出。如:run outfiletty命令可以指写输入输出的终端设备。如:tty /dev/ttyb3)调试已运行的程序两种方法:i) 在Linux下用ps查看正在运行的程序的PID(进程ID),然后用gdb PID格式挂接正在运行的程序。ii) 先用gdb 关联上源代码,并进行gdb,在gdb
14、中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。4)暂停 / 恢复程序运行调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行。可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于查看运行时的变量,以及运行时的流程。当进程被gdb停住时,可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)。如果要恢复程序运行,可以
15、使用c或是continue命令。i) 设置断点(BreakPoint)用break命令来设置断点,有几点设置断点的方法:break在进入指定函数时停住。break +offset,break offset,在当前行号的前面或后面的offset行停住。offiset为自然数。break filename:linenum,在源文件filename的linenum行处停住。break filename:function,在源文件filename的function函数的入口处停住。break *address,在程序运行的内存地址处停住。break命令没有参数时,表示在下一条指令处停住。break .
16、 if condition,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。查看断点时,可使用info命令,如下所示:(注:n表示断点号)info breakpoints ninfo break nii) 设置观察点(WatchPoint)观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。有下面的几种方法来设置观察点:watch expr,为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。rwatch,当表达式(变量)expr被读时,停住程序。a
17、watch,当表达式(变量)的值被读或被写时,停住程序。info watchpoints,列出当前所设置了的所有观察点。iii) 设置捕捉点(CatchPoint)可设置捕捉点来捕捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C+的异常。设置捕捉点的格式为:catch event,当event发生时,停住程序。event可以是下面的内容:l throw 一个C+抛出的异常。(throw为关键字)l catch 一个C+捕捉到的异常。(catch为关键字)l exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)l fork 调用系统调用fork时。(f
18、ork为关键字,目前此功能只在HP-UX下有用)l vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)l load 或 load 载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)l unload 或 unload 卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)l tcatch,只设置一次捕捉点,当程序停住以后,应点被自动删除。iv) 维护停止点上面说了如何设置程序的停止点,GDB中的停止点也就是上述的三类。在GDB中,如果觉得已定义好的停止点没有用了,可以使用delete、clear
19、、disable、enable这几个命令来进行维护。clear清除所有的已定义的停止点。clearclear清除所有设置在函数上的停止点。clearclear清除所有设置在指定行上的停止点。delete breakpoints range.删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当还需要时,enable即可,就好像回收站一样。disable breakpoints range.disable所指定的停止
20、点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。简写命令是dis.enable breakpoints range.enable所指定的停止点,breakpoints为停止点号。enable breakpoints once range.enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable。enable breakpoints delete range.enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。v) 停止条件维护前面在说到设置断点时,我们提到过可以设置一个条件,当条件成立时,程序自动停止,
21、这是一个非常强大的功能。一般来说,为断点设置一个条件,我们使用if关键词,后面跟其断点条件。并且,条件设置好后,我们可以用condition命令来修改断点的条件。(只有 break和watch命令支持if,catch目前暂不支持if condition 修改断点号为bnum的停止条件为expression。condition清除断点号为bnum的停止条件。还有一个比较特殊的维护命令ignore,可以指定程序运行时,忽略停止条件几次。ignore 表示忽略断点号为bnum的停止条件count次。vi) 为停止点设定运行命令可以使用GDB提供的command命令来设置停止点的运行命令。也就是说,当
22、运行的程序在被停止住时,我们可以让其自动运行一些别的命令,这很有利行自动化调试。对基于GDB的自动化调试是一个强大的支持。commands bnum. command-list .end为断点号bnum指写一个命令列表。当程序被该断点停住时,gdb会依次运行命令列表中的命令。例如:break foo if x0commandsprintf x is %dn,xcontinueend断点设置在函数foo中,断点条件是x0,如果程序被断住后,也就是,一旦x的值在foo函数中大于0,GDB会自动打印出x的值,并继续运行程序。如果要清除断点上的命令序列,那么只要简单的执行一下commands命令,并直
23、接在打个end就行了。vii) 断点菜单在C+中,可能会重复出现同一个名字的函数若干次(函数重载),在这种情况下,break 不能告诉GDB要停在哪个函数的入口。当然,可以使用break 也就是把函数的参数类型告诉GDB,以指定一个函数。否则的话,GDB会列出一个断点菜单供选择所需要的断点。只要输入菜单列表中的编号就可以了。如:(gdb) b String:after0 cancel1 all2 file:String.cc; line number:8673 file:String.cc; line number:8604 file:String.cc; line number:8755 f
24、ile:String.cc; line number:8536 file:String.cc; line number:8467 file:String.cc; line number:735 2 4 6Breakpoint 1 at 0xb26c: file String.cc, line 867.Breakpoint 2 at 0xb344: file String.cc, line 875.Breakpoint 3 at 0xafcc: file String.cc, line 846.Multiple breakpoints were set.Use the delete comman
25、d to delete unwantedbreakpoints.(gdb)可见,GDB列出了所有after的重载函数,可以选一下列表编号就行了。0表示放弃设置断点,1表示所有函数都设置断点。viii) 恢复程序运行和单步调试当程序被停住了,可以用continue命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用step或next命令单步跟踪程序。continue ignore-countc ignore-countfg ignore-count恢复程序运行,直到程序结束,或是下一个断点到来。ignore-count表示忽略其后的断点次数。continue,c,fg三个命令都是一样的意
26、思。step单步跟踪,如果有函数调用,它会进入该函数。进入函数的前提是,此函数被编译有debug信息。很像VC等工具中的step in。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。next同样单步跟踪,如果有函数调用,它不会进入该函数。很像VC等工具中的step over。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。set step-modeset step-mode on打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看
27、机器码。set step-mod off关闭step-mode模式。finish运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。until 或 u当厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。stepi 或 sinexti 或 ni单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。与之一样有相同功能的命令是 “display/i $pc” ,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码)ix) 信号(Signals)信号是一种软中断,是一种处理异步事
28、件的方法。一般来说,操作系统都支持许多信号。尤其是LINUX,比较重要应用程序一般都会处理信号。LINUX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号; SIGKILL表示终止程序运行的信号,等等。信号量编程是LINUX下非常重要的一种技术。GDB有能力在调试程序的时候处理任何一种信号,可以告诉GDB需要处理哪一种信号。可以要求GDB收到所指定的信号时,马上停住正在运行的程序,以供进行调试。可以用GDB的handle命令来完成这一功能。handle在GDB中定义一个信号处理。信号可以以SIG开头
29、或不以SIG开头,可以用定义一个要处理信号的范围(如:SIGIO-SIGKILL,表示处理从 SIGIO信号到SIGKILL的信号,其中包括SIGIO,SIGIOT,SIGKILL三个信号),也可以使用关键字all来标明要处理所有的信号。一旦被调试的程序接收到信号,运行程序马上会被GDB停住,以供调试。其可以是以下几种关键字的一个或多个。nostop当被调试的程序收到信号时,GDB不会停住程序的运行,但会打出消息告诉收到这种信号。stop当被调试的程序收到信号时,GDB会停住的程序。print当被调试的程序收到信号时,GDB会显示出一条信息。noprint当被调试的程序收到信号时,GDB不会告
30、诉收到信号的信息。passnoignore当被调试的程序收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程序会处理。nopassignore当被调试的程序收到信号时,GDB不会让被调试程序来处理这个信号。info signalsinfo handle查看有哪些信号在被GDB检测中。x) 线程(Thread Stops)如果程序是多线程的话,可以定义的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易完成这一工作。break threadbreak thread if .linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是G
31、DB分配的,可以通过“info threads”命令来查看正在运行程序中的线程信息。如果不指定thread 则表示断点设在所有线程上面。还可以为某线程指定断点条件。如:(gdb) break frik.c:13 thread 28 if bartab lim当程序被GDB停住时,所有的运行线程都会被停住。这方便查看运行程序的总体情况。而在恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。查看栈信息当程序被停住了,需要做的第一件事就是查看程序是在哪里停住的。当程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。可以用GDB命令来查看当前的栈中的信息。下面是一些查看函数调用栈信息的GDB命令:backtracebt打印当前的函数调用栈的所有信息。如:(gdb) bt#0 func (n=250) at tst.c:6#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30#2 0x400409ed in _libc_start_main () from /lib/libc.so.6从上可以看出函数的调用栈信息:_libc_start_main - mai
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中西医助理医师考试中医内科学总结要点大全
- 中考英语各种题材阅读理解强化训练(附详解)
- 农田劳务合同(2篇)
- 2024年度天津市公共营养师之二级营养师通关考试题库带答案解析
- 2025关于劳动合同的相关问题
- 2024年度四川省公共营养师之四级营养师测试卷(含答案)
- 2025改造工程施工合同
- 建筑CAD知识点231任务描述和分析88课件讲解
- 2025全程营销、宣传推广策划合同书
- 山药片项目可行性研究报告
- 新流动资金测算表(带公式)
- GB/T 4214.3-2023家用和类似用途电器噪声测试方法洗碗机的特殊要求
- 建设工程质量控制讲义三
- YY/T 0606.7-2008组织工程医疗产品第7部分:壳聚糖
- 2023年辽宁轨道交通职业学院高职单招(英语)试题库含答案解析
- GB/T 29076-2021航天产品质量问题归零实施要求
- DL-T 5190.1-2022 电力建设施工技术规范 第1部分:土建结构工程(附条文说明)
- 殡葬服务人才需求调研报告
- 降低锐器盒不规肾内科品管圈课件
- 《了凡四训》课件
- 细节描写优秀课件
评论
0/150
提交评论