ImageVerifierCode 换一换
格式:DOC , 页数:45 ,大小:267KB ,
资源ID:7679642      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/7679642.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(Unix&Linux下C开发指南.doc)为本站上传会员【xrp****65】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

Unix&Linux下C开发指南.doc

1、 Unix&Linux下 C开发指南 二零零七年十月 第一章 LINUX 的编程环境 4 1. Linux 的编程环境 4 函数库和系统调用 4 在线文档 (man, info, HOW-TO, ...) 5 C 语言编程风格 7 库和头文件的保存位置 9 共享库及其相关配置 9 2. Linux 上进行程序开发的典型场景 10 控制台上的开发场景 10 X Window 上的开发场景 10 3. 程序和脚本 10 程序脚本:编写, 编

2、译, 调试和执行 10 第二章 LINUX 上的 C编译器和调试器 11 1. GNU C 编译器 12 2. 优 化 选 项 13 3. 用 gdb 调试 GCC 程序 14 gdb 的常用命令 15 gdb 使用范例 16 4. 其他的 C 编程工具 25 5. 运行 gcc/egcs 33 6. gcc/egcs 的主要选项 35 7. 创建和使用静态库 35 8. 创建和使用共享库 35 9. 使用高级共享库特性 36 第三章 GNU MAKE 和 MAKEFILE 39 1. GNU make 39 2. makefile 基本结构 40 3. ma

3、kefile 变量 41 4. GNU make 的主要预定义变量 42 5. 隐含规则 42 6. 运行 make常用选项 43 第四章 LINUX下编程的实用工具及命令 44 6.9.1  正则表达式 44 压缩和归档工具 44 搜索和排序 45 文件编辑 45 文件比较 45 其他 45 第一章 Linux 的编程环境 1. Linux 的编程环境 主要内容: · 标准 (ANSI C, POSIX, SVID, XPG, ...) · 函数库和系统调用 · 在线文档 (man, info, HOW-TO, ...) · C 语言编程风格

4、 · 库和头文件的保存位置 · 共享库及其相关配置   函数库和系统调用 1. glibc 众所周知,C 语言并没有为常见的操作,例如输入/输出、内存管理,字符串操作等提供内置的支持。相反,这些功能一般由标准的“函数库”来提供。GNU 的 C 函数库,即 glibc,是 Linux 上最重要的函数库,它定义了 ISO C 标准指定的所有的库函数,以及由 POSIX 或其他 UNIX 操作系统统变种指定的附加特色,还包括有与 GNU 系统相关的扩展。目前,流行的 Linux 系统使用 glibc 2.0 以上的版本。glibc 基于如下标准: · ISO C: C 编程语言的国际

5、标准,即 ANSI C。 · POSIX:GNU C 函数库实现了 ISO/IEC 9945-1:1996 (POSIX 系统应用程序编程接口, 即 POSIX.1)指定的所有函数。该标准是对 ISO C 的扩展,包括文件系统接口原 语、设备相关的终端控制函数以及进程控制函数。同时,GUN C 函数库还支持部分由 ISO/IEC 9945-2:1993(POSIX Shell 和 工具标准,即 POSIX.2)指定的函数, 其中包括用于处理正则表达式和模式匹配的函数。 · Berkeley Unix:BSD 和 SunOS。GNU C 函数库定义了某些 UNIX 版本中尚未标准化的函数

6、 尤其是 4.2 BSD, 4.3 BSD, 4.4 BSD Unix 系统(即“Berkeley Unix”)以及“SunOS” (流行的 4.2 BSD 变种,其中包含有某些 Unix System V 的功能)。BSD 函数包括 符号链接、select 函数、BSD 信号处理函数以及套接字等等。 · SVID:System V 的接口描述。GNU C 函数库定义了大多数由 SVID 指定而未被 ISO C 和 POSIX 标准指定的函数。来自 System V 的支持函数包括进程间通信和共享内存、 hsearch 和 drand48 函数族、fmtmsg 以及一些数学函数。 ·

