软件调试的艺术

当前位置:首页 > 计算机网络 > 软件工程/开发项目管理 > 软件调试的艺术

出版社:人民邮电出版社
出版日期:2009-11
ISBN:9787115213969
作者:Norman Matloff,Peter Jay Salzman
页数:216页

章节摘录

插图:1.3.1调试的本质:确认原则下面的规则是调试的本质。·确认的基本原则修正充满错误的程序,就是逐个确认,你自认为正确的许多事情所对应的代码确实是正确的。当你发现其中某个假设不成立时,就表示已经找到了关于程序错误所在位置(可能并不是准确的位置)的线索。换一种表达方式来说:惊讶是好事!当你认为关于程序的某件事情是正确的,而在确认它的过程中却失败了,你就会感到惊讶。但这种惊讶是好事,因为这种发现会引导你找到程序错误所在的位置。1.3.2调试工具对于确认原则的价值所在传统的调试技术只是向程序中添加跟踪代码以在程序执行时输出变量的值,例如使用printf()或COIlt语句输出变量的值。你可能会问:“这样操作够吗?为什么要使用GDB、DDD或Eclipse这样的调试工具?”首先,这种方法要求有策略地持续添加跟踪代码,重新编译程序,运行程序并分析跟踪代码的输出,在修正程序错误之后删除跟踪代码,并且针对发现的每个新的程序错误重复上述这些步骤。这种工作过程非常耗时,并且容易令人疲劳。最为重要的是,这些操作将你的注意力从实际任务转移开,并且降低了集中精力查找程序错误所需的推理过程的能力。相反,通过使甩DDD和Eclipse这样的图形调试工具,只需要将鼠标指针移动到代码显示中的变量实例上方就可以检查该变量的值,并且此时会显示该变量的当前值。为什么还要在整夜的调试中使用printf()语句来输出变量的值,使自己更加疲劳,等待更长的时间呢?放松心情,使用调试工具可以减少所花费的时间和需要忍受的厌烦感。

前言

“嘿,还真不错呢!”我们的学生Andrew首次认真使用调试工具后惊叹道。Andrew三年前在大一上编程课时就学过了调试工具,不过那时他只是将调试工具当做应付期末考试的内容来打发的。现在他已经大四了,教授强烈要求他停止采用输出语句进行调试的方法,改为使用正式调试工具。让Andrew喜出望外的是,他发现使用恰当的工具可以大大缩短调试时间。如今,在学生及已参加工作的程序员中,还有不少“Andrew”,但愿本书能帮助“Andrew们”发现调试工具的好处。但是,我们更希望本书能帮助那些已经使用了调试工具,但还无法确定在什么情况下该做什么事的程序员做出适当的判断。本书也适用于打算进一步学习调试工具及其幕后原理的人。 本书的编辑曾说过,很多调试知识以前都只是在圈子里口口相传,没有正式编著成书。本书将改变这一状况。本书回答了下列问题。 如何调试线程代码?为什么有时候断点最终出现的位置与原来设置的位置略有偏差?GDB的until命令为什么有时会跳到意想不到的地方?如何巧妙使用DDD和Eclipse?在当今普遍使用GUI的时代,像GDB这样的基于文本的应用程序还有价值吗?为什么当错误代码超出数组边界时不发生段错误?为什么要将我们的一个示例数据结构命名为nsp?

媒体关注与评论

“Linux/Unix平台的C程序员将从本书中获益最多,其他平台上的开发者也能从中学到宝贵的调试技术和秘诀。”.  ——D. Spinellis,Jolt奖获奖图书《高质量程序设计艺术》作者“本书是一部软件调试杰作,可以大大提升你的调试技术水平……所有编程入门课程都应该讲授其中的核心内容。我强烈推荐本书!”  ——Amazon读者评论

内容概要

Norman Matloff  美国加州大学戴维斯分校计算机科学教授,研究领域涉及并行处理(尤其是软件分布式共享内存)、计算机通信网络、数据安全及数学和应用统计等。他编写了很多开源软件包,创作的在线教程也深受欢迎。
Peter Jay Salzman 美国加州大学戴维斯分校理论物理博士,该校Linux用户组的创建者,同时维护着多个受欢迎的在线HOWTO。现在华尔街某金融企业做程序员。

