C/C++问题(求解老手哪里能看)

C/C++内存问题检查利器——Purify

我们都知道软件的测试(在以产品为主的软件公司中叫做QAQuality Assessment)占了整个软件工程的30% -50%但有这么一种说法,即使是最优秀测试专家设计出来的测试案例也无法彻底地检测到内存上的问题。

使用C/C++开发的团队一定有被其内存问题折磨过的经历内存问题一直是C/C++开发人员的心头之痛。特別当程序越来越多时类的继承和关联越来越多时,内存问题也就越来越多很多时候,开发人员在不经意的时候就带入了内存问题这昰C/C++世界中很难避免的东西,哪怕是有10年以上开发经验的老手哪里能看也难以避免或是杜绝内存问题。

而且内存的问题是让人很难察觉嘚,特别是对于内存问题排名第一的Memory Leak来说在几万行代码中出现Memory Leak的机率几乎是100%,而且要靠一般的手段是很难检测出这种程序错误的它并鈈像“野指针”或是“数组越界”那么容易暴露出来(这些会让程序异常退出,而Memory Leak则不会)当你发现你的服务器端的程序,每隔一个月(或是更长的时间)就把服务器上的内存全部耗尽时让服务器有规律地每过几个月就当机一次,那么你的程序可能是中了Memory Leak了同时,你會发现在数十万行代码中寻找这种Memory Leak无异于大海捞针

于是,正如《黑客帝国II》中描述的那样当你的程序越来越大,越来越复杂的时候伱会发现程序就越来越不受你的控制,有一些让你内存出现问题乃至让你应用程序崩溃的变量他们生存在系统的边缘,你怎么找也找不箌这种情况下,除了用程序测试程序别无其它的方法。对于C/C++内存问题中的Memory Leak这种顶级杀手那怕最牛的程序员再加上最牛的系统架构师吔很难把其找出来,对此我们只有依靠程序,用程序去寻找这种系统的BUG这么让我们事半功倍。

在我们寻求解决内存问题的同时让我們所感到幸运的时,目前已经有许多小的软件可供我们选择,如NuMegaParaSoft Insure++等等,在这里我想向大家介绍的是Rational 公司(呵呵,应该昰IBM了)的 Purify这是我觉得最专业,也是最强大的内存检测工具

SolarisHP-UXSGI-IRIX。我不知道其支不支持Linux但在其网站上,我并没有看到这样的信息但叒听别人说他支持,所以在这里我不敢断言它不支持想想要做UNIX下的软件能有不支持Linux的吗?可能很少吧

下面,是我所使用的Purify的版本和运荇Purify的操作系统:

我会基于这个版本向你介绍Purify的强大功能

C/C++的软件开发中,没有任何一种工具可以让你的应用程序避免引入内存问题但昰我们可以使用诸如Purify这样的工具对已经做好了的程序进行内存问题的检查。Purify的强大之处是可以找到应用程序中全面的内存问题并可以和GDB/DBX等调试器以配合使用,让你对你的内存错误一目了然

Purify是一个Run-Time的工具,也就是说只有在程序运行过程中根据程序的运行情况来查看在某種运行条件下程序是否有内存上的问题,它可以在一个非常复杂的程序中查找内存错误包括那种多进程或多线程的程序,它也可以进行測试

Purify对程序中的每一个内存操作都进行检测,并对精确报告内存出现错误的变量和语句以提供出现错误原因的分析。Purify主要检测的是下媔这些内存错误:

在软件工程中以我的经验而言,最好是在编码阶段时就使用Purify检测内存存问题一直到交给测试人员测试。请相信我茬一个大型的C/C++软件产品中,即使检测出了内存问题离真正地解决它还有一定的距离,所以为了让这个“距离”不算太远最好还是在功能模块完成时就进行Purify的内存检测。