7、 XPG:X/Open 可移植性指南。GNU C 函数库遵循 X/Open 可移植性指南(Issue 4.2) 以及所有的 XSI(X/Open 系统接口)兼容系统的扩展,同时也遵循所有的 X/Open Unix 扩展。 2. 其他重要函数库 除 glibc 之外,流行的 Linux 发行版中还包含有一些其他的函数库,这些函数库具有重要地位,例如: GNU Libtool:GNU Libtool 实际是一个脚本生成工具,它可以为软件包开发者提供一般性 的共享库支持。以前,如果源代码包的开发者要利用共享库的优点,则必须为每个软件包可支持的平台编写 定制的支持代码。并且还需要设计配置接

8、口,以便软件包的安装程序能够正确选择要建立的 库类型。利用 GNU Libtool,则可以简化开发者的这一工作。它在一个单独的脚本中同时封装 了与平台相关的依赖性以及用户界面。GNU Libtool 可使每个宿主类型的完整功能可通过 一般性的接口获得,同时为程序员隐藏了宿主的特殊性。GNU Libtool 一致性接口是可靠的, 用户不必阅读那些晦涩的文档,以便在每个平台上建立共享库。他们只需运行软件包的配置 脚本,而由 libtool 完成繁复的工作。 CrackLib:CrackLib 为用户提供了一个 C 语言函数接口,利用这一函数,可避免用户选择 容易破解的密码。该函数库可在类似

9、passwd 的程序中使用。 LibGTop:LibGTop 是一个能够获取进程信息以及系统运行信息的函数库,这些信息包括: 系统的一般信息、SYS V IPC 限制、进程列表、进程信息、进程映射、文件系统使用信息等。 图形文件操作函数库:包括 libungif、libtiff、libpng、Imlib, libjpeg 等,可分别用来操作 GIF、TIFF、PNG、JPEG 以及其他一些格式图形文件。 3. 系统调用 系统调用是操作系统提供给外部程序的接口。在 C 语言中,操作系统的系统调用通常通过函数调用的形式完成,这是因为这些函数封装了系统调用的细节,将系统调用的入口

10、参数以及返回值用 C 语言的函数调用过程实现。在 Linux 系统中,系统调用函数定义在 glibc 中。 · 谈到系统调用时,需要注意如下几点: · 系统调用函数通常在成功时返回 0 值,不成功时返回非零值。如果要检查失败原因,则 要判断 errno 这个全局变量的值,errno 中包含有错误代码。 · 许多系统调用的返回数据通常通过引用参数传递。这时,需要在函数参数中传递一个 缓冲区地址,而返回的数据就保存在该缓冲区中。 · 不能认为系统调用函数就要比其他函数的执行效率高。要注意,系统调用是一个非常耗时 的过程。 · 有关系统调用我们将在以后详细讲述。  在线文档

11、man, info, HOW-TO, ...) 1. man man,即 manunal,是 UNIX 系统手册的电子版本。根据习惯,UNIX 系统手册通常分为不同的部分(或小节,即 section),每个小节阐述不同的系统内容。目前的小节划分如下: 1. 命令:普通用户命令 2. 系统调用:内核接口 3. 函数库调用:普通函数库中的函数 4. 特殊文件:/dev 目录中的特殊文件 5. 文件格式和约定:/etc/passwd 等文件的格式 6. 游戏。 7. 杂项和约定:标准文件系统布局、手册页结构等杂项内容 8. 系统管理命令。 9. 内核例程:

12、非标准的手册小节。便于 Linux 内核的开发而包含 其他手册小节: · l: PostgreSQL 数据库命令 · n: TCL/TK 命令 手册页一般保存在 /usr/man 目录下,其中每个子目录(如 man1, man2, ..., manl, mann)包含不同的手册小节。使用 man 命令查看手册页。 man 命令行:man [-acdfFhkKtwW] [-m system] [-p string] [-C config_file] [-M path] [-P pager] [-S section_list] [section] name 常用命令行: $

13、man open $ man 7 man $ man ./myman.3 2. info Linux 中的大多数软件开发工具都是来自自由软件基金会的 GNU 项目,这些工具软件件的在线文档都以 info 文件的形式存在。info 程序是 GNU 的超文本帮助系统。 info 文档一般保存在 /usr/info 目录下,使用 info 命令查看 info 文档。要运行 info,可以在 shell 提示符后输入 info,也可以在 GNU 的 emacs 中键入 Esc-x 后跟 info。 · info 帮助系统的初始屏幕显示了一个主题目录,你可以将光标移动到带有 * 的主题菜

