[0033] 需要说明的是,在不冲突的情况下,下述技术方案,技术特征之间可以相互组合。
[0034] 下面结合附图对本发明的具体实施方式作进一步的说明:
[0035] 本实施例可以实现在一般路由器上面,可以通过本发明中的技术方案,只要是linux平台都可以拿过来直接利用,适用性非常广泛,移植这套方案不需要做过多的改动,无需人为一直跟踪,只需要设置好值之后调用lib库的接口,就可以发出报警,提前预防内存泄露,避免造成后续工程量大了之后定位起来比较麻烦。
[0036] 本实施例首先生成了一个内存泄露检测的共享库,此共享库实现了如下功能:
[0037] 在共享库内实现一个管理链表和一个内存泄露链表,管理链表的每个节点都有一个记录的结构体(数据结构体),用于保存内存分配的基本信息。内存泄露链表用来管理所有出现内存泄露的管理信息,此链表设有上限,防止链表(内存泄露链表)过长耗尽内存。此链表的尾节点始终是最旧的记录,新的记录(管理信息)以前插的方式插入链表头。如果链表长度已达到上限,但有新记录要加入链表,则将链表最旧的节点(链表尾节点)移出链表,将新记录的内容复制到这个节点上,再重新插入链表头。
[0038] 本实施例对标准c库(C标准库)的内存分配和内存回收函数做了封装,详细说明如下:
[0039] 内存分配:内存在申请分配的用下面的数据结构记录起来:
[0040]
[0041]
[0042] 其中stack(堆栈)可以通过backtrace(追溯)这个系统函数进行获取以及进行保存,或者对一般的函数进行改动,只需要修改其中的三个地址函数就可以拿过来利用。
[0043] 内存释放:在内存释放时,首先遍历管理链表,寻找出对应的内存管理结构体(数据结构体),然后对buf的地址进行判断,并进行对比,如果发现地址是相同的,则释放管理结构体链表(管理链表),释放分配的内存;如果遍历没有发现对应的地址,说明出现了内存泄露现象,则向上层应用发出告警信号,出现了内存泄露。上层应用在如下进行介绍。
[0044] 实现一个读取内存分配的接口:当链接了共享库的进程收到外部的指定命令(消息,信号等),可以调用读取记录的接口,此接口遍历没有释放内存的链表,将链表中结构体(上述的结构体)输出到串口上。清理的接口类似,当进程(调用进程)收到指定命令(控制命令)后,统一删除释放链表(管理链表)节点,清理内存溢出链表(内存泄漏链表)。
[0045] 设置告警(报警)功能:在这个库(共享库)里面提供一个给上层应用调用的可以设置内存泄露最大阀值的接口,如果超过这个阀值就立马向上层应用报警,这个实现可以定义一个变量来计算内存泄露的大小,内存分配时叠加其大小,释放成功就在这个全局变量上进行递减,时时监控内存的使用情况。
[0046] 定位内存泄露堆栈所在位置:内存泄露的堆栈记录下来,通过gdb调试找到对应的堆栈对应的模块以及模块对应的.c文件以及对应的哪行,迅速的定位出来哪里出现了内存泄露问题。
[0047] 本发明一个较佳的实施例,记录堆栈的深度可以自己自行定义,方便更深入的超找,一旦出现内存泄露是可以指定一个阀值或者一旦出现这个现象,共享库提供的一个接口马上进行报告,这就相当于智能上报。
[0048] 本发明一个较佳的实施例,创建内存管理结构,结构中保存函数调用堆栈。当出现内存溢出时,开发人员只要调用相应接口打印出函数调用堆栈,通过gdb调试就可以找到是什么地方出现了内存泄露,而内存泄露肯定是出现在使用这块内存的时候。这样就可以快速的定位问题。
[0049] 本发明一个较佳的实施例,创建了内存链表(内存泄漏链表),所有出现内存泄露的内存管理结构都保存在这个链表上,能够对内存泄露进行记录和保存,此点改进尤其适合不能实时观察系统运行状态的嵌入式系统。
[0050] 本发明一个较佳的实施例,由于以上所有功能都是通过共享库的方式完成的,所以只要链接了共享库的进程在其各自的内存空间内都维护着本进程的内存泄露链表,这样可以针对某一个进程单独调试,而不需要打印出所有进程的内存溢出信息。另外使用共享库的另一个优点在于可以通过宏来打开和关闭所有进程的内存管理的打印信息,因为上述内存泄露管理打印信息都属于调试信息,往往只在开发版的过程当中以及内部测试才用得到,出厂的时候完全可以通过宏进行关闭。
[0051] 本发明一个较佳的实施例,分配内存的时候记录堆栈的地址,超过最大内存泄露阀值,就告警,之后就把没有释放内存的模块堆栈信息打印出来以及对应的库的名字打印出来,通过对应的库名字找到对应模块,之后再通过地址找到对应模块的第几行出现内存申请没有释放的地方在哪里,修正内存泄露的问题。
[0052] 通过说明和附图,给出了具体实施方式的特定结构的典型实施例,基于本发明精神,还可作其他的转换。尽管上述发明提出了现有的较佳实施例,然而,这些内容并不作为局限。
[0053] 对于本领域的技术人员而言,阅读上述说明后,各种变化和修正无疑将显而易见。因此,所附的权利要求书应看作是涵盖本发明的真实意图和范围的全部变化和修正。在权利要求书范围内任何和所有等价的范围与内容,都应认为仍属本发明的意图和范围内。