一种动态监测堆内存使用错误的内存监测装置及方法制造方法及图纸

技术编号:16152754 阅读:39 留言:0更新日期:2017-09-06 18:13
本发明专利技术公开了一种动态监测堆内存使用错误的内存监测装置及方法,其中内存监测装置包括内存申请接口及内存释放接口、构造函数接口、内存管理模块、析构函数接口、异常处理接口,方法则是基于该内存监测装置,通过导入运行内存中,从堆中申请内存,进行二次封装并记录管理,然后将封装后的内存地址返回给被监测软件;当被监测软件对该内存地址越界读写时,内存监测模块中止运行被监测软件并将错误信息输出;当被监测软件正常退出时,内存监测装置输出所有未释放内存的信息。本发明专利技术的一种动态监测堆内存使用错误的内存监测装置及方法与现有技术相比,执行效率高,对被监测软件的运行效率的影响很小;定位精准,对内存问题的覆盖面广。

【技术实现步骤摘要】
一种动态监测堆内存使用错误的内存监测装置及方法
本专利技术涉及计算机
,具体地说是一种动态监测堆内存使用错误的内存监测装置及方法。
技术介绍
软件的可靠性对于一个系统来说至关重要,而内存问题则是影响软件可靠性的重中之中,例如非法的内存访问可能会导致系统死机,也可能会导致不可预料的运行结果,而内存泄漏则会使系统可用内存越来越少,导致系统运行越来越慢甚至会死机。因此,追踪内存错误是一个软件开发人员必不可少的工作。常见的动态内存分析工具诸如valgrind等,由于功能过于庞大、依赖太多,导致这些工具本身就需要占用很多系统资源,再加上移植性的考虑,并不适合在一些资源紧张的嵌入式系统中使用。另外一些现有的动态内存工具,由于设计上的原因,总是存在这样那样的缺陷,例如无法覆盖所有的内存错误,或者效率低下从而影响原软件的运行速度。为了解决这一难题,本专利技术提出了种动态监测堆内存使用错误的内存监测装置及方法。
技术实现思路
本专利技术的技术任务是针对以上不足之处,提供一种动态监测堆内存使用错误的内存监测装置及方法。一种动态监测堆内存使用错误的内存监测装置,该内存监测装置导入运行在内存中,其结构包括,内存申请接口及内存释放接口,用于对系统默认的内存申请、释放接口进行拦截;构造函数接口,提供整个装置被载入内存后默认执行的构造函数,并监测构造函数参数的配置初始化;内存管理模块,用于对内存进行二次封装、管理记录;析构函数接口,提供进程退出时默认执行的析构函数,此接口内将所有已泄露内存的详细信息显示输出给用户;异常处理接口,提供异常处理函数,捕获到内存非法访问的异常,并将异常指令处的详细信息输出给用户。所述内存监测装置以动态库的形式存在,配合被监测软件一并导入运行内存中,内存监测装置将被监测软件的内存申请及释放接口截获,并从堆中申请一段内存,然后对这段内存进行封装处理,再返回给调用者,即被监测软件;当被监测软件对这段内存进行非法处理时,内存监测装置检测到并及时告知用户;当被监测软件退出时,内存监测装置打印输出所有已泄露内存的信息,帮助用户进行问题定位。所述构造函数接口提供被调用的构造函数后,进行初始化工作,其过程为:解析动态符号表,获取系统原有的内存申请及释放接口指针,并当作本装置内的私有内存接口;解析系统环境变量,获取函数栈帧深度及内存管理区的保护级别,该系统环境变量在运行本内存监测装置及被监测软件之前设置,设置的内容包括需要记录的内存对应的函数栈帧深度及保护级别,保护级别分为不可读写、只读、可读写三种级别;初始化全局双向链表,用于将来记录内存地址。一种动态监测堆内存使用错误的方法,其实现过程为:一、首先将内存监测装置导入运行内存中,截获被监测软件的内存申请函数及内存释放函数的调用;二、内存监测装置从堆中申请内存,进行二次封装并记录管理,然后将封装后的内存地址返回给被监测软件;三、当被监测软件对该内存地址进行越界读写时,内存监测模块立刻让被监测软件中止运行并将错误信息输出给软件调试人员;当被监测软件正常退出时,内存监测装置自动将所有尚未释放的内存的详细信息显示输出给软件调试人员。运行被监测软件时,将内存监测装置动态插入被监测软件的运行地址空间;内存监测装置通过动态符号表的重定位功能,拦截所有申请内存及释放内存相关的系统接口,将本监测装置内的内存分配及释放接口替换掉被监测软件的原内存申请及释放接口地址。步骤二中,当被监测软件运行至内存进行分配调用时,内存监测装置截获该调用,得到申请内存的大小,然后通过本内存监测装置内部私有的内存申请接口,从堆内存中申请一段可容纳前置管理区、用户申请内存大小及后置管理区的内存,即这块内存分成三段:前置管理区、即将返回给被监测软件的用户内存区、后置管理区,其中前置管理区、后置管理区均包括不可读写、只读、可读写三种保护级别;前置管理区及后置管理区用于对内存区用户内存区进行二次封装,其中前置管理区位于用户内存区的起始地址的左侧,后置管理区位于用户内存区的结束地址的右侧;所述内存监测装置将申请该内存的函数的堆栈信息、用户内存区大小、魔数字存入前置管理区,然后将用户内存区的首地址插入一个全局的双向链表,在前置管理区中记录用户内存区在双向链表中的节点指针;最后将魔数字存储在后置管理区;内存监测装置将前置管理区及后置管理区设置为不可读写的权限;最后内存监测装置将内存地址用户内存区返回给被监测软件。步骤二中,前置管理区、后置管理区存储信息的具体过程为:将从堆中申请的这段内存的起始地址填入前置管理区的相应位置;将固定的魔数字填入前置管理区和后置管理区的相应位置;根据函数栈帧深度,申请一段内存,获取当前函数栈的相关信息,然后将这段内存的起始地址填入前置管理区的相应位置;把即将返回给被监测软件的内存地址,加入全局的双向链表中,并将对应的链表节点指针存入前置管理区的相应位置;设置前置管理区及后置管理区的内存访问权限;将用户内存区的起始地址返回给被监测软件。步骤三中,当内存监测装置拦截到释放内存的系统接口调用时,根据传入的内存地址,即用户内存区存储内容,得到相应的前置内存管理区地址,将前后管理区的内存访问权限改成可读写,然后从前置内存管理区地址中查找到记录用户内存区的双向链表的节点指针,再将用户内存区从双向链表中删除,最后释放该内存;当被监测软件对用户内存区的访问发生越界时,触发系统信号,使得被监测软件中止运行,内存监测装置捕获到中止运行的信号,然后将当前的函数调用栈信息显示输出给软件调试人员;当进程正常退出时,内存监测装置在析构函数中,将全局双向链表中的所有未释放内存的详细信息显示出来,软件调试人员便可以得知哪些地方发生了内存泄漏。当被监测软件调用内存释放接口时,内存监测装置将截获其接口调用,得到被释放内存的起始地址,并对该内存地址做如下判断及操作:step1,将该内存地址对应的前置管理区、后置管理区的内存访问权限修改为可读写模式;step2,判断前置及后置管理区内的魔数字是否与默认的值一致,如果不一致,说明被监测软件传入的这段内存不是一个合法申请的内存地址,输出错误信息给软件调试人员;如果一致,则执行step3;step3,判断前置管理区的链表节点指针是否为空,如果为空,说明这段内存已经被释放过了,被监测软件执行了错误的二次释放,输出错误信息给软件调试人员;如果不为空,则根据链表节点指针快速定位到双向链表中的节点,并将该节点从双向链表中删除,然后将前置管理区的链表节点指针置为空;step4,得到前置管理区的起始地址,然后调用内存监测装置内的私有接口来释放这段内存。当被监测软件对已申请的内存地址发生访问越界时,触发系统异常,进入内存监测装置内的异常处理函数,异常处理函数根据包括异常地址、栈顶地址的寄存器值,解析并输出显示当前的函数栈详细信息给软件调试人员,该详细信息包括文件名称、函数名称、调用行数;当被监测软件正常退出时,内存监测装置的析构函数被调用,析构函数内部,遍历全局双向链表的所有节点,显示每个内存的详细信息,包括内存地址、内存大小;根据前置管理区内的起始地址中的每一个返回地址,在动态符号表中解析出对应的文件名、函数名、所在行数。本专利技术的一种动态监测堆内存使用错误的内存监测装置及方法和现有技术相比,具有以下有本文档来自技高网...
一种动态监测堆内存使用错误的内存监测装置及方法

