基本信息出版社:人民邮电出版社
页码:190 页
ISBN:9787115218858
条形码:9787115218858
版本:第01版
装帧:其他
开本:16开 Pages Per Sheet
丛书名:图灵程序设计丛书
内容简介 本书主要讲述C/C++程序的调试和分析,书中的调试技术也可以应用于其他语言编写的程序。本书在讲述简单的源代码分析和测试的基础上,讲述了现实的程序中经常遇到的一些问题(如程序链接、内存访问、并行处理和性能分析)并给出了解决方案。 本书适合软件开发人员、调试人员阅读和使用。
目录
目 录 第1章 谁编写软件,谁制造bug(为什么需要本书) 1 第2章 系统性调试方法 3 2.1 为什么要遵循结构化的过程 3 2.2 充分利用机会 3 2.3 13条黄金规则 5 2.3.1 理解需求 5 2.3.2 制造失败 6 2.3.3 简化测试用例 6 2.3.4 读取恰当的错误消息 6 2.3.5 检查显而易见的问题 6 2.3.6 从解释中分离出事实 7 2.3.7 分而治之 7 2.3.8 工具要与bug匹配 8 2.3.9 一次只做一项更改 9 2.3.10 保持审计跟踪 9 2.3.11 获得全新观点 9 2.3.12 bug不会自己修复 9 2.3.13 用回归测试来检查bug修复 10 2.4 构建一个好的工具包 10 2.4.1 工具箱 11 2.4.2 每天运行测试,防止出现bug 11 2.5 认清敌人——遇到bug家族 13 2.5.1 常见bug 13 2.5.2 偶发性bug 13 2.5.3 Heisenbug 13 2.5.4 隐藏在bug背后的bug 14 2.5.5 秘密bug——调试与机密性 14 2.5.6 更多读物 15 第3章 查找根源——源代码调试器 17 3.1 可视化程序行为 17 3.2 准备简单的可预测的示例 18 3.3 使调试器与程序一起运行 18 3.4 学习在程序崩溃时执行栈跟踪 21 3.5 学习使用断点 21 3.6 学习在程序中导航 22 3.7 学习检查数据:变量和表达式 22 3.8 一个简单示例的调试会话 23 第4章 修复内存问题 27 4.1 C/C++中的内存管理——功能强大但很危险 27 4.1.1 内存泄漏 27 4.1.2 内存管理的错误使用 28 4.1.3 缓冲区溢出 28 4.1.4 未初始化的内存bug 28 4.2 有效的内存调试器 28 4.3 示例1:检测内存访问错误 29 4.3.1 检测无效的写访问 30 4.3.2 检测对未初始化的内存的读取操作 30 4.3.3 检测内存泄漏 31 4.4 示例2:对内存分配/释放的不完整调用 31 4.5 结合使用内存调试器和源代码测试器 33 4.6 减少干扰,排查错误 33 4.7 何时使用内存调试器 34 4.8 约束 34 4.8.1 测试用例应该有很好的代码覆盖率 34 4.8.2 提供更多计算机资源 35 4.8.3 可能不支持多线程 35 4.8.4 对非标准内存处理程序的支持 35 第5章 剖析内存的使用 37 5.1 基本策略——主要步骤 37 5.2 示例:分配数组 38 5.3 第1步:查找泄漏 38 5.4 第2步:设置期望值 38 5.5 第3步:测量内存使用 39 5.5.1 使用多个输入 39 5.5.2 在固定时间间隔停止程序 39 5.5.3 用简单工具测量内存使用 40 5.5.4 使用top 40 5.5.5 使用Windows Task Manager 41 5.5.6 为testmalloc选择相关输入值 42 5.5.7 确定机器上的内存是如何被释放的 42 5.5.8 使用内存剖析工具 43 5.6 第4步:查明大部分内存被哪些数据结构占用了 44 5.7 综合练习——genindex示例 45 5.7.1 核实没有大的内存泄漏 46 5.7.2 估计内存使用 46 5.7.3 测量内存使用 46 5.7.4 查找使用内存的数据结构 47 第6章 解决性能问题 51 6.1 分步查找性能bug 51 6.1.1 执行前期分析 51 6.1.2 使用简单的时间测量方法 52 6.1.3 创建测试用例 52 6.1.4 使测试用例具有可再现性 53 6.1.5 检查程序的正确性 53 6.1.6 创建可扩展的测试用例 53 6.1.7 排除对测试用例的干扰 54 6.1.8 用time命令测量时可能会发生错误和偏差 54 6.1.9 选择一个能够揭示运行时间瓶颈的测试用例 55 6.1.10 算法与实现之间的差异 56 6.2 使用剖析工具 58 6.2.1 不要编写自己的剖析工具 58 6.2.2 剖析工具的工作原理 58 6.2.3 了解gprof 59 6.2.4 了解Quantify 63 6.2.5 了解Callgrind 64 6.2.6 了解VTune 66 6.3 分析I/O性能 68 第7章 调试并行程序 71 7.1 用C/C++编写并行程序 71 7.2 调试竞争条件 72 7.2.1 使用基本调试器功能来查找竞争条件 73 7.2.2 使用日志文件来查找竞争条件 74 7.3 调试死锁 76 7.3.1 如何确定正在运行的是哪个线程 77 7.3.2 分析程序的线程 78 7.4 了解线程分析工具 78 7.5 异步事件和中断处理程序 80 第8章 查找环境和编译器问题 83 8.1 环境变更——问题的根源 83 8.1.1 环境变量 83 8.1.2 本地安装依赖 84 8.1.3 当前工作目录依赖 84 8.1.4 进程ID依赖 84 8.2 如何查看程序正在做什么 84 8.2.1 用top来查看进程 84 8.2.2 用ps来查找应用程序的多个进程 85 8.2.3 使用/proc/
……