书籍目录

第1章 预备知识 1
1.1 本书使用的调试工具 1
1.2 编程语言 2
1.3 调试的原则 2
1.3.1 调试的本质:确认原则 2
1.3.2 调试工具对于确认原则的价值所在 2
1.3.3 其他调试原则 3
1.4 对比基于文本的调试工具与基于GUI的调试工具,两者之间的折中方案 4
1.4.1 简要比较界面 4
1.4.2 折中方法 9
1.5 主要调试器操作 11
1.5.1 单步调试源代码 11
1.5.2 检查变量 12
1.5.3 在GDB、DDD和Eclipse中设置监视点以应对变量值的改变 14
1.5.4 上下移动调用栈 14
1.6 联机帮助 15
1.7 初涉调试会话 16
1.7.1 GDB方法 18
1.7.2 同样的会话在DDD中的情况 31
1.7.3 Eclipse中的会话 34
1.8 启动文件的使用 38
第2章 停下来环顾程序 39
2.1 暂停机制 39
2.2 断点概述 39
2.3 跟踪断点 40
2.3.1 GDB中的断点列表 40
2.3.2 DDD中的断点列表 41
2.3.3 Eclipse中的断点列表 42
2.4 设置断点 42
2.4.1 在GDB中设置断点 42
2.4.2 在DDD中设置断点 45
2.4.3 在Eclipse中设置断点 46
2.5 展开GDB示例 46
2.6 断点的持久性 48
2.7 删除和禁用断点 50
2.7.1 在GDB中删除断点 50
2.7.2 在GDB中禁用断点 51
2.7.3 在DDD中删除和禁用断点 51
2.7.4 在Eclipse中删除和禁用断点 53
2.7.5 在DDD中“移动”断点 53
2.7.6 DDD中的Undo/Redo断点动作 54
2.8 进一步介绍浏览断点属性 55
2.8.1 GDB 55
2.8.2 DDD 56
2.8.3 Eclipse 56
2.9 恢复执行 56
2.9.1 在GDB中 57
2.9.2 在DDD中 64
2.9.3 在Eclipse中 66
2.10 条件断点 66
2.10.1 GDB 67
2.10.2 DDD 69
2.10.3 Eclipse 69
2.11 断点命令列表 70
2.12 监视点 74
2.12.1 设置监视点 75
2.12.2 表达式 77
第3章 检查和设置变量 78
3.1 主要示例代码 78
3.2 变量的高级检查和设置 80
3.2.1 在GDB中检查 80
3.2.2 在DDD中检查 84
3.2.3 在Eclipse中检查 86
3.2.4 检查动态数组 88
3.2.5 C++代码的情况 90
3.2.6 监视局部变量 92
3.2.7 直接检查内存 92
3.2.8 print和display的高级选项 93
3.3 从GDB/DDD/Eclipse中设置变量 93
3.4 GDB自己的变量 94
3.4.1 使用值历史 94
3.4.2 方便变量 94
第4章 程序崩溃处理 96
4.1 背景资料:内存管理 96
4.1.1 为什么程序会崩溃 96
4.1.2 内存中的程序布局 97
4.1.3 页的概念 99
4.1.4 页的角色细节 99
4.1.5 轻微的内存访问程序错误可能不会导致段错误 101
4.1.6 段错误与Unix信号 102
4.1.7 其他类型的异常 105
4.2 核心文件 106
4.2.1 核心文件的创建方式 106
4.2.2 某些shell可能禁止创建核心文件 107
4.3 扩展示例 108
4.3.1 第一个程序错误 111
4.3.2 在调试会话期间不要退出GDB 113
4.3.3 第二个和第三个程序错误 113
4.3.4 第四个程序错误 115
4.3.5 第五个和第六个程序错误 116
第5章 多活动上下文中的调试 120
5.1 调试客户/服务器网络程序 120
5.2 调试多线程代码 125
5.2.1 进程与线程回顾 125
5.2.2 基本示例 127
5.2.3 变体 132
5.2.4 GDB线程命令汇总 133
5.2.5 DDD中的线程命令 134
5.2.6 Eclipse中的线程命令 134
5.3 调试并行应用程序 136
5.3.1 消息传递系统 136
5.3.2 共享内存系统 141
5.4 扩展示例 143
5.4.1 OpenMP概述 143
5.4.2 OpenMP示例程序 144
第6章 特殊主题 155
6.1 根本无法编译或加载 155
6.1.1 语法错误消息中的“幽灵”行号 155
6.1.2 缺少库 160
6.2 调试GUI程序 162
第7章 其他工具 172
7.1 充分利用文本编辑器 172
7.1.1 语法突出显示 172
7.1.2 匹配括号 174
7.1.3 Vim与makefile 175
7.1.4 makefile和编译器警告 176
7.1.5 关于将文本编辑器作为IDE的最后一个考虑事项 177
7.2 充分利用编译器 178
7.3 C语言中的错误报告 178
7.4 更好地使用strace和ltrace 182
7.5 静态代码检查器:lint与其衍生 184
7.5.1 如何使用splint 185
7.5.2 本节最后注意事项 185
7.6 调试动态分配的内存 185
7.6.1 检测DAM问题的策略 188
7.6.2 Electric Fence 188
7.6.3 用GNU C库工具调试DAM问题 190
第8章 对其他语言使用GDB/DDD/Eclipse 196
8.1 Java 196
8.1.1 直接使用GDB调试Java 198
8.1.2 使用DDD与GDB调试Java 201
8.1.3 使用DDD作为JDB的GUI 201
8.1.4 用Eclipse调试Java 201
8.2 Perl 202
8.2.1 通过DDD调试Perl 204
8.2.2 在Eclipse中调试Perl 206
8.3 Python 207
8.3.1 在DDD中调试Python 208
8.3.2 在Eclipse中调试Python 209
8.4 调试SWIG代码 210
8.5 汇编语言 213

