内存走漏
在此,议论的是程序规划中内存走漏和过错的问题,不过,并不是一切的程序都有这一问题。首要,走漏等一些内存方面的问题在有的程序言语中是不简单产生的。这些程序言语一般都以为内存办理太重要了,所以不能由程序员来处理,最好仍是由程序言语规划者来处理这些问题,这样的言语有Perl、Java等等。
可是,在一些言语(最典型的便是C和C++)中,程序言语的规划者也以为内存办理太重要,但必需由开发人员自己来处理。内存走漏指的是程序员动态分配了内存,可是在运用完结后却忘了将其开释。除了内存走漏以外,在开发人员自己办理内存的开发中,缓冲溢出、悬摆指针等其它一些内存的问题也时有产生。
问题缘何产生
为了让程序能够处理在编译时无法预知的数据占用内存的巨细,所以程序必需求从操作体系实时地请求内存,这便是所谓的动态内存。这时候,就会呈现程序请求到内存块而且运用完结后,没有将其归还给操作体系的过错。更糟的情况是所获取的内存块的地址丢掉,然后体系无法继续辨认、定位该内存块。还有其它的问题,比方企图拜访现已开释的指针(悬摆指针),再如拜访现已被运用了的内存(内存溢出)的问题。
结果不容忽视
关于那些不常驻内存的程序来说,由于履行进程很短,所以即便有缝隙或许也不会导致特别严峻的结果。不过关于一些常驻内存的程序(比方Web服务器Apache)来说,假如呈现这样的问题,结果将十分严峻。由于有问题的程序会不断地向体系请求内存,而且不开释内存,终究或许导致体系内存耗尽而导致体系溃散。此外,存在内存走漏问题的程序除了会占用更多的内存外,还会使程序的功用急剧下降。关于服务器而言,假如呈现这种情况,即便体系不溃散,也会严峻影响运用。
悬摆指针会导致一些潜在的风险,而且这些风险不简单爆发。它十分不明显,因此很难被发现。在这三种存在的问题方法中,缓冲溢出或许是最风险的。事实上,它或许会导致许多安全性方面的问题(一个安全的程序包括许多要素,可是最重要的莫过于当心运用内存)。正如上面所述,有时也会产生同一内存块被屡次返还给体系的问题,这明显也是程序规划上的过错。一个程序员十分期望知道在程序运转的进程中,运用内存的情况,然后能够发现而且批改问题。
怎么处理
现在现已有了一些实时监测内存问题的技能。内存走漏问题能够经过守时地停止和重启有问题的程序来发现和处理。在比较新的Linux内核版别中,有一种名为OOM(Out Of Memory )杀手的算法,它能够在必要时挑选履行Killed等程序。悬摆指针能够经过定时对一切现已返还给体系的内存置零来处理。处理内存溢出问题的方规律多种多样。
事实上,在程序运转时来处理这些问题,明显要费事得多,所以咱们期望能够在开发程序时就发现并处理这些问题。下面介绍一些可用的自由软件。
东西一:废物收回器(GC)
在GCC(下载)东西包中,有一个“废物收回器(GC)”,它能够轻松检测而且批改许多的内存问题。现在该项目由HP的Hans-J.Boehm担任。
运用的技能
GC运用的是名为Boehm-Demers-Weiser的能够继续盯梢内存定位的技能。它的算法经过运用规范的内存定位函数来完结。程序运用这些函数进行编译,然后履行,算法就会剖析程序的操作。该算法十分出名而且比较简单了解,不会导致问题或许对程序有任何搅扰。
功用
该东西有很好的功用,故能够有用进步程序功率。其代码十分少而且能够直接在GCC中运用。
该东西没有界面,运用起来比较困难,所以要想把握它仍是要花一些时间的。一些现有的程序很有或许无法运用这个编辑器进行装备。此外,为了让一切的调用能被捕获,一切的内存调用(比方malloc()和free())都必须要运用由GC供给的相应函数来替代。咱们也能够运用宏来完结这一作业,但仍是觉得不行灵敏。
定论
假如你期望能够有跨渠道(体系结构、操作体系)的处理方案,那么便是它了。
东西二:Memprof
Memprof(下载)是一个十分具有吸引力且十分易于运用的软件,它由Red Hat的Owen Talyor创建。这个东西是用于GNOME前端的Boehm-Demers-Weiser废物收回器。
运用的技能
就其核心技能来说,Memprof和上面说到的GC没有什么实质的不同。不过在完结这一功用时,它是从程序中捕获一切的内存请示而且实时将其重定位到废物收回器。
功用
该东西的功用十分不错,其GUI规划得也不错(如图1所示)。这个东西直接就能够履行,而且其作业起来无需对源代码进行任何修正。在程序履行时,这个东西会以图形化的方法显现内存的运用情况,以协助你了解程序运转进程中内存的请求情况(如图1)。
图1 Memprof的GUI
该东西现在只能运转于x86和PPC体系结构之上的Linux体系之中。假如你需求用于其它的渠道,应该想想运用其它的东西。该东西不是GTK应用程序,所以需求一个完好的GNOME环境。这样就使得其不能灵敏用于一切的当地。此外,该东西的开发作业进展得也比较缓慢(现在是0.4.1版)。
定论
假如你喜爱GUI东西而且不介怀只能用于Linux以及GNOME之下,该东西应该能够说是十分不错。
东西三:Valgrind
Valgrind(http://developer.kde.org/~sewardj/)是一个致力于处理一切内存问题的程序,而内存走漏只不过是其间的问题之一罢了。该东西的开发人员是Julian Seward(以Bzip2和Cacheprof而出名)。该东西声称自己“是专门致力于处理x86 Linux中开放源代码的内存问题”,事实上,它确实做到了自己的宣言。此外,它还能够描绘CPU缓存的运用情况,不过这一功用并不常用。
运用的技能
在这个程序中运用的技能十分复杂,不过其文档十分丰厚和完好(http://developer.kde.org/~sewardj/docs/techdocs.html)。程序分配的每一字节的内存都被一个有九位的情况字盯梢,其目的是用于辨认其目的。这种做法大大加剧了体系的担负。
功用
这个东西是咱们这儿介绍的三款中功用最差的一个,原因是清楚明了的。该东西供给的信息细节是三个东西中最丰厚的,因此速度也是最慢的。除了一些常见的问题外,该东西还能够发现内存其它的一些问题,乃至一些POSIX线程方面的问题。缓冲的信息关于大部分程序来说好像没有必要,不过它是一个检查程序功用的很好方法。关于Valgrind来说,值得一提的便是其开发速度十分快,其开发社团也十分活泼。事实上,在Valgrind的主页上作者乃至有一句话:“假如你在运用Valgrind进程中有任何问题,请不要介怀,给我发邮件吧”。
不过,该东西是专门用于x86的。其界面是纯命令行方法,可是其可用性十分好。该东西能够直接在二进制下运转,所以在运用时并不需求对其进行从头编译。不过要熟练把握它,仍是需求运用者进行一番尽力的。此外,尽管该东西从前运用于Mozilla、OpenOffice等一些大的线程程序,但该东西对线程的支撑并不完善。我想假如该东西要是有一个GUI界面,将会赢得更多人的喜爱。
定论
假如你运用x86,对自己的代码十分了解而且不介怀运用命令行方法,那么这个程序将是你的至爱。
假如我在此介绍的三款东西你都不喜爱,那也没有关系,可在下面站点中找到许多检测内存过错的东西:http://www.sslug.dk/emailarkiv/bog/2001_08/msg00030.html。此外,还有一些商业东西,比方Purify、Geodesic等。在此就不具体介绍。