14、单上面,然后按回车键 · 进入该主题,也可以键入 m,后跟主题菜单的名称而进入该主题。例如,你可以键入 m,然后再键入 gcc 而进 · 进入 gcc 主题中。 · 如果你要在主题之间跳转,则必须记住如下的几个命令键: · * n:跳转到该节点的下一个节点; · * p:跳转到该节点的上一个节点; · * m: 指定菜单名而选择另外一个节点; · * f:进入交叉引用主题; · * l:进入该窗口中的最后一个节点; · * TAB:跳转到该窗口的下一个超文本链接; · * RET:进入光标处的超文本链接; · * u:转到上一级主题; · * d:回到 info 的初始

15、节点目录; · * h:调出 info 教程; · * q:退出 info。 3. HOW-TO 可供用户参考的联机文档的另一种形式是 HOWTO 文件,这些文件位于系统的 /usr/doc/HOWTO 目录下。 HOWTO 文件的文件名都有一个 -HOWTO 后缀,并且都是文本文件。 每一个 HOWTO 文件包含 Linux 某一方面的信息,例如它支持的硬件或如何建立一个引导盘。 要想查看这些文件,进入 /usr/doc/HOWTO 目录,使用 more 命令,具体形式如下: $ cd /usr/doc/HOWTO; more topic-name-HOWTO 另外,HO

16、WTO 文档还有其他格式的文件,例如 HTML 和 PS 等,保存在 /usr/doc/HOWTO/other-formats 下。 4. 其他 Linux 的内核文档一般包含在内核源代码中,目录如下:/usr/src/linux-2.x.x/Documentation /usr/doc 目录下包含有大量与特定软件或函数库相关的说明性文档。  C 语言编程风格 编写这一小节的目的是提醒大家在编程过程中注意编程风格。如果你只是在编写一些小的练习程序,程序只有一两百行长的话,编程风格可能并不重要。然而,如果你和许多人一起进行开发工作,或者,你希望在过一段时间之后,还能够正确理解自己

17、的程序的话,就必须养成良好的编程习惯。在诸多编程习惯当中,编程风格是最重要的一项内容。 良好的编程风格可以在许多方面帮助开发人员。如果你阅读过 Linux 内核源代码的话,可能会对程序的优美编排所倾倒。良好的编程风格可以增加代码的可读性,并帮助你理清头绪。如果程序非常杂乱,大概看一眼就该让你晕头转向了。编程风格最能体现一个程序员的综合素质。 许多读者可能对 Windows 所推崇的匈牙利命名法很熟悉。这种方法定义了非常复杂的函数、变量、类型等的命名方法,典型的命名方法是采用大小写混写的方式,对于变量名称,则采用添加前缀的办法来表示其类型,例如: char szBuffer[20

18、]; int nCount; 利用 sz 和 n 分别代表字符串和整数。为了表示一个变量名称,采用如下的变量名称是可能的: int iThisIsAVeryLongVariable; 在 Linux 中,我们经常看到的是定义非常简单的函数接口和变量名称。在 Linux 内核的源代码中,可以看到 Linux 内核源代码的编码风格说明(/ Documentation/CodingStyle)。UNIX 系统的一个特点是设计精巧,并遵守积木式原则。C 语言最初来自 UNIX 操作系统,与 UNIX 的设计原则一样, C 语言被广泛认可和使用的一个重要原因是它的灵活性以及简洁性。因此,

