一种基于Linux内核内存泄露的检测方法技术

技术编号:17442003 阅读:39 留言:0更新日期:2018-03-10 14:41
本发明专利技术提供了一种基于Linux内核内存泄露的检测方法,应用于内存泄露的检测,读取节点,获取每一个内存页分配函数的返回地址,以及分配分配函数对应分配的内存页的数量;于读取完成之后,释放节点统计的分配函数的返回地址以及分配函数对应分配的内存页的数量;再次读取节点,获取每一个分配函数的返回地址,以及分配函数对应分配的内存页的数量;将上述同一分配函数各自所对应分配的内存页的数量,并进行比较取得差值,在差值为正值且差值一直增大时,判断分配函数对应分配的内存页存在泄漏。其技术方案的有益效果在于,在检测内存是否存在泄露的过程中对内存的消耗较小且不影响不影响内存分配以及释放效率。

【技术实现步骤摘要】
一种基于Linux内核内存泄露的检测方法
本专利技术涉及通信
,尤其涉及一种基于Linux内核内存泄露的检测方法。
技术介绍
内存泄漏(MemoryLeak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。现有的在Linux系统中,对内存进行泄露检测具体是通过Kernel默认的memleak检测技术,当执行memleak检测方法之后,Kernel(内核)会在调用kmalloc、vmalloc、kmem_cache_alloc等函数的返回处跟踪其指针,连同其大小和堆栈跟踪信息,一并存储到PRIO搜索树中,当内核释放内存的时候,会通过kmemleak_free删除存储的跟踪信息。kernel会启动一个kmemleak_s的内核线程,周期性的扫描已经存储的对象信息,然后判断对象是否被引用进而确定是否存在内存泄漏。上述的memleak技术存在以下缺陷,在检测过程中需要周期性的扫描,会增加CPU消耗负担;在内存分配、释放的时候再次进行slab分配以记录内存对象的信息,这样会延长内存分配、释放的时间,降低系统效率。
技术实现思路
针对现有技术中检测内存泄露存在的上述问题,现提供一种旨在占用内存较小且不影响内存分配以及释放效率的基于Linux内核内存泄露的检测方法。具体技术方案如下:一种基于Linux内核内存泄露的检测方法,应用于内存泄露的检测,所述内存包括多个内存页,其中,创建一节点,通过所述节点统计每个所述内存页被调用的分配函数的返回地址,以及每个所述分配函数分配的所述内存页的数量;包括以下步骤:步骤S1、读取所述节点,获取每一个所述内存页所述分配函数的返回地址,以及所述分配分配函数对应分配的所述内存页的数量;步骤S2、于读取完成之后,释放所述节点统计的所述分配函数的返回地址以及所述分配函数对应分配的所述内存页的数量;步骤S3、再次读取所述节点,获取每一个所述分配函数的返回地址,以及所述分配函数对应分配的所述内存页的数量;步骤S4、获取所述步骤S3中与所述步骤S1中同一所述分配函数各自所对应分配的所述内存页的数量,并进行比较取得差值;在所述差值为正值且所述差值一直增大时,判断所述分配函数对应分配的内存页存在泄漏。优选的,每个所述内存页包括一数据结构,于所述数据结构中增加一地址返回标识,一分配阶数以及一内存类型的分配标识;所述地址返回标识用以记录内存分配时调用函数的地址;所述分配标识用以表示所述内存页被分配的内存类型。优选的,在每次内存分配时保存调用函数信息时,通过内核栈检查函数调用链,所述调用链中依次保存有公共分配函数以及所述分配函数所对应的返回地址、分配参数以及分配阶数;获取所述调用链中顶层的所述分配函数所对应的所述返回地址、所述分配参数以及所述分配阶数;并将所述返回地址保存至所述地址返回标识中以及将所述分配参数以及所述分配阶数保存至所述内存页面数据结构中。优选的,所述内存中包括多个内存区,每个所述内存区由多个所述内存页形成,获取每个所述内存页的所述分配函数的方法,包括以下步骤:步骤A1、按序读取每个所述内存区;步骤A2、读取每个所述内存区中每个所述内存页所对应的所述数据结构,以获取每个所述内存页对应的所述分配函数对应的返回地址;步骤A3、在所有所述内存区以及每个内存区中的所述内存页读取完成后,将获取的所有所述分配函数对应的返回地址,以及每个所述分配函数分配的所述内存页的数量形成一临时数组。优选的,提供一打印模块,通过所述打印模块将所述临时数组中保存的每个所述分配函数、所述分配函数对应的返回地址以及所述分配函数对应分配的所述内存页的数量打印显示于一界面中。优选的,在所述步骤A2中,提供一临时记录数组,用以保存读取的所述内存页对应的所述分配函数的返回地址;在所述步骤A2中,还包括以下步骤:步骤A21、判断所有的内存页是否读取完成;若是,表示所有的所述内存页读取完成,退出;步骤A22、读取下一所述内存页时将读取的分配函数对应的返回地址与所述临时记录数组中的返回地址进行匹配;步骤A23、若匹配相同,则对当前的所述分配函数分配的内存页的数量加1,并返回步骤A21;步骤A24、若匹配不同,则将所述内存页对应的所述分配函数的返回地址保存于所述临时记录数组中,并返回步骤A21。优选的,当所述内存页被释放时,将保存在所述地址返回标识中的返回地址以及保存在所述数据结构中的所述分配参数以及所述分配阶数清空。优选的,提供一宏配置模块用以配置形成所述地址返回标识。上述技术方案具有如下优点或有益效果:在检测内存是否存在泄露的过程中对内存的消耗较小且不影响不影响内存分配以及释放效率,克服了现有技术中通过Kernel默认的memleak检测技术在执行检测过程中需要周期性的扫描,增加CPU消耗负担以及在内存分配、释放的时候再次进行slab分配以记录内存对象的信息,会延长内存分配、释放的时间,降低系统效率的问题。附图说明参考所附附图,以更加充分的描述本专利技术的实施例。然而,所附附图仅用于说明和阐述,并不构成对本专利技术范围的限制。图1为本专利技术一种基于Linux内核内存泄露的检测方法的实施例的流程图;图2为本专利技术一种基于Linux内核内存泄露的检测方法的实施例中,关于获取每个所述内存页的所述分配函数的方法的流程图;图3为本专利技术一种基于Linux内核内存泄露的检测方法的实施例中,关于获取每个所述内存页的所述分配函数的方法的流程图;图4为本专利技术一种基于Linux内核内存泄露的检测方法的实施例中,关于内核内存分配API调用关系图。具体实施方式下面将结合本专利技术实施例中的附图,对本专利技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本专利技术一部分实施例,而不是全部的实施例。基于本专利技术中的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本专利技术保护的范围。需要说明的是,在不冲突的情况下,本专利技术中的实施例及实施例中的特征可以相互组合。下面结合附图和具体实施例对本专利技术作进一步说明,但不作为本专利技术的限定。本专利技术的技术方案中包括一种基于Linux内核内存泄露的检测方法。一种基于Linux内核内存泄露的检测方法的实施例,应用于内存泄露的检测,内存包括多个内存页,其中,创建一节点,通过节点统计每个内存页被调用的分配函数的返回地址,以及每个分配函数分配的内存页的数量;如图1所示,包括以下步骤:步骤S1、读取节点,获取每一个内存页分配函数的返回地址,以及分配分配函数对应分配的内存页的数量;步骤S2、于读取完成之后,释放节点统计的分配函数的返回地址以及分配函数对应分配的内存页的数量;步骤S3、再次读取节点,获取每一个分配函数的返回地址,以及分配函数对应分配的内存页的数量;步骤S4、获取步骤S3中与步骤S1中同一分配函数各自所对应分配的内存页的数量,并进行比较取得差值;在差值为正值且差值一直增大时,判断分配函数对应分配的内存页存在泄漏。针对现有的在Linux系统中,通过Kernel默认的memleak检测技术对内存进行泄露检测,通常在检测过程中需要周期性的扫描,会增加CPU消耗负担;在内存分配、释放的时候再次进行slab分配以记录内存对象的信息本文档来自技高网...
一种基于Linux内核内存泄露的检测方法

【技术保护点】
一种基于Linux内核内存泄露的检测方法,应用于内存泄露的检测,所述内存包括多个内存页,其特征在于,创建一节点,通过所述节点统计每个所述内存页被调用的分配函数的返回地址,以及每个所述分配函数分配的所述内存页的数量;包括以下步骤:步骤S1、读取所述节点,获取每一个所述内存页所述分配函数的返回地址,以及所述分配分配函数对应分配的所述内存页的数量;步骤S2、于读取完成之后,释放所述节点统计的所述分配函数的返回地址以及所述分配函数对应分配的所述内存页的数量;步骤S3、再次读取所述节点,获取每一个所述分配函数的返回地址,以及所述分配函数对应分配的所述内存页的数量;步骤S4、获取所述步骤S3中与所述步骤S1中同一所述分配函数各自所对应分配的所述内存页的数量,并进行比较取得差值;在所述差值为正值且所述差值一直增大时,判断所述分配函数对应分配的内存页存在泄漏。

【技术特征摘要】
1.一种基于Linux内核内存泄露的检测方法,应用于内存泄露的检测,所述内存包括多个内存页,其特征在于,创建一节点,通过所述节点统计每个所述内存页被调用的分配函数的返回地址,以及每个所述分配函数分配的所述内存页的数量;包括以下步骤:步骤S1、读取所述节点,获取每一个所述内存页所述分配函数的返回地址,以及所述分配分配函数对应分配的所述内存页的数量;步骤S2、于读取完成之后,释放所述节点统计的所述分配函数的返回地址以及所述分配函数对应分配的所述内存页的数量;步骤S3、再次读取所述节点,获取每一个所述分配函数的返回地址,以及所述分配函数对应分配的所述内存页的数量;步骤S4、获取所述步骤S3中与所述步骤S1中同一所述分配函数各自所对应分配的所述内存页的数量,并进行比较取得差值;在所述差值为正值且所述差值一直增大时,判断所述分配函数对应分配的内存页存在泄漏。2.根据权利要求1所述的检测方法,其特征在于,每个所述内存页包括一数据结构,于所述数据结构中增加一地址返回标识,一分配阶数标志以及一内存类型的分配标识;所述地址返回标识用以记录内存分配时调用函数的地址;所述分配标识用以表示所述内存页被分配的内存类型。3.根据权利要求2所述的检测方法,其特征在于,在每次内存分配时保存调用函数信息时,通过内核栈检查函数调用链,所述调用链中依次保存有公共分配函数以及所述分配函数所对应的返回地址、分配参数以及分配阶数;获取所述调用链中顶层的所述分配函数所对应的所述返回地址、所述分配参数以及所述分配阶数;并将所述返回地址保存至所述地址返回标识中以及将所述分配参数以及所述分配阶数保存至所述内存页的数据结构中。4.根据权利要求2所述的检测方法,其特征在...

【专利技术属性】
技术研发人员:曾涛
申请(专利权)人:晶晨半导体上海股份有限公司
类型:发明
国别省市:上海,31

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1