基于LTE协议栈的内存池问题定位方法及其系统技术方案

技术编号:15762774 阅读:105 留言:0更新日期:2017-07-05 22:51
本发明专利技术公开了一种基于LTE协议栈的内存池问题定位方法及其系统,方法包括:在内存块的头部设置第一标记、分配标记、字符串指针和位置变量,在尾部设置第二标记;若一内存块被分配,将分配标记设置为第一字符,将字符串指针设置为申请函数名,将位置变量设置为申请位置;被释放后,将分配标记设置为第二字符;重新放入内存池时,检测第一标记和第二标记是否正确;若第一标记正确且第二标记错误,判定越界;根据字符串指针以及位置变量,定位内存越界的位置;获取分配标记为第二字符的内存块;根据字符串指针记录以及位置变量,定位内存泄露位置。可在满足严格时序要求且不影响协议栈正常工作的情况下,解决内存池的内存泄露及内存越界问题。

Memory pool problem positioning method and system based on LTE protocol stack

The invention discloses a method including LTE protocol stack memory pool problem locating method and system, based on the first set: marking, labeling, distribution and location of string pointer variables in the memory block in the head, the tail part is provided with second marks; if the allocated memory block, the distribution of mark is set to the first character of the string. The pointer is set to apply the function name, the position variable is set to apply for the position; after being released, the distribution of marker set to second characters; back into the pool, detecting the first mark and the second mark is correct; if the first mark correctly and second mark errors, determine the boundary; according to the string pointer and position variables, out of memory location the location of a block of memory; obtain the distribution of labeled second characters; according to the string pointer records and position variables, memory leak location Position. In order to meet the strict timing requirements and not affect the normal work of the protocol stack, memory leaks and memory out of bounds in the memory pool can be solved.

