当前位置:首页 > 嵌入式 > 嵌入式软件
[导读] 内存泄漏在此,谈论的是程序设计中内存泄漏和错误的问题,不过,并不是所有的程序都有这一问题。首先,泄漏等一些内存方面的问题在有的程序语言中是不容易发生的。这些程序

 内存泄漏

在此,谈论的是程序设计中内存泄漏和错误的问题,不过,并不是所有的程序都有这一问题。首先,泄漏等一些内存方面的问题在有的程序语言中是不容易发生的。这些程序语言一般都认为内存管理太重要了,所以不能由程序员来处理,最好还是由程序语言设计者来处理这些问题,这样的语言有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等。在此就不详细介绍。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