编辑推荐

《软件调试的艺术》:调试对软件开发至关重要。然而,即使对于有经验的程序员,调试也并非易事。《软件调试的艺术》是一部优秀的软件调试入门著作,对业界多年口口相传的调试经验做了很好的总结。书中通过丰富的C/C++实例,生动阐述了适用于各种平台与编程语言的通用调试原则、基础知识、经验技巧和相关的背景知识,详细讲解了Linux/Unix平台最受欢迎的三个调试工具——GDB、DDD和Eclipse,并讨论了网络、多线程、GUI和多核程序的调试等高级主题。不仅如此,书中还讲述了如何在调试中运用vim、gcc、errno和lint等工具,以及Java、Python、Perl和汇编等程序的调试。

作者简介

调试对于软件的成败至关重要,正确使用恰当的调试工具可以提高发现和改正错误的效率。《软件调试的艺术》详细介绍了3种调试器,GDB用于逐行跟踪程序、设置断点、检查变量以及查看特定时间程序的执行情况,DDD是流行的GDB的GUI前端,而Eclipse提供完整的集成开发环境。书中不但配合实例讨论了如何管理内存、理解转储内存、跟踪程序找出错误等内容,更涵盖了其他同类书忽略的主题,例如线程、客户/服务器、GUI和并行程序,以及如何躲开常见的调试陷阱。
《软件调试的艺术》适合各层次软件开发人员、管理人员和测试人员阅读。

图书封面


 软件调试的艺术下载 精选章节试读 更多精彩书评



发布书评

 
 


精彩书评 (总计7条)

  •     买了有一阵了,但是说实话,这个书并不是我想要的。他主要是一些具体实践,但是只能用来作为基础,如果真正的专精的人并不需要,需要 更多的理论上的高度。而它并不能满足我的需要。有点后悔买了这个书。
  •     调试对于软件的成败至关重要,正确使用恰当的调试工具可以提高发现和改正错误的效率。《软件调试的艺术》详细介绍了3种调试器,GDB用于逐行跟踪程序、设置断点、检查变量以及查看特定时间程序的执行情况,DDD是流行的GDB的GUI前端,而Eclipse提供完整的集成开发环境。书中不但配合实例讨论了如何管理内存、理解转储内存、跟踪程序找出错误等内容,更涵盖了其他同类书忽略的主题,例如线程、客户/服务器、GUI和并行程序,以及如何躲开常见的调试陷阱。《软件调试的艺术》适合各层次软件开发人员、管理人员和测试人员阅读。
  •     相比Win下的调试书籍,linux下的相关书,至少在国内几乎没有见过。 想是因为win下的破解带动了调试这块吧。。。。以前尝试过直接去翻GDB的manual,但是十分枯燥,看不下去。因为只是直接介绍命令而已,对于初学者,事实上需要的是实例,和能够一步步能操演下去的讲解。这本书很薄,但是基本的调试用法都讲到了,普通的程序调试应该是足够了。这本书让我觉得调试也是非常有意思的一件事,并勾起了我对于底层硬件探究的兴趣。

