基于VxWorks操作系统的动态内存泄漏检测方法及装置制造方法

文档序号:6512215阅读:361来源:国知局
基于VxWorks操作系统的动态内存泄漏检测方法及装置制造方法
【专利摘要】基于VxWorks操作系统的动态内存泄漏检测方法及装置,涉及一种动态内存泄漏检测方法及装置。为了解决目前动态内存泄漏检测的检错效率低且速度慢的问题。它通过改写内存分配函数malloc()和内存释放函数free()得到函数LC_malloc()和函数LC_free(),以日志的形式记录分配和释放信息,实现动态内存的跟踪;通过TCP通信协议,使用数据发送缓冲队列,将日志信息从安装有VxWorks操作系统的工控机上传到上位机;在上位机中,从日志文件中读入日志事件项,并对比内存的分配和释放,从日志文件中分析并检测出内存泄露。它适用于动态内存泄漏检测。
【专利说明】基于VxWorks操作系统的动态内存泄漏检测方法及装置
【技术领域】
[0001]本发明涉及一种动态内存泄漏检测方法及装置,特别涉及一种基于VxWorks操作系统的动态内存泄漏检测方法及装置。
【背景技术】
[0002]Vxfforks是美国Wind River公司开发的一种实时操作系统,其以良好的可靠性和卓越的实时性被广泛应用于很多实时性要求极高的领域。一般使用VxWorks操作系统的产品都是内存一定,而又要长期稳定运行的产品,因此长时候少量的内存泄漏对系统来说也是不合适的。在程序的运行中,导致程序中存在多种与动态内存管理相关的错误,有内存泄漏、内存的重复释放、空指针引用等。这些错误占到软件系统内存故障的50%,这些错误导致系统失效甚至崩溃,这在实时操作系统中是不允许的。
[0003]目前,关于动态内存错误的检测方法和工具主要分为两类:动态方法和静态方法。
[0004]静态方法通过对程序结构的分析来检测程序中隐藏的动态内存错误,如Lint,Splint等是通过在源程序中添加注释语句来检测应用程序中潜在的错误,而检错效果与应用程序中的注释量有关,并且这些工具中存在的严重问题是经常会给出错误的报告,这些不正确的报警信息会对排错工作产生负面的影响,从而影响错误检测工作的顺利进行。
[0005]动态方法需要在程序中进行潜在错误的检测,如purify,它是一个动态的单元测试工具,可以检测到程序中存在的内存泄漏问题,而对于其他的动态内存错误,如空指针的引用,动态内存的重复释放等问题却无能为力。同时,purify需要在程序的运行中进行内存泄漏的检测,由于程序中分支结构的存在,程序的一次运行不能覆盖所有的程序分支,有些错误不能通过程序的运行暴露出来,从而在一定程度上降低了检错效率。Purify和其他动态检测工具一样有一个很重大的限制:会显著增加运行时的负荷。有时候这些工具能够使程序的运行速度减慢20倍。

【发明内容】

