成功加入购物车
有水印
[德]格勒特克 著; 赵俐 译 / 人民邮电出版社 / 2010-02 / 平装
售价 ¥ 30.00 6.7折
定价 ¥45.00
品相 八五品品相描述
优惠 满包邮
延迟发货说明
上书时间2023-08-02
卖家超过10天未登录
软件调试实战
《软件调试实战》主要讲述C/C++程序的调试和分析,书中的调试技术也可以应用于其他语言编写的程序。《软件调试实战》在讲述简单的源代码分析和测试的基础上,讲述了现实的程序中经常遇到的一些问题(如程序链接、内存访问、并行处理和性能分析)并给出了解决方案。
《软件调试实战》适合软件开发人员、调试人员阅读和使用。
ThorstenGrotker,UlrichHoltmann,HolgerKeding,MarkusWloka4位作者均拥有德国或美国著名高等学府的博士学位,目前都任职于EDA(电子设计自动化)软件领导厂商Synopsys(新思)公司,分别担任研发主管、资深软件工程师等职位,负责开发编译器和调试工具,具有解决各种调试问题的丰富经验。
第1章谁编写软件,谁制造bug(为什么需要本书)1第2章系统性调试方法32.1为什么要遵循结构化的过程32.2充分利用机会32.313条黄金规则52.3.1理解需求52.3.2制造失败62.3.3简化测试用例62.3.4读取恰当的错误消息62.3.5检查显而易见的问题62.3.6从解释中分离出事实72.3.7分而治之72.3.8工具要与bug匹配82.3.9一次只做一项更改92.3.10保持审计跟踪92.3.11获得全新观点92.3.12bug不会自己修复92.3.13用回归测试来检查bug修复102.4构建一个好的工具包102.4.1工具箱112.4.2每天运行测试,防止出现bug112.5认清敌人——遇到bug家族132.5.1常见bug132.5.2偶发性bug132.5.3Heisenbug132.5.4隐藏在bug背后的bug142.5.5秘密bug——调试与机密性142.5.6更多读物15第3章查找根源——源代码调试器173.1可视化程序行为173.2准备简单的可预测的示例183.3使调试器与程序一起运行183.4学习在程序崩溃时执行栈跟踪213.5学习使用断点213.6学习在程序中导航223.7学习检查数据:变量和表达式223.8一个简单示例的调试会话23第4章修复内存问题274.1C/C++中的内存管理——功能强大但很危险274.1.1内存泄漏274.1.2内存管理的错误使用284.1.3缓冲区溢出284.1.4未初始化的内存bug284.2有效的内存调试器284.3示例1:检测内存访问错误294.3.1检测无效的写访问304.3.2检测对未初始化的内存的读取操作304.3.3检测内存泄漏314.4示例2:对内存分配/释放的不完整调用314.5结合使用内存调试器和源代码测试器334.6减少干扰,排查错误334.7何时使用内存调试器344.8约束344.8.1测试用例应该有很好的代码覆盖率344.8.2提供更多计算机资源354.8.3可能不支持多线程354.8.4对非标准内存处理程序的支持35第5章剖析内存的使用375.1基本策略——主要步骤375.2示例:分配数组385.3第1步:查找泄漏385.4第2步:设置期望值385.5第3步:测量内存使用395.5.1使用多个输入395.5.2在固定时间间隔停止程序395.5.3用简单工具测量内存使用405.5.4使用top405.5.5使用WindowsTaskManager415.5.6为testmalloc选择相关输入值425.5.7确定机器上的内存是如何被释放的425.5.8使用内存剖析工具435.6第4步:查明大部分内存被哪些数据结构占用了445.7综合练习——genindex示例455.7.1核实没有大的内存泄漏465.7.2估计内存使用465.7.3测量内存使用465.7.4查找使用内存的数据结构47第6章解决性能问题516.1分步查找性能bug516.1.1执行前期分析516.1.2使用简单的时间测量方法526.1.3创建测试用例526.1.4使测试用例具有可再现性536.1.5检查程序的正确性536.1.6创建可扩展的测试用例536.1.7排除对测试用例的干扰546.1.8用time命令测量时可能会发生错误和偏差546.1.9选择一个能够揭示运行时间瓶颈的测试用例556.1.10算法与实现之间的差异566.2使用剖析工具586.2.1不要编写自己的剖析工具586.2.2剖析工具的工作原理586.2.3了解gprof596.2.4了解Quantify636.2.5了解Callgrind646.2.6了解VTune666.3分析I/O性能68第7章调试并行程序717.1用C/C++编写并行程序717.2调试竞争条件727.2.1使用基本调试器功能来查找竞争条件737.2.2使用日志文件来查找竞争条件747.3调试死锁767.3.1如何确定正在运行的是哪个线程777.3.2分析程序的线程787.4了解线程分析工具787.5异步事件和中断处理程序80第8章查找环境和编译器问题838.1环境变更——问题的根源838.1.1环境变量838.1.2本地安装依赖848.1.3当前工作目录依赖848.1.4进程ID依赖848.2如何查看程序正在做什么848.2.1用top来查看进程848.2.2用ps来查找应用程序的多个进程858.2.3使用/proc/来访问进程858.2.4使用strace跟踪对操作系统的调用858.3编译器和调试器也有bug878.3.1编译器bug878.3.2调试器和编译器兼容性问题88第9章处理链接问题899.1链接器的工作原理899.2构建并链接对象899.3解析未定义的符号919.3.1丢失链接器参数919.3.2搜索丢失的符号919.3.3链接顺序问题929.3.4C++符号和名称改编939.3.5符号的反改编949.3.6链接C和C++代码949.4具有多个定义的符号959.5信号冲突969.6识别编译器和链接器版本不匹配969.6.1系统库不匹配979.6.2对象文件不匹配979.6.3运行时崩溃989.6.4确定编译器版本989.7解决动态链接问题1009.7.1链接或载入DLL1009.7.2无法找到DLL文件1019.7.3分析载入器问题1029.7.4在DLL中设置断点1039.7.5提供DLL问题的错误消息104第10章高级调试10710.1在C++函数、方法和操作符中设置断点10710.2在模板化的函数和C++类中设置断点10910.3进入C++方法11010.3.1用step-into命令进入到隐式函数中11210.3.2用step-out命令跳过隐式函数11210.3.3利用临时断点跳过隐式函数11310.3.4从隐式函数调用返回11310.4条件断点和断点命令11410.5调试静态构造/析构函数11610.5.1由静态初始化程序的顺序依赖性引起的bug11710.5.2识别静态初始化程序的栈跟踪11810.5.3在静态初始化之前连接调试器11810.6使用观察点11910.7捕捉信号12010.8捕获异常12210.9读取栈跟踪12410.9.1带调试信息编译的源代码的栈跟踪12410.9.2不带调试信息编译的源代码的栈跟踪12410.9.3不带任何调试信息的帧12510.9.4实际工作中的栈跟踪12510.9.5改编后的函数名称12610.9.6被破坏的栈跟踪12610.9.7核心转储12710.10操纵正在运行的程序12810.10.1修改变量13010.10.2调用函数13110.10.3修改函数的返回值13210.10.4中止函数调用13210.10.5跳过或重复执行个别语句13310.10.6输出和修改内存内容13310.11在没有调试信息时进行调试13510.11.1从栈读取函数参数13710.11.2读取局部/全局变量和用户定义的数据类型13810.11.3在源代码中查找语句的大概位置13910.11.4走查汇编代码140第11章编写可调试的代码14311.1注释的重要性14311.1.1函数签名的注释14411.1.2对折中办法的注释14411.1.3为不确定的代码加注释14411.2采用一致的编码风格14411.2.1仔细选择名称14511.2.2不要使用“聪明过头”的结构14511.2.3不要压缩代码14511.2.4为复杂表达式使用临时变量14511.3避免使用预处理器宏14611.3.1使用常量或枚举来替代宏14611.3.2使用函数来替代预处理器宏14811.3.3调试预处理器输出14911.3.4使用功能更强的预处理器15011.4提供更多调试函数15111.4.1显示用户定义的数据类型15111.4.2自检查代码15211.4.3为操作符创建一个函数,以便帮助调试15311.5为事后调试做准备153第12章静态检查的作用15512.1使用编译器作为调试工具15512.1.1不要认为警告是无害的15612.1.2使用多个编译器来检查代码15812.2使用lint15812.3使用静态分析工具15812.3.1了解静态检查器15812.3.2将静态检查器检测到的错误减至(接近)零16012.3.3完成代码清理后重新运行所有测试用例16012.4静态分析的高级应用161第13章结束语163附录A调试命令165附录B工具资源167附录C源代码179参考文献189
展开全部
配送说明
...
相似商品
为你推荐
开播时间:09月02日 10:30