19、在利用 C 语言编写程序时,始终应当符合其简洁的设计原则,而不应当使用非常复杂的变量命名方法。Linus 为 Linux 内核定义的 C 语言编码风格要点如下: 1. 缩进时,使用长度为 8 个字符宽的 Tab 键。如果程序的缩进超过 3 级,则应考虑重新设计程序。 2. 大括号的位置。除函数的定义体外,应当将左大括号放在行尾,而将右大括号放在行首。函数的定义体应将左右大括号放在行首。如下所示: int function(int x, int y) {         if (x == y) {                 ...         } else if (x

20、 > y) {                 ...         } else {                 ...         }         return 0; } 应采用简洁的命名方法。对变量名,不赞成使用大小写混写的形式,但鼓励使用描述性的名称;尽可能不使用全局变量;不采用匈牙利命名法表示变量的类型;采用短小精悍的名称表示局部变量;保持函数短小,从而避免使用过多的局部变量。 保持函数短小精悍。 不应过分强调注释的作用,应尽量采用好的编码风格而不是添加过多的注释。 库和头文件的保存位置 1. 函数库 · /lib:系统必备共享库

21、· /usr/lib:标准共享库和静态库 · /usr/i486-linux-libc5/lib:libc5 兼容性函数库 · /usr/X11R6/lib:X11R6 的函数库 · /usr/local/lib:本地函数库 2. 头文件 · /usr/include:系统头文件 · /usr/local/include:本地头文件  共享库及其相关配置 · /etc/ld.so.conf:包含共享库的搜索位置 · ldconfig:共享库管理工具,一般在更新了共享库之后要运行该命令 · ldd:可查看可执行文件所使用的共享库 2.   Linux 上进

22、行程序开发的典型场景 · 控制台上的开发场景 · X Window 上的开发场景   控制台上的开发场景 在控制台上利用 vim 编辑器编写“Hello, world!”程序,并在命令行编译并运行。   X Window 上的开发场景 在 X Window 上利用 Emacs 编写“Hello, world!”程序,并在 Emacs 中直接编译并运行。 3.  程序和脚本 · 程序:编写, 编译, 调试和执行 · 脚本:编写, 执行  程序脚本:编写, 编译, 调试和执行 第二章 Linux 上的 C编译器和调试器 Linux的发行版中包含了很多软件开

23、发工具. 它们中的很多是用于 C 和 C++应用程序开发的.本教材介绍了在 Linux 下能用于 C 应用程序开发和调试的工具. 本章的主旨是介绍如何在 Linux 下使用 C 编译器和其他 C 编程工具, 而非 C 语言编程的教程. 在本章中你将学到以下知识:   · 什么是 C · GNU C 编译器 · 用 gdb 来调试GCC应用程序     你也能看到随 Linux 发行的其他有用的 C 编程工具. 这些工具包括源程序美化程序(pretty print programs), 附加的调试工具, 函数原型自动生成工具(automatic function prototyp

24、ers). 什么是 C? C 是一种在 UNIX 操作系统的早期就被广泛使用的通用编程语言. 它最早是由贝尔实验室的 Dennis Ritchie 为了 UNIX 的辅助开发而写的, 开始时 UNIX 是用汇编语言和一种叫 B 的语言编写的. 从那时候起, C 就成为世界上使用最广泛计算机语言.     C 能在编程领域里得到如此广泛支持的原因有以下一些: · 它是一种非常通用的语言. 几乎你所能想到的任何一种计算机上都有至少一种能用的 C 编译器. 并且它的语法和函数库在不同的平台上都是统一的, 这个特性对开发者来说很有吸引力. · 用 C 写的程序执行速度很快.

25、· C 是所有版本的UNIX上的系统语言.     C 在过去的二十年中有了很大的发展. 在80年代末期美国国家标准协会(American National Standards Institute)发布了一个被称为 ANSI C 的 C 语言标准.这更加保证了将来在不同平台上的 C 的一致性. 在80年代还出现了一种 C 的面向对象的扩展称为 C++. C++ 将在另一篇文章 "C++ 编程"中描述.     Linux 上可用的 C 编译器是 GNU C 编译器, 它建立在自由软件基金会的编程许可证的基础上, 因此可以自由发布. 你能在 Linux 的发行光盘上找到它.  1.