【技术实现步骤摘要】
基于LTE协议栈的内存池问题定位方法及其系统
本专利技术涉及内存管理
,尤其涉及一种基于LTE协议栈的内存池问题定位方法及其系统。
技术介绍
在C语言环境下,内存的分配和释放,可以直接使用系统申请/释放函数接口。但是有以下弊端:1、调用系统函数,相对比较耗时;2、频繁使用会产生大量的内存碎片,从而降低程序运行效率。为了避免以上问题,在项目中一般使用内存池来代替系统函数进行内存管理。内存池的初始结构如图1所示,在真正使用内存之前,预先分配一定数量的内存块,当需要申请内存时,就从这些预先分配的内存块中选择,而不是直接使用系统函数进行分配。内存块被分配后,如图2所示。内存池算法一般关注于管理内存(分配算法、释放算法、不定长内存块算法等),而没有关注于内存池的稳定,即快速定位内存池泄露、内存块使用时越界问题。内存池泄露是指在从内存池分配一个内存块后,应该被释放而没有被释放的情况;内存块使用时越界与数组越界类似,比如向10字节大小的内存块写入20字节的数据。内存池泄露会导致内存最后耗尽,而越界则会导致程序运行不稳定。良好的编程习惯可以预防一部分的内存池泄露、越界等问题,但是,随着项目代码量的增加以及多人协作,完全避免几乎是不可能做到的。内存泄露和数组越界很容易引入,而难以定位,尤其是代码量庞大、多线程的环境中更难以定位。一般,使用mtrace、valgrind定位内存泄露。而对于越界,则更难以处理,例如下述的代码:程序编译时并不能发现,且在程序运行时并不一定会发生,只有在外部输入超过10个字符的时候才会发生越界。对于LTE协议栈,由于接入层的时序要求,它的调度周期是1毫秒,即在每1个毫秒内,必须完成接入设备的调度、资源的分配、编码等等,所以,LTE协议栈的时序要求十分严格,即使在嵌入式环境下mtrace、valgrind可以移植使用,在跑LTE协议栈时使用不了,它会严重影响协议栈的运行性能,导致不能正常工作。在公开号为CN105988921A的中国专利公开文件中,提出了一种内存越界的检测方法及装置,其方法包括:获取分配给待检测程序的内存块的起始地址和内存管理头信息,内存管理头信息包括:内存块的容量以及释放标记;检测释放标记,若释放标记指示内存块已被释放,则判断待检测程序发生内存越界;若释放标记指示内存块未被释放,则获取待检测程序的第一偏向地址,第一偏向地址为距起始地址最远的偏向地址;根据内存块的容量和起始地址,检测第一偏向地址是否落在内存块的内存范围内;若第一偏向地址未落在内存块的内存范围内,则判断待检测程序发生内存越界。但该方案的越界定位准确率不高,例如,物理上连续的内存块1-4,假设在内存块1越界并修改内存块2-4的内容,该方案找出的可能是内存块4的越界。
技术实现思路
本专利技术所要解决的技术问题是:提出一种基于LTE协议栈的内存池问题定位方法及其系统,可快速定位出内存泄露位置和内存越界位置。为了解决上述技术问题,本专利技术采用的技术方案为:一种基于LTE协议栈的内存池问题定位方法,包括:在内存块的头部设置第一标记、分配标记、字符串指针和位置变量,在内存块的尾部设置第二标记,所述第一标记和第二标记为预设的参数值;若一内存块被分配,则将所述一内存块的分配标记设置为预设的对应已分配的第一字符,将所述一内存块的字符串指针设置为申请所述一内存块的函数名,将所述一内存块的位置变量设置为申请所述一内存块的代码所处的行数;当所述一内存块被释放后,将所述一内存块的分配标记设置为预设的对应未分配的第二字符;当所述一内存块重新放入内存池时,分别检测所述一内存块的第一标记和第二标记是否与预设的参数值一致;若所述一内存块的第一标记与其预设的参数值一致且第二标记与其预设的参数值不一致,则判定所述一内存块越界;根据所述一内存块的字符串指针记录的函数名以及位置变量记录的行数,定位内存越界的位置;若内存池的使用率超过预设的阈值,则获取分配标记为第二字符的内存块;根据所获取的内存块的字符串指针记录的函数名以及位置变量记录的行数,定位内存泄露位置。本专利技术还涉及一种基于LTE协议栈的内存池问题定位系统,包括:第一设置模块,用于在内存块的头部设置第一标记、分配标记、字符串指针和位置变量,在内存块的尾部设置第二标记,所述第一标记和第二标记为预设的参数值;第二设置模块,用于若一内存块被分配,则将所述一内存块的分配标记设置为预设的对应已分配的第一字符,将所述一内存块的字符串指针设置为申请所述一内存块的函数名,将所述一内存块的位置变量设置为申请所述一内存块的代码所处的行数;第三设置模块,用于当所述一内存块被释放后,将所述一内存块的分配标记设置为预设的对应未分配的第二字符;检测模块,用于当所述一内存块重新放入内存池时,分别检测所述一内存块的第一标记和第二标记是否与预设的参数值一致;判定模块,用于若所述一内存块的第一标记与其预设的参数值一致且第二标记与其预设的参数值不一致,则判定所述一内存块越界;第一定位模块,用于根据所述一内存块的字符串指针记录的函数名以及位置变量记录的行数,定位内存越界的位置;获取模块,用于若内存池的使用率超过预设的阈值,则获取分配标记为第二字符的内存块;第二定位模块,用于根据所获取的内存块的字符串指针记录的函数名以及位置变量记录的行数,定位内存泄露位置。本专利技术的有益效果在于:通过在内存块中加入记录该内存中分配状态的分配标记,以及记录申请该内存块的函数名和函数位置的字符串指针和位置变量,即可在内存泄露,即内存池中超过预设个数的内存块都处于分配状态时,快速地定位出内存泄露的位置;同时,在内存块的头尾分别加入第一标记和第二标记,可在内存块释放时,通过检测第一标记和第二标记来判断该内存块是否发生越界,定位到发生越界的内存块,再根据该内存块所记录的函数名和函数位置,定位到内存越界的具体位置;本专利技术可在满足LTE严格时序要求,不影响协议栈正常工作的情况下(每毫秒增加耗时1微妙以内,即影响在千分之1以内)解决内存池的内存泄露及内存越界问题。附图说明图1为现有技术的内存池结构示意图;图2为现有技术的内存块被分配后的示意图;图3为本专利技术一种基于LTE协议栈的内存池问题定位方法流程图;图4为本专利技术实施例一的内存池泄露的定位方法流程图;图5为本专利技术实施例一的步骤S106的方法流程图;图6为本专利技术实施例一的内存块越界的定位方法流程图;图7为本专利技术实施例一的步骤S206的方法流程图;图8为本专利技术实施例一的内存块结构示意图;图9为本专利技术实施例二的方法流程图;图10为本专利技术实施例二的内存池结构示意图;图11为本专利技术实施例二的内存块分配示意图;图12为本专利技术实施例二的内存块释放示意图;图13为本专利技术实施例三分配前后的内存块结构示意图;图14为本专利技术实施例三内存池情况示意图;图15为本专利技术实施例三内存块越界前后对比示意图;图16为一种基于LTE协议栈的内存池问题定位系统的结构示意图;图17为本专利技术实施例四的系统结构示意图。标号说明:1、第一设置模块;2、第二设置模块;3、第三设置模块;4、检测模块;5、判定模块;6、第一定位模块;7、获取模块;8、第二定位模块;9、定义模块;10、放入模块;11、连接模块;12、申请模块;13、分配模块;14、第一指向模块;15、本文档来自技高网
...
基于LTE协议栈的内存池问题定位方法及其系统

