《《精编》试论提高软件质量的利器-Valgrind》由会员分享,可在线阅读,更多相关《《精编》试论提高软件质量的利器-Valgrind(33页珍藏版)》请在金锄头文库上搜索。
1、提高软件质量的利器Valgrind 2010 12 24 视讯产品线 监控业务开发部 PurifyPlus投资回报分析 花费更少的时间修补BUG 每位开发人员每年节约2 6周时间研究表明假设一个中等工作团队为5人 则每个团队每月出现3次关键的内存访问错误 也就是每位开发人员每月0 6个错误 使用常规工具发现一个内存访问错误平均花费16小时 0 6个错误 月 开发人员 16小时 错误 9 6小时 月用来修补内存错误百分之六十的被调查者认为 使用PurifyPlus发现运行时错误带来的生产率系数大约是10倍 这就意味着过去用十小时发现并纠正的错误可以在不到一小时内得以纠正 即 使用常规的工具9 6
2、小时 1 10 Purify生产率系数 0 96小时 月 这说明每位开发人员每月节省8 64小时 9 6 0 96 8 64 按这样的方法计算一年 8 64小时 月 12月 103 7小时 年 每周40小时 这样就可以换算成每年节省2 6周 103 7小时 40小时 2 6周 PurifyPlus投资回报分析 花费更少的时间解决性能每位开发人员每年节省1 96周研究表明每位程序员花费大约5 的时间用于优化 改进程序性能 这样计算的话 不使用PurifyPlus 程序员每年花费2 4周改进程序性能 0 05 48周 年 2 4周 年 当使用了PurifyPlus解决性能问题后 生产率增益的系数估
3、计为5倍 这就意味着以前花费5小时纠正的错误现在仅需要1小时 在赢得这个5倍的 量化的生产率系数 后 每位开发人员每年将仅仅使用0 48周来解决性能问题 使用常规工具需要2 4小时 1 5 量化的生产率因子 0 48周 年 这表明每位开发人员每年节省将近两周的时间 2 4 0 48 1 92 PurifyPlus投资回报分析 提早发现BUG每年节省7000美元PurifyPlus通过突出显示没有完全通过测试并且可能仍旧包含BUG或性能问题的代码段 从而改进错误检测 通过提早发现BUG PurifyPlus带来了显著的费用节省 公认的行业标准表明在软件交付前修补BUG的花费小于10倍 使用Pur
4、ifyPlus的开发人员与不使用PurifyPlus的开发人员相比 每年平均多发现10个BUG在软件交付后修补一个BUG的开销估计是700美元 而在交付前修补一个BUG的开销仅为70美元 对于每位开发人员来说 使用PurifyPlus提前发现BUG节省的成本每年就是7000美元 10BUG 700美元交付后成本 7000美元 好的工具可以帮助开发人员每年多活一个月 BUG的危害 增加产品的开发时间 可能会把产品挂掉增加研发人员的劳动 经常加班可能会把人挂掉不断的消耗公司的利润严重影响研发人员的自信心和学习机会导致与家人团聚的时间减少 降低幸福指数影响寿命影响同事间感情致命的BUG可能会把公司挂
5、掉 软件BUG分类 如何降低软件的BUG 使用成熟的代码和框架少直接使用裸API多使用自己积累的开发代码使用CBB COTS使用成熟的开源框架ACE ICE BOOST STL技术代码与业务代码解耦技术代码 业务代码 产品代码抽象技术代码 好的设计模式 形成框架 通用中间件抽象业务代码 好的设计模式 形成框架 领域中间件 如何降低软件的BUG 对句柄资源在应用层进行资源使用统计文件 SOCKET 内存等系统资源不直接使用系统的内存管理 在应用层开发自己的内存池可以提高运行效率 减少频繁内存分配内存的分配释放可以自己控制 避免内存泄露 如何降低软件的BUG 编写代码尽量符合OCP原则面对变化优先
6、考虑不增加代码面对变化优先考虑增加新的模块面对变化优先考虑增加新的文件面对变化优先考虑增加新的类面对变化优先考虑增加新的函数模块对外接口要保持宽进严出原则 如何降低软件的BUG 尽量少用锁 用锁的最高境界是不用锁禁止使用递归锁 交叉锁 嵌套锁建议多使用ScopedLocking避免忘记释放锁对外接口采用Thread SafeInterface避免自死锁采用成熟的网络I O模型 少用SELECT模型单线程能解决问题就少使用多线程 多线程下优先采用静态多线程能用数组就不用堆进程间通信优先使用文本协议 如何降低软件的BUG 养成好的编码习惯使用简单的语法少使用多重继承 多级继承 嵌套 友元编写简单的
7、类功能单一 接口清晰 函数不要过多编写简单的函数输入参数 0 3 个 输出参数 0 1 少用 少用递归行数 0 20 20 20 50 70 50 100 10 100 0 编写简单的指令 如何降低软件的BUG 开发做好单元测试 需要有单元测试代码长时间在Valgrind环境运行 发现潜在BUG每个模块确保代码执行覆盖率在90 以上关键代码要Review 如何降低软件的BUG SE要充分理解用户需求 对需求负责开发代码要确保设计符合需求 对设计负责测试代表要在产品各个阶段进行测试 对产品质量负责开发人员对代码负责项目经理对进度 质量负责做好配置管理 如何降低软件的性能 如何定位软件BUG LO
8、G日志做到内部模块区别时间精确到毫秒异步调用可重定向到网络 如何定位软件BUG Telnet诊断通过标准的Telnet客户端实现远程控制通过命令可以查看程序内部状态通过命令可以修改程序内部状态 如何定位软件BUG 加入捕获代码 LONGWINAPICocaUnhandledFilter struct EXCEPTION POINTERS lpExceptionInfo HANDLEhFile CreateFile szFileName GENERIC WRITE 0 NULL CREATE ALWAYS FILE ATTRIBUTE NORMAL NULL if hFile INVALID H
9、ANDLE VALUE MINIDUMP EXCEPTION INFORMATIONExInfo ExInfo ThreadId GetCurrentThreadId ExInfo ExceptionPointers lpExceptionInfo ExInfo ClientPointers false BOOLbOK MiniDumpWriteDump GetCurrentProcess GetCurrentProcessId hFile MiniDumpNormal 如何定位软件BUG 诊断工具 IBMRationalPurifyPlus PurifyPlus是一套测试工具集合 拥有三个工
10、具PureCoverage Quantifyis和Purify 您可以用这套工具完成对代码覆盖率 性能和内存分析的运行时分析 它可以加强自动化测试工作 改善产品性能和质量PureCoverage用来进行代码覆盖率分析 它测量在所有测试用例中多少代码运行了 多少代码没有运行Quantify用来进行性能分析 分析应用程序的性能瓶颈Purify用来进行内存分析 它帮助寻找应用程序的内存泄漏和错误的内存使用 这些有可能导致应用程序崩溃支持Windows Linux C C Java要钱的 WinDbg 微软提供的基于源码级的免费调试工具功能上类似Linux下的GDB支持Kernel模式调试和User模
11、式调试支持DMP文件分析支持二次开发 WinDbg 如何定位程序崩溃 Valgrind Valgrind是一款动态分析工具 能自动检测内存管理和线程错误 以及发现程序的性能 以及Cache的使用 能直穿程序错误的心脏 真可谓是程序员的瑞士军刀Valgrind基于仿真技术 而非插入目标代码运行环境 X86 Linux AMD64 Linux ARM Linux PPC32 Linux PPC64 Linux X86 DarwinandAMD64 DarwinOnlySupportC C Valgrind Valgrind Memcheckisamemoryerrordetector Ithelp
12、syoumakeyourprograms particularlythosewritteninCandC morecorrect Cachegrindisacacheandbranch predictionprofiler Ithelpsyoumakeyourprogramsrunfaster Callgrindisacall graphgeneratingcacheprofiler IthassomeoverlapwithCachegrind butalsogatherssomeinformationthatCachegrinddoesnot Helgrindisathreaderrorde
13、tector Ithelpsyoumakeyourmulti threadedprogramsmorecorrect DRDisalsoathreaderrordetector ItissimilartoHelgrindbutusesdifferentanalysistechniquesandsomayfinddifferentproblems Massifisaheapprofiler Ithelpsyoumakeyourprogramsuselessmemory DHATisadifferentkindofheapprofiler Ithelpsyouunderstandissuesofb
14、locklifetimes blockutilisation andlayoutinefficiencies Valgrind Memcheck 对未初始化内存的使用读 写释放后的内存块读 写超出malloc分配的内存块读 写不适当的栈中内存块内存泄漏 指向一块内存的指针永远丢失不正确的malloc free或new delete匹配memcpy 相关函数中的dst和src指针重叠 Valgrind Example valgrind 3 5 0 memcheck testsvalgrind 3 5 0 helgrind tests valgrind tool memcheck leak che
15、ck full xml yes xml file log xml myprogvalgrind tool helgrind xml yes xml file log xml myprog Valgrind Helgrind HelgrindisaValgrindtoolfordetectingsynchronisationerrorsinC C andFortranprogramsthatusethePOSIXpthreadsthreadingprimitivesMisusesofthePOSIXpthreadsAPI Potentialdeadlocksarisingfromlockorde
16、ringproblems Dataraces accessingmemorywithoutadequatelockingorsynchronisation Problemsliketheseoftenresultinunreproducible timing dependentcrashes deadlocksandothermisbehaviour andcanbedifficulttofindbyothermeans Valgrind Helgrind unlockinganot lockedmutexunlockingamutexheldbyadifferentthreaddestroyinganinvalidoralockedmutexrecursivelylockinganon recursivemutexwhenaPOSIXpthreadfunctionfailswithanerrorcodethatmustbehandledwhenathreadexitswhilststillholdinglockedlocks Valkyrie 参考资源 网站高端调试网站 软件调试 W