精彩短评 (总计77条)

  •     讲的挺好的,适合调试入门
  •     还行吧,挺全面的,不过译的晦涩
  •     入门、参考都是不错
  •     没有艺术,不是讲调试的一般标准\方法\准则\艺术的书. 主要是介绍GDB的用法,结合了实际场景,本身还不错.就是标题太大.
  •     debug
  •     其实是主要是在讲怎么用GDB调试的。努力脱离printf,使用高端大气上档次的GDB。
  •     不错的debug入门书
  •     适合入门
  •     前几章还是蛮不错的~
  •     对于我来讲是领我进门的师父,是启蒙。翻译有个别错误也有不通顺的地方但联系下上下文不影响阅读。
  •     介绍GDB的入门书
  •     书已经都读完了。非常适合对gdb有一定基础后想深一步了解的同学学习。我们的软件调试中;书上讲的所有内容都用得上几乎。非常好。结构体变量,结构体指针内容显示,GUI,多线程,网络编程调试,core文件的分析利用等。
  •     excellent for beginner
  •     去过把ddd和eclips的使用去掉, 专门讲gdb那么篇幅能减少1/2
  •     作为入门还行,工作几年的人不太实用了
  •     开始读这本书了,主要关注gdb的调试,边读边记笔记,我认为这些调试的技巧没有必要去话费大量的时间,把书中提到的技巧记录在博客,需要的时候翻一翻,用多了自然就记住了。 所以,这本书泛读即可。
  •     简单实用,弥补了调试方面的空白。相当初,在学校几十万册书的图书馆里找不到几本像样的介绍调试的书,国内的高校教育已经各种教程都忽视了程序调试的教学,所以很多人浪费了很多时间在折腾代码。学会调试会节省很多不必要的犯错时间。看到的就买吧,值得拥有。
  •     。。。
  •     这样才名副其实,书本身还行,GDB入门的人可以看看,对用惯了GDB的老手的价值就不是那么大了。
  •     gdb入门的参考书,入门很好,每个点都是点到为止。对新手比较友好。
  •     基于 GDB 的命令行调试使用方式,感觉对个人暂时不是很实用。
  •     读完第一章我就发现自己之前使用GDB的效率是多么低下了....
  •     不够深入,不过很适合初学者
  •     翻译的太烂
  •     唯一一本介绍调试unix系统编程的书,适用c语言。linux环境的c语言开发调试。
  •     书还不错,讲的挺细的
  •     一般吧,作为入门还不错
  •     工作需要, piapiapia翻完就用上了. gdb的篇幅1/3+, ddd和eclipse占了3/2-, 有些遗憾.
  •     题目有点大,内容很实在。
  •     实用
  •     大部分内容都是介绍怎么使用GDB,实例不是很多,让人感觉不到是一种寓教于乐的感觉。
  •     作为工具书来说内容太瘦。
  •     对工作和学习帮助很大,里面的东西很实用,也很全面
  •     简单入门
  •     书挺好的 是一本提高经验的书~~
  •     适合Linux程序员,书还是不错的,我还在研究中!
  •     从简单的gdb命令,到内存泄漏,段错误,进程同步的调试这些复杂问题提供了很正的思路。
  •     昨天刚下的单,今天上午九点送货员就送过来了!速度很快!书还没有来的及看,不过包装很精美!对内容应该不会失望的~
  •     为了学gdb看了这本书,2天看完,算是通俗易懂把
  •     这本书写的像手册离艺术还有很远的距离
  •     GDB常用法
  •     总比不看好...有几个概念再补上了.. 说不上优秀的书,不过这年头..坏了电脑就凑合着吧..
  •     调试的好帮手。
  •     1、翻译的水平不咋地,好像不是计算机出生2、内容一般般,还不如多看看gdb的手册,不过中文参考资料实在是少
  •     简明gdb入门手册
  •     前三章差不多是废话,啰嗦了下GDB用法,和DDD和Eclipse对GDB的前端控制显示,后面还稍微有点内容,都点到为止。市面上缺一本像张奎银的软件调试类似的而讲GDB的书...
  •     主要是gdb调试C语言,虽然工具链差的挺多,但是思想在那。
  •     初读很有用,很新鲜,有种恍然大悟的感觉,可惜整本书就这样平铺直叙的展开了,又有种浅尝辄止的遗憾。
  •     2-5是核心章节,简洁明了,6-8章略显粗糙,科普一下也好
  •     也许没有调试工具 你也一样可以 用输出语句来协助调试, 我以前就是这样做的在程序上到处都写上printf().可是用上调试工具 真的是事半功倍, 现如今社会, 敏捷开发, 效率才是王道.
  •     粗浅的讲了讲使用gdb、ddd和eclipse来调试,感觉还不错
  •     学会gdb调试源码
  •     很没内容的一本书 觉得买亏了
  •     也许我是调试底子太弱的原因,这本书我觉得很好。
  •     挺好的一本书,可以当作资料书,用的时候,查一下
  •     入门知识,初学者可以看一下
  •     比较适合linux编程的初学者!但是最好是数据结构和c++开发功底比较扎实的,因为举的例子都是数据结构里面的。总体来看,看完第一章就能收获很多,后面讲了一部分内部技术实现,可以帮助深入理解,非常不错噢!
  •     不错 可惜自己实践不多 要多多看书实践
  •     已经绝版了 GDB入门
  •     常见调试手段介绍,值得一读
  •     喜欢读这种不很厚重的书.读起来很有意思.
  •     基础
  •     无论是开发人员还是测试人员,都应该读的一本书,对提高自身技能有很大帮助。
  •     值得想学习GDB,又不愿意阅读帮助的购买。

    这本书可以回答如下问题:
    1)软件调试器是什么,一般有什么功能
    2)GDB的主要功能,以及一些外挂的GUI。
    3)使用GDB的高级功能。比如我学到的为断点促发后,通过***mands 输出关心的信息,然后continue 继续执行,适用于动态捕获程序运行状态。

    阅读后很认真的做了读书笔记(freemind)。想要的给我联系。

    这本书没有解释GDB的工作原理,比如为什么-d 编译出来的文件很大,包含什么内容,编译的程序怎么和代码关联的?
    参阅《深入理解计算机系统》
  •     2013年8月,gdb入门还可以的书籍,比较系统,但缺乏深度
  •     很不错的一本书,对于linux调试的基本技术讲解的简单易懂
  •     讲的都是对有源码的调试,对没有源码的……
  •     很用心的小书,用一个一个小例子带你上手gdb,算是gdb的开胃菜,很难想象看一本厚厚的gdb手册能让人有什么头绪。
  •     gdb是王道,ddd、eclipse都是浮云,微软和GNU是“工具链”业的两大巨头啊~偶尔还是很羡慕windows程序员的……实际上任何一个工具链,用熟、顺手,就是最强大的,完全不必要争论或者追风
  •     还算可以
  •     gdb使用手册,值得一看
  •     内容不多,但是“正确”而且“有用”,是难得的入门书
  •     买来之后,狂啃一通,个人感觉这是一本很不错的入门书籍。尽管有些地方,翻译的不是很好,但是不伤大雅。对于喜欢在linux/unix下编程的朋友,这一本书很有用。
  •     图书馆有这本书,真想据为己有。。。这么好的书肿么就不印刷了。。。看完了,页数不多,但是受益匪浅
  •     linux编程环境调试的入门读物,介绍的很基础,内容较少,适合初学者,其中对于ddd和eclipse的调试方法完全可以不用介绍
  •     渣翻译. 强烈不推荐中文版
  •     正如副标题说的适合*nix平台,主要介绍gdb,ddd,基本点有带到,但没有写到一个项目本身的gdb的应用,比较孤立吧。【电子版也有】
 

外国儿童文学,篆刻,百科,生物科学,科普,初中通用,育儿亲子,美容护肤PDF图书下载,。 零度图书网 

零度图书网 @ 2024