【技术保护点】
一种基于LTE协议栈的内存池问题定位方法,其特征在于,包括:在内存块的头部设置第一标记、分配标记、字符串指针和位置变量,在内存块的尾部设置第二标记,所述第一标记和第二标记为预设的参数值;若一内存块被分配,则将所述一内存块的分配标记设置为预设的对应已分配的第一字符,将所述一内存块的字符串指针设置为申请所述一内存块的函数名,将所述一内存块的位置变量设置为申请所述一内存块的代码所处的行数;当所述一内存块被释放后,将所述一内存块的分配标记设置为预设的对应未分配的第二字符;当所述一内存块重新放入内存池时,分别检测所述一内存块的第一标记和第二标记是否与预设的参数值一致;若所述一内存块的第一标记与其预设的参数值一致且第二标记与其预设的参数值不一致,则判定所述一内存块越界;根据所述一内存块的字符串指针记录的函数名以及位置变量记录的行数,定位内存越界的位置;若内存池的使用率超过预设的阈值,则获取分配标记为第二字符的内存块;根据所获取的内存块的字符串指针记录的函数名以及位置变量记录的行数,定位内存泄露位置。

【技术特征摘要】
1.一种基于LTE协议栈的内存池问题定位方法,其特征在于,包括:在内存块的头部设置第一标记、分配标记、字符串指针和位置变量,在内存块的尾部设置第二标记,所述第一标记和第二标记为预设的参数值;若一内存块被分配,则将所述一内存块的分配标记设置为预设的对应已分配的第一字符,将所述一内存块的字符串指针设置为申请所述一内存块的函数名,将所述一内存块的位置变量设置为申请所述一内存块的代码所处的行数;当所述一内存块被释放后,将所述一内存块的分配标记设置为预设的对应未分配的第二字符;当所述一内存块重新放入内存池时,分别检测所述一内存块的第一标记和第二标记是否与预设的参数值一致;若所述一内存块的第一标记与其预设的参数值一致且第二标记与其预设的参数值不一致,则判定所述一内存块越界;根据所述一内存块的字符串指针记录的函数名以及位置变量记录的行数,定位内存越界的位置;若内存池的使用率超过预设的阈值,则获取分配标记为第二字符的内存块;根据所获取的内存块的字符串指针记录的函数名以及位置变量记录的行数,定位内存泄露位置。2.根据权利要求1所述的基于LTE协议栈的内存池问题定位方法,其特征在于,所述“根据所述一内存块的字符串指针记录的函数名以及位置变量记录的行数,定位内存越界的位置”具体为:根据所述一内存块的字符串指针记录的函数名以及位置变量记录的行数,获取申请所述一内存块的第一代码位置;根据gdb或backtrace函数获取函数栈信息;根据所述函数栈信息,获取释放所述一内存块的第二代码位置;根据所述第一代码位置和第二代码位置,定位内存越界的位置。3.根据权利要求1所述的基于LTE协议栈的内存池问题定位方法,其特征在于,所述“根据所述获取的内存块的字符串指针记录的函数名以及位置变量记录的行数,定位内存泄露位置”具体为:获取分配标记为第二字符的内存块的字符串指针记录的函数名以及位置变量记录的行数;获取所述函数名和行数中出现次数最多的函数名和行数;根据所获取的函数名和行数,定位内存泄露位置。4.根据权利要求1所述的基于LTE协议栈的内存池问题定位方法,其特征在于,所述“在内存块的头部设置第一标记、分配标记、字符串指针和位置变量,在内存块的尾部设置第二标记,所述第一标记和第二标记为预设的参数值”之前,进一步包括:定义两组以上不同大小的内存块,其中,同一组内的各内存块的大小一致;将同一组的内存块按照预设的顺序放入同一内存池,并将所述内存池的链表头指针指向最后放入的内存块,将所述内存池的链表尾指针指向最先放入的内存块;将各内存池的链表头指针和链表尾指针通过数组进行连接;申请内存时,选择内存块大小与所申请的内存大小最接近的内存池;内存块分配时,将所述内存池中的第一个内存块作为被分配的内存块从链表中删除,将所述内存池中的第二个内存块的next指针指向空,将链表尾指针指向所述第二个内存块;将被分配的内存块的next指针指向链表头;内存块释放时,根据其所指向的链表头,确定对应的内存池;将被释放的内存块的next指针指向对应的内存池中的最后一个内存块,并将所述内存池的链表头指针指向所述内存块。5.一种基于LTE协议栈的内存池问题定位...

【专利技术属性】
技术研发人员:朱有文
申请(专利权)人:福建三元达网络技术有限公司
类型:发明
国别省市:福建,35

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

1