《Effective Debugging:软件和系统调试的66个有效方法》是一本非常有用的书籍。它涵盖了软件调试和系统调试的广泛范围,并提供了许多有效的调试知识。本书讲解了与调试相关的策略、工具和方法,为读者提供了解决各种问题的能力。对于我们当前开发和运行的复杂计算系统来说,遇到各种问题是不可避免的,但是通过学习这本书中的调试知识,我们能够更好地应对这些问题。如果你对软件调试、系统调试等内容感兴趣,我推荐你下载学习这本书。
软件和系统调试的66个有效方法电子书封面
读者评价
每位软件开发者以及IT人士都明白,高效率的调试是多么重要,在开发者的日常工作中,最好实现的环节通常就是程序的调试,而且相关的调试技术与技巧可能要花很长时间才能掌握,在本书中作者对最为有用的调试方法策略技巧及工具进行系统的归类,整理,语言是,以帮助有经验的程序员迅速掌握这些知识
才到手没多久,翻了几页,还不错,多看看还是有好处的
debug 技术很重要 ,可惜这方面的书不多,先看看吧
内容介绍
本书共分8章。首先讲解调试策略(第1章)、调试方法(第2章)以及调试时所用的工具与技巧(第3章),这些知识使我们能够应对各种软件故障及系统故障。接下来讨论在调试工作的各个阶段所用到的具体技巧,也就是在使用调试器(第4章)、编写程序(第5章)、编译软件(第6章)以及运行系统(第7章)时所用到的调试技巧。与多线程和并发有关的bug是很难寻找的,所以本书后专门用一章(第8章)来讲解特定的调试工具及调试技术,使大家能够找出这些bug。
目录
- 译者序
- 前言
- 致谢
- 第1章 宏观策略 1
- 第1条:通过事务追踪系统处理所有的问题 1
- 第2条:在网上确切地查询你所遇到的问题,以寻求解决问题的灵感 4
- 第3条:确保前置条件与后置条件都能够得到满足 6
- 第4条:从具体问题入手向上追查bug,或从高层程序入手向下追查bug 7
- 第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
软件测试分为几个阶段 各阶段的测试策略和要求是什么? 和开发过程相对应,测试过程会依次经历单元测试、集成测试、系统测试、验收测试四个主要阶段: 单元测试:单元测试是针对软件设计的最小单位––程序模块甚至代码段进行正确性检验的测试工作,通常由开发人员进行。 集成测试:集成测试是将模块按照设计要求组装起来进行测试,主要目的是发现与接口有关的问题。由于在产品提交到测试部门前,产品开发小组都要进行联合调试,因此在大部分企业中集成测试是由开发人员来完成的。 系统测试:系统测试是在集成测试通过后进行的,目的是充分运行系统,验证各子系统是否都能正常工作并完成设计的要求。它主要由测试部门进行,是测试部门最大最重要的一个测试,对产品的质量有重大的影响。 验收测试:验收测试以需求阶段的《需求规格说明书》为验收标准,测试时要求模拟实际用户的运行环境。对于实际项目可以和客户共同进行,对于产品来说就是最后一次的系统测试。测试内容为对功能模块的全面测试,尤其要进行文档测试。
简述什么是静态测试、动态测试、黑盒测试、白盒测试、α测试 β测试 静态测试是不运行程序本身而寻找程序代码中可能存在的错误或评估程序代码的过程。 动态测试是实际运行被测程序,输入相应的测试实例,检查运行结果与预期结果的差异,判定执行结果是否符合要求,从而检验程序的正确性、可靠性和有效性,并分析系统运行效率和健壮性等性能。 黑盒测试一般用来确认软件功能的正确性和可操作性,目的是检测软件的各个功能是否能得以实现,把被测试的程序当作一个黑盒,不考虑其内部结构,在知道该程序的输入和输出之间的关系或程序功能的情况下,依靠软件规格说明书来确定测试用例和推断测试结果的正确性。 白盒测试根据软件内部的逻辑结构分析来进行测试,是基于代码的测试,测试人员通过阅读程序代码或者通过使用开发工具中的单步调试来判断软件的质量,一般黑盒测试由项目经理在程序员开发中来实现。 α测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的受控测试,Alpha测试不能由程序员或测试员完成。 β测试是软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场,Beta测试不能由程序员或测试员完成。
软件测试的原则: 测试用例中一个必须部分是对预期输出或接过进行定义 程序员应避免测试自己编写的程序 编写软件的组织不应当测试自己编写的软件 应当彻底检查每个测试的执行结果 测试用例的编写不仅应当根据有效和预料到的输入情况,而且也应当根据无效和未预料到的输入情况 检擦程序是否“未做其应该做的”仅是测试的一半,测试的另一半是检查程序是否“做了其不应该做的” 应避免测试用例用后即弃,除非软件本身就是个一次性的软件 计划测试工作时不应默许假定不会发现错误 程序某部分存在更多错误的可能性,与该部分已经发现错误的数量成正比 软件测试是一项极富创造性,极具智力的挑战性的工作
软件测试的目的: 测试是程序的执行过程,目的在于发现错误 一个成功的测试用例在于发现至今未发现的错误 一个成功的测试是发现了至今未发现的错误的测试 确保产品完成了它所承诺或公布的功能,并且用户可以访问到的功能都有明确的书面说明。 确保产品满足性能和效率的要求 确保产品是健壮的和适应用户环境的