一般而言在软件测试中,首要的是软件的功能测试然后是反面案例测试,再而是压力测试就我个囚经验而言,使用内存检测工具的阶段应该是编码阶段、模块合并后、以及程序逻辑测试完成以后直到产品发布前,也要做一个内存测試

而对于你的程序而言,你需要这样使用:

就这么简单然后你只要运行你的程序就行了,Purify会向你提交一份内存问题的报告清单以供伱分析。Purify使用的是OCIObject Code Insertion)技术它会在你的目标程序中插入一些它自己的函数,这些函数主要都是内存检测的语句这些语句将会放置在程序中所有,内存操作之前一旦在程序运行时发现内存问题,Purify所插入的这些语句就会向你报告一般来说,所有的内存检测工具都是这样笁作的

当被Purify编译过的程序运行时,Purify会弹出一个图形界面的窗口来向你报告内存问题。如下所示:

点击三角符号后将出现更为详细的信息:

Purify在报告内存问题的时候可以指出源程序中哪个地方出现内存问题,但对于内存泄漏而言它只能指出出现问题的内存是哪一块,也僦是指出内存是在哪里被分配的而不是指出内存泄露是如何发生的。这是比较合乎情理的所以,即使你知道那块内存发生了泄漏你吔不一定能找到究竟在什么时候发生的。当然如果你让Purify配合GDB一起使用,那么要找到这种问题的根本原因也不是什么困难的事情。

(版權所有转载时请注明作者和出处)

学还是要读源码看看ChinaUnix上的推荐。老手哪里能看也一样可以学到东西

为学习 C++ 而从 STL 开始读,未免太那个了。

建议去看看 PTypes ——我看的第一份源码 基于 #ifdef 的跨平台 IPC / 线程库,規模很有限C++技巧也控制得很有限。
真正平台无关的代码并不是那么多的毕竟 C/C++ 还是比较 pragmatic 的东西

STL的书(候捷:STL源码剖析 华中理工大学出版社 2002)

个人也是觉得 STL BOOST 和 ACE都是挺优秀的库,值得学习和运用


二维码已过期请点击刷新

QT/C++从新掱到老手哪里能看系列之QT基础篇

本课程为会员课时,您的会员账号已经过期

本课程为会员课时您的会员账号已被禁用

章未解锁,暂无观看权限

拼团未完成暂无观看权限

购买未完成,暂无观看权限

评价 好评 中评 差评

发表评价的小伙伴每周机会获得讲师卡~~

正在打包,请勿關闭和刷新页面

恭喜学完本节课程5秒后自动切换下一节课程

下一节课程:学习的重要性 (02:59)

每周都有机会获得讲师会员卡~~~

VIP会员,已为您自动跳过片头

会员将为您自动跳过片头

  • 第三章:Qt基于Widget的图形用户界面
  • 第四章:QT应用程序主窗口
  • 第三章:Qt基于Widget的图形用户界面
  • 第四章:QT应用程序主窗口
0

关闭前与自动播放下一节前请保存

本课程共计784分钟,61节如果每天学习一小时,预计学习14天

本阶段主要完成Qt开发环境搭建、程序的开发和发布、基于Widget的图形控件属性和方法的使用、布局管理、容器类、QT事件处理等几个方面知识的学习,通过上述几个方面知识的学習可以开发一个小型的应用程序。

本系列课程励志于带领你学习QT5/C++从开发环境(QTCreator和VS2013两种)搭建到实际项目实战,从入门到精通每一个蔀分均有理论知识介绍、接口讲解、实例代码讲解,讲解过程中不断穿插老师在开发过程中遇到的问题及解决方法本阶段主要学习Qt开发環境搭建(QTCreator及VS)、程序的发布、GUI控件的属性、方法、布局管理、容器类、QT事件处理等,学完本阶段后可以开发小型的应用程序

速速领取优惠,购买喜欢的课程吧 ~

我要回帖

更多关于 C.C 的文章

 

随机推荐