编辑推荐
每位软件开发者及IT人士都明白高效率的调试是多么重要。在开发者的日常工作中,最耗时间的环节通常就是程序的调试,而且相关的调试技术与技巧可能要花很长时间才能掌握。在《Effective Debugging:软件和系统调试的66个有效方法》中,Diomidis Spinellis对最为有用的调试方法、策略、技巧及工具进行系统的归类、整理与演示,以帮助有经验的程序员迅速掌握这些知识。
作者简介
作者:(希腊)迪欧米迪斯·斯宾奈里斯(Diomidis Spinellis) 译者:爱飞翔
迪欧米迪斯·斯宾奈里斯(Diomidis Spinellis),雅典经贸大学管理科学与技术系教授,经常讲授复杂系统的开发与调试技术。他是Google的高级软件工程师,也是FreeBSDcommitter团队的成员,并贡献了一些随OSX及BSD Unix系统而发布的代码。此外,他还开发了UMLGraph及CScout等流行的开源软件。Spinellis所写的《Code Reading》和《Code Quality》曾获得软件开发生产力奖。他是ACM及IEEE的资深成员。
目录
译者序
前言
致谢
第1章宏观策略1
第1条:通过事务追踪系统处理所有的问题1
第2条:在网上确切地查询你所遇到的问题,以寻求解决问题的灵感4
第3条:确保前置条件与后置条件都能够得到满足6
第4条:从具体问题入手向上追查bug,或从高层程序入手向下追查bug7
第5条:在能够正常运作的系统与发生故障的系统之间寻找差别9
第6条:使用软件自身的调试机制13
第7条:试着用多种工具构建软件,并将其放在不同的环境下执行16
第8条:把工作焦点放在最为重要的问题上20
第2章通用的方法与做法23
第9条:相信自己能够把问题调试好23
第10条:高效地重现程序中的问题26
第11条:修改完代码之后,要能够尽快看到结果29
第12条:将复杂的测试场景自动化30
第13条:使自己尽可能多地观察到与调试有关的数据32
第14条:考虑对软件进行更新34
第15条:查看第三方组件的源代码,以了解其用法35
第16条:使用专门的监测及测试设备37
第17条:使故障更加突出40
第18条:从自己的桌面计算机上调试那些不太好用的系统42
第19条:使调试任务自动化44
第20条:开始调试之前与调试完毕之后都要把程序清理干净46
第21条:把属于同一个类型的所有问题全都修复好47
第3章通用的工具与技术49
第22条:用Unix命令行工具对调试数据进行分析49
第23条:掌握命令行工具的各种选项及习惯用法55
第24条:用编辑器对调试程序时所需的数据进行浏览57
第25条:优化工作环境59
第26条:用版本控制系统寻找bug发生的原因及经过64
第27条:用工具监测由多个独立程序所构成的系统67
第4章调试器的使用技巧71
第28条:编译代码时把符号信息包含进来,以便于调试72
第29条:对代码进行单步调试76
第30条:设置代码断点和数据断点77
第31条:了解反向调试功能80
第32条:查看例程之间的相互调用情况83
第33条:查看变量及表达式的值,以寻找程序中的错误84
第34条:了解怎样把调试器连接到正在运行的进程上87
第35条:了解怎样运用核心转储信息来进行调试89
第36条:把调试工具设置好92
第37条:学会查看汇编代码及原始内存95
第5章编程技术100
第38条:对可疑的代码进行评审,并手工演练这些代码100
第39条:审读代码并与同事讨论102
第40条:给软件添加调试机制103
第41条:添加日志语句107
第42条:对软件进行单元测试111
第43条:用断言进行调试114
第44条:改动受测程序,以验证自己的推想118
第45条:尽量缩小正确范例与错误代码之间的差距119
第46条:简化可疑代码120
第47条:将可疑代码改用另外一种编程语言来写123
第48条:改善可疑代码的可读性与结构124
第49条:要清除bug的根源,而不仅仅消除其症状128
第6章编译时的调试技术130
第50条:对生成的代码进行检视130
第51条:使用静态程序分析工具133
第52条:对项目进行配置,令程序能够以固定的方式构建和执行138
第53条:对调试所用程序库及构建代码时所应执行的检查进行配置141
第7章运行时的调试技术147
第54条:通过构建测试用例来寻找错误147
第55条:令软件在遇到问题时尽早退出151
第56条:检视应用程序的日志文件152
第57条:对系统和进程所执行的操作进行性能评测156
第58条:追踪程序的执行情况160
第59条:使用动态程序分析工具166
第8章调试多线程的代码169
第60条:通过事后调试来分析死锁问题169
第61条:捕获并重现176
第62条:用专门的工具来探查死锁与竞争条件问题180
第63条:把不确定的因素隔离出来,或将其移除186
第64条:检查资源争用情况,以解决与可伸缩性有关的问题188
第65条:用性能计数器寻找伪共享问题191
第66条:考虑用更为高级的抽象机制来重写代码195
网上资源203
序言
The Translator’s Words 译 者 序十几年前,我看过Spinellis先生所写的《代码阅读》(Code Reading)和《代码质量》(Code Quality)两本书,特别喜欢这种全面讲解编程工作中某个领域的教程,这次又读到同一位作者所写的《Effective Debugging》,感觉依然很精彩。
这是一本在思路和技巧上都较为丰富的调试手册。
从思路方面来说,本书介绍了许多宏观与微观的调试办法。例如,在面对软件故障时,既可以从整体情况入手,进行自上而下的调试,也可以从具体故障入手,进行自下而上的调试,还可以考虑用高级的抽象机制、便捷的程序库、直白的算法、简洁的逻辑,乃至另外一门更为合适的编程语言,对bug繁多的代码进行改写——这些思路,都能在调试工作中给人以启发。
从技巧方面来说,本书介绍了众多的调试工具与手法:有些可以在程序运行之前,设置断点并对表达式与程序的状态做出断言;有些可以在程序运行之中,将各种调试机制与程序进行连接,并对其执行情况进行记录;有些则可以在程序崩溃之后,通过核心转储等信息来还原当时的情境。此外,作者还讲解了如何把这些前置、中置和后置技巧与版本控制系统、静态分析工具、动态分析工具及性能测评工具结合起来使用,以提升调试的效率。
全书的8个大类中含有66条技巧,这些技巧都是围绕着“重现bug——探查bug——解决bug”这一主线而展开的。针对这三个阶段,作者进行了详细的分步讲解,给出了很多实用的范例代码与建议,而且特别强调了如何才能稳定地捕获并重现bug,以便给后面两个阶段打下良好的基础。
本书或许还能促使大家思考另外一个问题,那就是:在修复完bug之后,怎样防止有人向程序中引入类似的bug?这可以从代码质量与测试两方面入手。提高代码质量,能够减少程序员对代码的误解,进而降低引入bug的概率;而对测试进行完善,则能够提前捕获很多问题,从而不会使这些问题逐渐积累成复杂的bug。这些理念,作者在书中也时常会提到。
总之,这是一本可以打开思路并拓宽眼界的书籍,大家不妨在自己惯用的调试环境之外,多尝试一下作者所介绍的其他技法、工具和语言,以求达到旧学与新知的融合。
翻译本书的过程中,我得到了机械工业出版社华章公司诸位编辑和工作人员的帮助,在此深表谢意。
由于译者水平有限,不足与疏漏之处请大家发邮件至eastarstormlee@gmail.com,或访问github.com/jeffreybaoshenlee/debugging-errata/issues留言,给我以批评和指教。
爱飞翔
文摘
版权页:
插图:
每位软件开发者及IT人士都明白高效率的调试是多么重要。在开发者的日常工作中,最耗时间的环节通常就是程序的调试,而且相关的调试技术与技巧可能要花很长时间才能掌握。在《Effective Debugging:软件和系统调试的66个有效方法》中,Diomidis Spinellis对最为有用的调试方法、策略、技巧及工具进行系统的归类、整理与演示,以帮助有经验的程序员迅速掌握这些知识。
作者简介
作者:(希腊)迪欧米迪斯·斯宾奈里斯(Diomidis Spinellis) 译者:爱飞翔
迪欧米迪斯·斯宾奈里斯(Diomidis Spinellis),雅典经贸大学管理科学与技术系教授,经常讲授复杂系统的开发与调试技术。他是Google的高级软件工程师,也是FreeBSDcommitter团队的成员,并贡献了一些随OSX及BSD Unix系统而发布的代码。此外,他还开发了UMLGraph及CScout等流行的开源软件。Spinellis所写的《Code Reading》和《Code Quality》曾获得软件开发生产力奖。他是ACM及IEEE的资深成员。
目录
译者序
前言
致谢
第1章宏观策略1
第1条:通过事务追踪系统处理所有的问题1
第2条:在网上确切地查询你所遇到的问题,以寻求解决问题的灵感4
第3条:确保前置条件与后置条件都能够得到满足6
第4条:从具体问题入手向上追查bug,或从高层程序入手向下追查bug7
第5条:在能够正常运作的系统与发生故障的系统之间寻找差别9
第6条:使用软件自身的调试机制13
第7条:试着用多种工具构建软件,并将其放在不同的环境下执行16
第8条:把工作焦点放在最为重要的问题上20
第2章通用的方法与做法23
第9条:相信自己能够把问题调试好23
第10条:高效地重现程序中的问题26
第11条:修改完代码之后,要能够尽快看到结果29
第12条:将复杂的测试场景自动化30
第13条:使自己尽可能多地观察到与调试有关的数据32
第14条:考虑对软件进行更新34
第15条:查看第三方组件的源代码,以了解其用法35
第16条:使用专门的监测及测试设备37
第17条:使故障更加突出40
第18条:从自己的桌面计算机上调试那些不太好用的系统42
第19条:使调试任务自动化44
第20条:开始调试之前与调试完毕之后都要把程序清理干净46
第21条:把属于同一个类型的所有问题全都修复好47
第3章通用的工具与技术49
第22条:用Unix命令行工具对调试数据进行分析49
第23条:掌握命令行工具的各种选项及习惯用法55
第24条:用编辑器对调试程序时所需的数据进行浏览57
第25条:优化工作环境59
第26条:用版本控制系统寻找bug发生的原因及经过64
第27条:用工具监测由多个独立程序所构成的系统67
第4章调试器的使用技巧71
第28条:编译代码时把符号信息包含进来,以便于调试72
第29条:对代码进行单步调试76
第30条:设置代码断点和数据断点77
第31条:了解反向调试功能80
第32条:查看例程之间的相互调用情况83
第33条:查看变量及表达式的值,以寻找程序中的错误84
第34条:了解怎样把调试器连接到正在运行的进程上87
第35条:了解怎样运用核心转储信息来进行调试89
第36条:把调试工具设置好92
第37条:学会查看汇编代码及原始内存95
第5章编程技术100
第38条:对可疑的代码进行评审,并手工演练这些代码100
第39条:审读代码并与同事讨论102
第40条:给软件添加调试机制103
第41条:添加日志语句107
第42条:对软件进行单元测试111
第43条:用断言进行调试114
第44条:改动受测程序,以验证自己的推想118
第45条:尽量缩小正确范例与错误代码之间的差距119
第46条:简化可疑代码120
第47条:将可疑代码改用另外一种编程语言来写123
第48条:改善可疑代码的可读性与结构124
第49条:要清除bug的根源,而不仅仅消除其症状128
第6章编译时的调试技术130
第50条:对生成的代码进行检视130
第51条:使用静态程序分析工具133
第52条:对项目进行配置,令程序能够以固定的方式构建和执行138
第53条:对调试所用程序库及构建代码时所应执行的检查进行配置141
第7章运行时的调试技术147
第54条:通过构建测试用例来寻找错误147
第55条:令软件在遇到问题时尽早退出151
第56条:检视应用程序的日志文件152
第57条:对系统和进程所执行的操作进行性能评测156
第58条:追踪程序的执行情况160
第59条:使用动态程序分析工具166
第8章调试多线程的代码169
第60条:通过事后调试来分析死锁问题169
第61条:捕获并重现176
第62条:用专门的工具来探查死锁与竞争条件问题180
第63条:把不确定的因素隔离出来,或将其移除186
第64条:检查资源争用情况,以解决与可伸缩性有关的问题188
第65条:用性能计数器寻找伪共享问题191
第66条:考虑用更为高级的抽象机制来重写代码195
网上资源203
序言
The Translator’s Words 译 者 序十几年前,我看过Spinellis先生所写的《代码阅读》(Code Reading)和《代码质量》(Code Quality)两本书,特别喜欢这种全面讲解编程工作中某个领域的教程,这次又读到同一位作者所写的《Effective Debugging》,感觉依然很精彩。
这是一本在思路和技巧上都较为丰富的调试手册。
从思路方面来说,本书介绍了许多宏观与微观的调试办法。例如,在面对软件故障时,既可以从整体情况入手,进行自上而下的调试,也可以从具体故障入手,进行自下而上的调试,还可以考虑用高级的抽象机制、便捷的程序库、直白的算法、简洁的逻辑,乃至另外一门更为合适的编程语言,对bug繁多的代码进行改写——这些思路,都能在调试工作中给人以启发。
从技巧方面来说,本书介绍了众多的调试工具与手法:有些可以在程序运行之前,设置断点并对表达式与程序的状态做出断言;有些可以在程序运行之中,将各种调试机制与程序进行连接,并对其执行情况进行记录;有些则可以在程序崩溃之后,通过核心转储等信息来还原当时的情境。此外,作者还讲解了如何把这些前置、中置和后置技巧与版本控制系统、静态分析工具、动态分析工具及性能测评工具结合起来使用,以提升调试的效率。
全书的8个大类中含有66条技巧,这些技巧都是围绕着“重现bug——探查bug——解决bug”这一主线而展开的。针对这三个阶段,作者进行了详细的分步讲解,给出了很多实用的范例代码与建议,而且特别强调了如何才能稳定地捕获并重现bug,以便给后面两个阶段打下良好的基础。
本书或许还能促使大家思考另外一个问题,那就是:在修复完bug之后,怎样防止有人向程序中引入类似的bug?这可以从代码质量与测试两方面入手。提高代码质量,能够减少程序员对代码的误解,进而降低引入bug的概率;而对测试进行完善,则能够提前捕获很多问题,从而不会使这些问题逐渐积累成复杂的bug。这些理念,作者在书中也时常会提到。
总之,这是一本可以打开思路并拓宽眼界的书籍,大家不妨在自己惯用的调试环境之外,多尝试一下作者所介绍的其他技法、工具和语言,以求达到旧学与新知的融合。
翻译本书的过程中,我得到了机械工业出版社华章公司诸位编辑和工作人员的帮助,在此深表谢意。
由于译者水平有限,不足与疏漏之处请大家发邮件至eastarstormlee@gmail.com,或访问github.com/jeffreybaoshenlee/debugging-errata/issues留言,给我以批评和指教。
爱飞翔
文摘
版权页:
插图:
| ISBN | 9787111568896 |
|---|---|
| 出版社 | 机械工业出版社 |
| 作者 | 迪欧米迪斯·斯宾奈里斯 (Diomidis Spinellis) |
| 尺寸 | 16 |