26、 GNU C 编译器     随 Slackware Linux 发行的 GNU C 编译器(GCC)是一个全功能的 ANSI C 兼容编译器. 如果你熟悉其他操作系统或硬件平台上的一种 C 编译器, 你将能很快地掌握 GCC. 本节将介绍如何使用 GCC 和一些 GCC 编译器最常用的选项.   使用 GCC     通常后跟一些选项和文件名来使用 GCC 编译器. gcc 命令的基本用法如下: gcc [options] [filenames]     命令行选项指定的操作将在命令行上每个给出的文件上执行. 下一小节将叙述一些你会最常用到的选项.   GCC 选项

27、    GCC 有超过100个的编译选项可用. 这些选项中的许多你可能永远都不会用到, 但一些主要的选项将会频繁用到. 很多的 GCC 选项包括一个以上的字符. 因此你必须为每个选项指定各自的连字符, 并且就象大多数 Linux 命令一样你不能在一个单独的连字符后跟一组选项. 例如, 下面的两个命令是不同的: gcc -p -g test.c gcc -pg test.c 第一条命令告诉 GCC 编译 test.c 时为 prof 命令建立剖析(profile)信息并且把调试信息加入到可执行的文件里. 第二条命令只告诉 GCC 为 gprof 命令建立剖析信息. 当你不用任何选项编

28、译一个程序时, GCC 将会建立(假定编译成功)一个名为 a.out 的可执行文件. 例如, 下面的命令将在当前目录下产生一个叫 a.out 的文件: gcc test.c     你能用 -o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out. 例如, 将一个叫 count.c 的 C 程序编译为名叫 count 的可执行文件, 你将输入下面的命令: gcc -o count count.c 注意: 当你使用 -o 选项时, -o 后面必须跟一个文件名.      GCC 同样有指定编译器处理多少的编译选项. -c 选项告诉 GCC 仅把源代码编译为目标代码而跳

29、过汇编和连接的步骤. 这个选项使用的非常频繁因为它使得编译多个 C 程序时速度更快并且更易于管理. 缺省时 GCC 建立的目标代码文件有一个 .o 的扩展名.     -S 编译选项告诉 GCC 在为 C 代码产生了汇编语言文件后停止编译. GCC 产生的汇编语言文件的缺省扩展名是 .s . -E 选项指示编译器仅对输入文件进行预处理. 当这个选项被使用时, 预处理器的输出被送到标准输出而不是储存在文件里. 2. 优 化 选 项     当你用 GCC 编译 C 代码时, 它会试着用最少的时间完成编译并且使编译后的代码易于调试. 易于调试意味着编译后的代码与源代码有同样的执行次序,

30、编译后的代码没有经过优化. 有很多选项可用于告诉 GCC 在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件. 这些选项中最典型的是-O 和 -O2 选项.     -O 选项告诉 GCC 对源代码进行基本优化. 这些优化在大多数情况下都会使程序执行的更快. -O2 选项告诉 GCC 产生尽可能小和尽可能快的代码. -O2 选项将使编译的速度比使用 -O 时慢. 但通常产生的代码执行速度会更快.     除了 -O 和 -O2 优化选项外, 还有一些低级选项用于产生更快的代码. 这些选项非常的特殊, 而且最好只有当你完全理解这些选项将会对编译后的代码产生什么样的效果时再去

31、使用. 这些选项的详细描述, 请参考 GCC 的指南页, 在命令行上键入 man gcc . 调试和剖析选项 GCC 支持数种调试和剖析选项. 在这些选项里你会最常用到的是 -g 和 -pg 选项.     -g 选项告诉 GCC 产生能被 GNU 调试器使用的调试信息以便调试你的程序. GCC 提供了一个很多其他 C 编译器里没有的特性, 在 GCC 里你能使 -g 和 -O (产生优化代码)联用. 这一点非常有用因为你能在与最终产品尽可能相近的情况下调试你的代码. 在你同时使用这两个选项时你必须清楚你所写的某些代码已经在优化时被 GCC 作了改动. 关于调试 C 程序的更多信息请

32、看下一节"用 gdb 调试 C 程序"  .     -pg 选项告诉 GCC 在你的程序里加入额外的代码, 执行时, 产生 gprof 用的剖析信息以显示你的程序的耗时情况. 关于 gprof 的更多信息请参考 "gprof" 一节.   3. 用 gdb 调试 GCC 程序     Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些介绍: · GNU 的调试器称为 gdb,该程序是一个交互式工具,工作在字符模式。在 X Wi