[0006]本发明的目的是为了解决目前动态内存泄漏检测的检错效率低且速度慢的问题,本发明提供一种基于VxWorks操作系统的动态内存泄漏检测方法及装置。
[0007]本发明的基于VxWorks操作系统的动态内存泄漏检测方法,它是基于安装Vxfforks操作系统的工控机和上位机实现的,所述工控机内嵌入有工控机软件,所述工控机软件的工作过程包括如下步骤:
[0008]用于调用函数LCjnallocO和函数LC_free O实现动态内存的跟踪,并以日志的形式记录各事件项的内存分配和内存释放的信息的步骤;
[0009]函数LC_malloc()用于根据用户需求内存大小的参数进行内存分配,若返回一个有效的内存地址,则将动态内存分配信息输出到日志文件,若返回一个无效的内存地址,则不做任何日志操作;
[0010]函数LC_free()用于对指定的内存释放,若内存释放成功,则将动态内存释放信息输出到日志文件,如果内存释放失败,则不做任何日志操作;
[0011]用于将日志信息通过TCP通信协议并使用数据发送缓冲队列发送到上位机的步骤;
[0012]所述上位机内嵌入有上位机软件,所述上位机软件包括如下步骤:
[0013]用于从日志文件中读入日志信息,遍历日志信息中的每个日志事件项,并检查读入的每个日志事件项是否进行了内存分配操作或者内存释放操作的步骤;
[0014]用于当读入的日志事件项进行了内存分配操作时,将所述日志事件项的内存地址作为键值加入哈希表的步骤;
[0015]用于当读入的日志事件项进行了内存释放操作时,判断哈希表中是否存在所述日志事件项对应的内存地址的步骤;
[0016]用于当哈希表中存在内存释放操作的日志事件项的内存地址时,在哈希表中删除所述日志事件项对应的内存地址的步骤;
[0017]用于当哈希表中不存在内存释放操作的日志事件项的内存地址时,将所述日志事件项及相应信息加入到重复释放错误列表中的步骤;
[0018]用于当检测到进行了内存分配操作的日志事件项的已分配时间达到设定的阈值且没有进行内存释放操作时,将所述日志事件项标记为内存泄漏事件项的步骤;
[0019]用于当遍历完日志文件中所有日志事件项时,根据重复释放错误列表中的信息和哈希表中标记的内存泄漏事件项,定位发生内存泄漏的位置的步骤。
[0020]本发明的基于VxWorks操作系统的动态内存泄漏检测装置,它是基于安装Vxfforks操作系统的工控机和上位机实现的,所述工控机包括如下装置:
[0021]用于调用函数LC_mal1c O和函数LC_free()实现动态内存的跟踪,并以日志的形式记录各事件项的内存分配和内存释放的信息的装置;
[0022]函数LCjnallocO用于根据用户需求内存大小的参数进行内存分配,若返回一个有效的内存地址,则将动态内存分配信息输出到日志文件,若返回一个无效的内存地址,则不做任何日志操作;
[0023]函数LC_free()用于对指定的内存释放,若内存释放成功,则将动态内存释放信息输出到日志文件,如果内存释放失败,则不做任何日志操作;
[0024]用于将日志信息通过TCP通信协议并使用数据发送缓冲队列发送到上位机的装置;
[0025]所述上位机包括如下装置:
[0026]用于从日志文件中读入日志信息,遍历日志信息中的每个日志事件项,并检查读入的每个日志事件项是否进行了内存分配操作或者内存释放操作的装置;
[0027]用于当读入的日志事件项进行了内存分配操作时,将所述日志事件项的内存地址作为键值加入哈希表的装置;
[0028]用于当读入的日志事件项进行了内存释放操作时,判断哈希表中是否存在所述日志事件项对应的内存地址的装置;
[0029]用于当哈希表中存在内存释放操作的日志事件项的内存地址时,在哈希表中删除所述日志事件项对应的内存地址的装置;
[0030]用于当哈希表中不存在内存释放操作的日志事件项的内存地址时,将所述日志事件项及相应信息加入到重复释放错误列表中的装置;
[0031]用于当检测到进行了内存分配操作的日志事件项的已分配时间达到设定的阈值且没有进行内存释放操作时,将所述日志事件项标记为内存泄漏事件项的装置;
[0032]用于当遍历完日志文件中所有日志事件项时,根据重复释放错误列表中的信息和哈希表中标记的内存泄漏事件项,定位发生内存泄漏的位置的装置。
[0033]本发明的优点在于,通过改写内存分配函数mallocO和内存释放函数free O得到函数LCjnallocO和LC_free O,以日志的形式记录内存分配和内存释放信息,实现动态内存的跟踪;通过TCP通信协议,使用数据发送缓冲队列,将日志信息从安装VxWorks的工控机上传到上位机;在上位机中,从日志文件中读入日志事件项,并对比内存的分配和释放,从日志文件中分析并检测出内存。本发明比现有动态内存泄漏检测的检错效率提高了30%,且速度也提高了 20%。
【专利附图】