【技术保护点】
一种动态监测堆内存使用错误的内存监测装置,其特征在于,该内存监测装置导入运行在内存中,其结构包括,内存申请接口及内存释放接口,用于对系统默认的内存申请、释放接口进行拦截;构造函数接口,提供整个装置被载入内存后默认执行的构造函数,并监测构造函数参数的配置初始化;内存管理模块,用于对内存进行二次封装、管理记录;析构函数接口,提供进程退出时默认执行的析构函数,此接口内将所有已泄露内存的详细信息显示输出给用户;异常处理接口,提供异常处理函数,捕获到内存非法访问的异常,并将异常指令处的详细信息输出给用户。

【技术特征摘要】
1.一种动态监测堆内存使用错误的内存监测装置,其特征在于,该内存监测装置导入运行在内存中,其结构包括,内存申请接口及内存释放接口,用于对系统默认的内存申请、释放接口进行拦截;构造函数接口,提供整个装置被载入内存后默认执行的构造函数,并监测构造函数参数的配置初始化;内存管理模块,用于对内存进行二次封装、管理记录;析构函数接口,提供进程退出时默认执行的析构函数,此接口内将所有已泄露内存的详细信息显示输出给用户;异常处理接口,提供异常处理函数,捕获到内存非法访问的异常,并将异常指令处的详细信息输出给用户。2.根据权利要求1所述的动态监测堆内存使用错误的内存监测装置,其特征在于,所述内存监测装置以动态库的形式存在,配合被监测软件一并导入运行内存中,内存监测装置将被监测软件的内存申请及释放接口截获,并从堆中申请一段内存,然后对这段内存进行封装处理,再返回给调用者,即被监测软件;当被监测软件对这段内存进行非法处理时,内存监测装置检测到并及时告知用户;当被监测软件退出时,内存监测装置打印输出所有已泄露内存的信息,帮助用户进行问题定位。3.根据权利要求1或2所述的动态监测堆内存使用错误的内存监测装置,其特征在于,所述构造函数接口提供被调用的构造函数后,进行初始化工作,其过程为:解析动态符号表,获取系统原有的内存申请及释放接口指针,并当作本装置内的私有内存接口;解析系统环境变量,获取函数栈帧深度及内存管理区的保护级别,该系统环境变量在运行本内存监测装置及被监测软件之前设置,设置的内容包括需要记录的内存对应的函数栈帧深度及保护级别,保护级别分为不可读写、只读、可读写三种级别;初始化全局双向链表,用于将来记录内存地址。4.一种动态监测堆内存使用错误的方法,其特征在于,其实现过程为:一、首先将内存监测装置导入运行内存中,截获被监测软件的内存申请函数及内存释放函数的调用;二、内存监测装置从堆中申请内存,进行二次封装并记录管理,然后将封装后的内存地址返回给被监测软件;三、当被监测软件对该内存地址进行越界读写时,内存监测模块立刻让被监测软件中止运行并将错误信息输出给软件调试人员;当被监测软件正常退出时,内存监测装置自动将所有尚未释放的内存的详细信息显示输出给软件调试人员。5.根据权利要求4所述的一种动态监测堆内存使用错误的方法,其特征在于,运行被监测软件时,将内存监测装置动态插入被监测软件的运行地址空间;内存监测装置通过动态符号表的重定位功能,拦截所有申请内存及释放内存相关的系统接口,将本监测装置内的内存分配及释放接口替换掉被监测软件的原内存申请及释放接口地址。6.根据权利要求4或5所述的一种动态监测堆内存使用错误的方法,其特征在于,步骤二中,当被监测软件运行至内存进行分配调用时,内存监测装置截获该调用,得到申请内存的大小,然后通过本内存监测装置内部私有的内存申请接口,从堆内存中申请一段可容纳前置管理区、用户申请内存大小及后置管理区的内存,即这块内存分成三段:前置管理区、即将返回给被监测软件的用户内存区、后置管理区,其中前置管理区、后置管理区均包括不可读写、只读、可读写三种保护级别;前置管理区及后置管理区用于对内存区用户内存区进行二次封装,其中前置管理区位于用户内存区的起始地址的左侧,后置管理区位于用户内存区的结束地址的右侧;所述内存监测装置将申请该内存的函数的堆栈信息、用户内存区大小、魔数字...

【专利技术属性】
技术研发人员:赵鲁波
申请(专利权)人:山东浪潮商用系统有限公司
类型:发明
国别省市:山东,37

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

1