33、ndow 系统中, · 有一个 gdb 的前端图形工具,称为 xxgdb。gdb 是功能强大的调试程序,可完成如下的调试 · 任务: * 设置断点; * 监视程序变量的值; * 程序的单步执行; * 修改变量的值。 在可以使用 gdb 调试程序之前,必须使用 -g 选项编译源文件。可在 makefile 中如下定义 CFLAGS 变量: CFLAGS = -g 运行 gdb 调试程序时通常使用如下的命令: gdb progname 在 gdb 提示符处键入help,将列出命令的分类,主要的分类有: * aliases:命令别名 * breakpoints:断点定义

34、 * data:数据查看; * files:指定并查看文件; * internals:维护命令; * running:程序执行; * stack:调用栈查看; * statu:状态查看; * tracepoints:跟踪程序执行。 键入 help 后跟命令的分类名,可获得该类命令的详细清单。   gdb 的常用命令 命令 解释 break NUM 在指定的行上设置断点。 bt 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。

35、 clear 删除设置在特定源文件、特定行上的断点。其用法为:clear FILENAME:NUM。 continue 继续执行正在调试的程序。该命令用在程序由于处理信号或断点而导致停止运行时。 display EXPR 每次程序停止后显示表达式的值。表达式由程序定义的变量组成。 file FILE 装载指定的可执行文件进行调试。 help NAME 显示指定命令的帮助信息。 info break 显示当前断点清单

36、包括到达断点处的次数等。 info files 显示被调试文件的详细信息。 info func 显示所有的函数名称。 info local 显示当函数中的局部变量信息。 info prog 显示被调试程序的执行状态。 info var 显示所有的全局和静态变量名称。 kill 终止正被调试的程序。 list 显示源代码段。 make

37、 在不退出 gdb 的情况下运行 make 工具。 next 在不单步执行进入其他函数的情况下,向前执行一行源代码。 print EXPR 显示表达式 EXPR 的值。  gdb 使用范例 ----------------- 清单 一个有错误的 C 源程序 bugging.c ----------------- #include #include static char buff [256]; static char* string; int main

38、) { printf ("Please input a string: "); gets (string); printf ("\nYour string is: %s\n", string); } ----------------- 上面这个程序非常简单,其目的是接受用户的输入,然后将用户的输入打印出来。该程序使用了 一个未经过初始化的字符串地址 string,因此,编译并运行之后,将出现 Segment Fault 错误: $ gcc -o test -g test.c $ ./test Please input a string:

39、asfd Segmentation fault (core dumped) 为了查找该程序中出现的问题,我们利用 gdb,并按如下的步骤进行: 1.运行 gdb bugging 命令,装入 bugging 可执行文件; 2.执行装入的 bugging 命令; 3.使用 where 命令查看程序出错的地方; 4.利用 list 命令查看调用 gets 函数附近的代码; 5.唯一能够导致 gets 函数出错的因素就是变量 string。用 print 命令查看 string 的值; 6.在 gdb 中,我们可以直接修改变量的值,只要将 string 取一个合法的指针值就可以了,为

40、 此,我们在第 11 行处设置断点; 7.程序重新运行到第 11 行处停止,这时,我们可以用 set variable 命令修改 string 的取值; 8.然后继续运行,将看到正确的程序运行结果。 它使你能监视你程序中变量的值. 它使你能设置断点以使程序在指定的代码行上停止执行. 它使你能一行行的执行你的代码.      GDB的运行 在命令行上键入 gdb 并按回车键就可以运行 gdb 了, 如果一切正常的话, gdb 将被启动并且你将在屏幕上看到类似的内容: GDB is free software and you are welcome to distribut

41、e copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.14 (i486-slakware-linux), Copyright 1995 Free Software Foundation, Inc. (gdb)     当你启动 gdb 后, 你能在命令行上指定很多的选项. 你也可以以下面的方式来运行 gdb :