【附图说明】
[0034]图1为本发明所述的实现动态内存的跟踪的流程示意图。
【具体实施方式】
[0035]【具体实施方式】一:结合图1说明本实施方式,本实施方式所述的基于VxWorks操作系统的动态内存泄漏检测方法,本发明的基于VxWorks操作系统的动态内存泄漏检测方法,它是基于安装VxWorks操作系统的工控机和上位机实现的,所述工控机内嵌入有工控机软件,所述工控机软件的工作过程包括如下步骤:
[0036]用于调用函数LCjnallocO和函数LC_free O实现动态内存的跟踪,并以日志的形式记录各事件项的内存分配和内存释放的信息的步骤;
[0037]函数LCjnallocO用于根据用户需求内存大小的参数进行内存分配,若返回一个有效的内存地址,则将动态内存分配信息输出到日志文件,若返回一个无效的内存地址,则不做任何日志操作;
[0038]函数LC_free()用于对指定的内存释放,若内存释放成功,则将动态内存释放信息输出到日志文件,如果内存释放失败,则不做任何日志操作;
[0039]用于将日志信息通过TCP通信协议并使用数据发送缓冲队列发送到上位机的步骤;
[0040]所述上位机内嵌入有上位机软件,所述上位机软件包括如下步骤:
[0041]用于从日志文件中读入日志信息,遍历日志信息中的每个日志事件项,并检查读入的每个日志事件项是否进行了内存分配操作或者内存释放操作的步骤;
[0042]用于当读入的日志事件项进行了内存分配操作时,将所述日志事件项的内存地址作为键值加入哈希表的步骤;
[0043]用于当读入的日志事件项进行了内存释放操作时,判断哈希表中是否存在所述日志事件项对应的内存地址的步骤;
[0044]用于当哈希表中存在内存释放操作的日志事件项的内存地址时,在哈希表中删除所述日志事件项对应的内存地址的步骤;
[0045]用于当哈希表中不存在内存释放操作的日志事件项的内存地址时,将所述日志事件项及相应信息加入到重复释放错误列表中的步骤;
[0046]用于当检测到进行了内存分配操作的日志事件项的已分配时间达到设定的阈值且没有进行内存释放操作时,将所述日志事件项标记为内存泄漏事件项的步骤;
[0047]用于当遍历完日志文件中所有日志事件项时,根据重复释放错误列表中的信息和哈希表中标记的内存泄漏事件项,定位发生内存泄漏的位置的步骤。
[0048]本实施方式中还可以采用其它是非判断、逻辑判断的工具来替换哈希表。本实施方式中,通过TCP通信协议,安装VxWorks操作系统的工控机使用数据发送缓冲队将日志信息发送到上位机PC,这样分离了网络发送和硬件的中断,在控制端软件接收模块阻塞而导致网络阻塞的情况下,不会影响中断处理的速度或者定时轮询的次数。
[0049]为了能够从日志文件中分析并检测出内存泄漏,从日志文件中读入日志事件项,并对内存的分配和释放进行对比。在遍历日志文件的时候,检查每个事件项的操作是分配还是释放内存。如果发现事件项是内存分配操作,用内存地址作为键值把事件项加入哈希表。如果发现事件项是内存释放操作,在哈希表中删除对应的内存分配事件项。
[0050]如果在哈希表中没有找到对应的内存分配事件项,则说明检测到了重复释放错误。因为在哈希表中并没有对应内存块的申请操作,说明之前该内存块已被释放,现在试图释放该内存块即发生了重复释放操作。在程序中发生重复释放错误是十分危险的,会破坏数据的完整性,甚至会发生致命错误。
[0051]当一直遍历日志文件直到文件末尾,任何已经分配且没被释放的内存记录会仍然留在哈希表中。认定这种情况即发生了内存泄漏。进一步地,因为在日志信息中包含了事件发生的文件和行号,可以从中分析出发生内存泄漏事件的具体位置,这极大的方便了程序的调试工作。这个算法可以概括 为以下的伪代码:
[0052]
【权利要求】
1.基于VxWorks操作系统的动态内存泄漏检测方法,它是基于安装VxWorks操作系统的工控机和上位机实现的,其特征在于,所述工控机内嵌入有工控机软件,所述工控机软件的工作过程包括如下步骤:用于调用函数LC_mal 1c O和函数LC_free()实现动态内存的跟踪,并以日志的形式记录各事件项的内存分配和内存释放的信息的步骤;函数LCjnallocO用于根据用户需求内存大小的参数进行内存分配,若返回一个有效的内存地址,则将动态内存分配信息输出到日志文件,若返回一个无效的内存地址,则不做任何日志操作;函数LC_free()用于对指定的内存释放,若内存释放成功,则将动态内存释放信息输出到日志文件,如果内存释放失败,则不做任何日志操作;用于将日志信息通过TCP通信协议并使用数据发送缓冲队列发送到上位机的步骤;所述上位机内嵌入有上位机软件,所述上位机软件包括如下步骤:用于从日志文件中读入日志信息,遍历日志信息中的每个日志事件项,并检查读入的每个日志事件项是否进行了内存分配操作或者内存释放操作的步骤;用于当读入的日志事件项进行了内存分配操作时,将所述日志事件项的内存地址作为键值加入哈希表的步骤;用于当读入的日志事 件项进行了内存释放操作时,判断哈希表中是否存在所述日志事件项对应的内存地址的步骤;用于当哈希表中存在内存释放操作的日志事件项的内存地址时,在哈希表中删除所述日志事件项对应的内存地址的步骤;用于当哈希表中不存在内存释放操作的日志事件项的内存地址时,将所述日志事件项及相应信息加入到重复释放错误列表中的步骤;用于当检测到进行了内存分配操作的日志事件项的已分配时间达到设定的阈值且没有进行内存释放操作时,将所述日志事件项标记为内存泄漏事件项的步骤;用于当遍历完日志文件中所有日志事件项时,根据重复释放错误列表中的信息和哈希表中标记的内存泄漏事件项,定位发生内存泄漏的位置的步骤。
2.根据权利要求1所述的基于VxWorks操作系统的动态内存泄漏检测方法,其特征在于,它还包括:通过宏定义的方式,改写内存分配函数mallocO获得函数LC_malloc O的步骤;通过宏定义的方式,改写内存释放函数free O获得函数LC_free O的步骤。
3.根据权利要求1所述的基于VxWorks操作系统的动态内存泄漏检测方法,其特征在于,所述函数LC_mal1c O用于根据用户需求内存大小的参数进行内存分配为:函数LCjnallocO用于根据物理块链表中的参数进行内存分配;所述函数LC_free O用于对指定的内存释放为:函数LC_free()用于对物理块链表中指定的内存释放;所述物理块链表用于存储所有内存块的状态和连接所有物理位置相临的已分配内存块和未分配内存块。
4.基于VxWorks操作系统的动态内存泄漏检测装置,它是基于安装VxWorks操作系统的工控机和上位机实现的,其特征在于,所述工控机包括如下装置:用于调用函数LCjnallocO和函数LC_free()实现动态内存的跟踪,并以日志的形式记录各事件项的内存分配和内存释放的信息的装置;函数LCjnallocO用于根据用户需求内存大小的参数进行内存分配,若返回一个有效的内存地址,则将动态内存分配信息输出到日志文件,若返回一个无效的内存地址,则不做任何日志操作;函数LC_free()用于对指定的内存释放,若内存释放成功,则将动态内存释放信息输出到日志文件,如果内存释放失败,则不做任何日志操作;用于将日志信息通过TCP通信协议并使用数据发送缓冲队列发送到上位机的装置;所述上位机包括如下装置:用于从日志文件中读入日志信息,遍历日志信息中的每个日志事件项,并检查读入的每个日志事件项是否进行了内存分配操作或者内存释放操作的装置;用于当读入的日志事件项进行了内存分配操作时,将所述日志事件项的内存地址作为键值加入哈希表的装置;用于当读入的日志事件项进行了内存释放操作时,判断哈希表中是否存在所述日志事件项对应的内存地址的装置;用于当哈希表中存在内存释放操作的日志事件项的内存地址时,在哈希表中删除所述日志事件项对应的内存地址的装置;用于当哈希表中不存在内存释放操作的日志事件项的内存地址时,将所述日志事件项及相应信息加入到重复释 放错误列表中的装置;用于当检测到进行了内存分配操作的日志事件项的已分配时间达到设定的阈值且没有进行内存释放操作时,将所述日志事件项标记为内存泄漏事件项的装置;用于当遍历完日志文件中所有日志事件项时,根据重复释放错误列表中的信息和哈希表中标记的内存泄漏事件项,定位发生内存泄漏的位置的装置。
5.根据权利要求1所述的基于VxWorks操作系统的动态内存泄漏检测装置,其特征在于,它还包括:通过宏定义的方式,改写内存分配函数mallocO获得函数LC_malloc O的装置;通过宏定义的方式,改写内存释放函数freeO获得函数LC_free O的装置。
6.根据权利要求1所述的基于VxWorks操作系统的动态内存泄漏检测装置,其特征在于,所述函数LC_mal1c O用于根据用户需求内存大小的参数进行内存分配为:函数LCjnallocO用于根据物理块链表中的参数进行内存分配;所述函数LC_free O用于对指定的内存释放为:函数LC_free()用于对物理块链表中指定的内存释放;所述物理块链表用于存储所有内存块的状态和连接所有物理位置相临的已分配内存块和未分配内存块。
【文档编号】G06F11/36GK103455424SQ201310428609
【公开日】2013年12月18日 申请日期:2013年9月18日 优先权日:2013年9月18日
【发明者】陈兴林, 刘川, 杨天博, 刘杨 申请人:哈尔滨工业大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1