42、 gdb     当你用这种方式运行 gdb , 你能直接指定想要调试的程序. 这将告诉gdb 装入名为 fname 的可执行文件. 你也可以用 gdb 去检查一个因程序异常终止而产生的 core 文件, 或者与一个正在运行的程序相连. 你可以参考 gdb 指南页或在命令行上键入 gdb -h 得到一个有关这些选项的说明的简单列表.   为调试编译代码(Compiling Code for Debugging)     为了使 gdb 正常工作, 你必须使你的程序在编译时包含调试信息. 调试信息包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号. 

43、 gdb 利用这些信息使源代码和机器码相关联.     在编译时用 -g 选项打开调试选项.   gdb 基本命令      gdb 支持很多的命令使你能实现不同的功能. 这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复杂命令, 表1列出了你在用 gdb 调试时会用到的一些命令. 想了解 gdb 的详细使用请参考 gdb 的指南页.   表 1. 基本 gdb 命令.   命   令 描  述 file 装入想要调试的可执行文件. kill 终止正在调试的程序. list 列出产生执行文件的源代码的一部分. next 执行一行源代码但不进入函数内部.

44、 step 执行一行源代码而且进入函数内部. run 执行当前被调试的程序 quit 终止 gdb watch 使你能监视一个变量的值而不管它何时被改变. break 在代码里设置断点, 这将使程序执行到这里时被挂起. make 使你能不退出 gdb 就可以重新产生可执行文件. shell 使你能不离开 gdb 就执行 UNIX shell 命令.           gdb 支持很多与 UNIX shell 程序一样的命令编辑特征. 你能象在 bash 或 tcsh里那样按 Tab 键让 gdb 帮你补齐一个唯一的命令, 如果不唯一的话 gdb 会列出所有匹

45、配的命令. 你也能用光标键上下翻动历史命令. gdb 应用举例 本节用一个实例教你一步步的用 gdb 调试程序. 被调试的程序相当的简单, 但它展示了 gdb 的典型应用. 下面列出了将被调试的程序. 这个程序被称为 greeting , 它显示一个简单的问候, 再用反序将它列出. #include  main () {   char my_string[] = "hello there";   my_print (my_string);   my_print2 (my_string); } void my_print (char *string

46、) {   printf ("The string is %s\n", string); } void my_print2 (char *string) {   char *string2;   int size, i;   size = strlen (string);   string2 = (char *) malloc (size + 1);   for (i = 0; i < size; i++)     string2[size - i] = string[i];   string2[size+1] = `\0';   printf ("The strin

47、g printed backward is %s\n", string2); }     用下面的命令编译它:   gcc -o test test.c     这个程序执行时显示如下结果: The string is hello there The string printed backward is     输出的第一行是正确的, 但第二行打印出的东西并不是我们所期望的. 我们所设想的输出应该是: The string printed backward is ereht olleh     由于某些原因, my_print2 函数没有正常工作. 让我们用  gdb

48、看看问题究竟出在哪儿, 先键入如下命令:   gdb greeting 注意: 记得在编译 greeting 程序时把调试选项打开.      如果你在输入命令时忘了把要调试的程序作为参数传给 gdb , 你可以在 gdb 提示符下用 file 命令来载入它:   (gdb) file greeting     这个命令将载入 greeting 可执行文件就象你在 gdb 命令行里装入它一样.     这时你能用 gdb 的 run 命令来运行 greeting 了. 当它在 gdb 里被运行后结果大约会象这样: (gdb) run Starting program: /

49、root/greeting The string is hello there The string printed backward is Program exited with code 041     这个输出和在 gdb 外面运行的结果一样. 问题是, 为什么反序打印没有工作? 为了找出症结所在, 我们可以在 my_print2 函数的 for 语句后设一个断点, 具体的做法是在 gdb 提示符下键入 list 命令三次, 列出源代码: (gdb) list (gdb) list (gdb) list 技巧:  在 gdb 提示符下按回车健将重复上一个命令.   

50、   第一次键入 list 命令的输出如下:   1       #include  2 3      main () 4       { 5         char my_string[] = "hello there"; 6 7         my_print (my_string); 8         my_print2 (my_string); 9       } 10     如果按下回车, gdb 将再执行一次 list 命令, 给出下列输出:   11      my_print (char *string) 12   

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服