一种内存操作记录的处理方法及装置制造方法及图纸

技术编号:8105659 阅读:226 留言:0更新日期:2012-12-21 04:18
本申请提供了一种内存操作记录的处理方法及装置,所述方法包括:工作线程模块将内存操作记录写入预先设置的内存操作记录池中;所述内存操作记录包括:当前内存分配记录和/或内存释放记录;内存操作记录读取线程模块从所述内存操作记录池中读取内存操作记录,并判断所述内存操作记录是否为内存分配记录,如果是,则将所述内存分配记录插入至所述内存操作记录映射表中,如果否,则从所述内存操作记录映射表中删除该条内存释放记录的内存地址指示的映射关系。本申请实施例通过预先分配内存操作记录池,可以解决内存操作记录的完整性较低以及被测程序性能降低导致的系统资源开销较大的问题。

【技术实现步骤摘要】

本申请涉及计算机
,特别涉及一种内存操作记录的处理方法及装置
技术介绍
在软件开发过程中常常产生一些内存泄漏现象,例如,在程序运行中向操作系统申请了一块内存,但在使用完成后没有释放,导致这块内存既不在操作系统的空闲内存池中,也不在当前程序的使用中,这样就会使得可用内存变少,而开发出的软件在使用中也往往导致过高的内存占用和性能下降。 为了检测内存泄漏现象,就需要跟踪程序中所有的内存分配,现有技术中有一种检测内存泄露的方法,具体为开发一个动态链接库(DLL),注入到待检测的程序进程中,拦截(hook)所有的内存分配和内存释放函数,使之对原始内存分配或释放的调用可以被DLL截获,进而可以在分配内存时,记录下本次分配的内存地址、大小或调用堆栈等信息,并保存在一个合适的容器中;并当内存释放时,根据被释放的内存地址从容器中删除相应的记录。这样就可以在需要检查内存是否有泄漏时,查看留在容器中的内存记录即可。但是在检测内存泄漏过程中,“保存内存分配的信息到一个容器中”这个操作往往引起新的内存分配,因为保存一条记录到一个容器中往往需要为这条记录分配一块新的内存。而新的内存分配也会被截获并被记录在容器中,于是又会导致另一次内存分配,以此类推,将会产生无限递归调用的现象,使程序堆栈溢出而崩溃。而为了解决无限递归调用的问题,现有技术在注入DLL对内存分配和释放函数进行拦截时,采用导入地址表(IAT)的方式进行拦截(Hook),并排除本DLL,使之在本DLL中调用内存分配和释放函数时始终会调用到原始的函数。由于本DLL未被拦截(hook),因此,在往容器中记录内存操作记录时,分配这条记录的内存是调用的原始内存分配函数,这样就不会引起递归调用。但是在Windows+VC平台由于内存分配的复杂性,通常还需要使VC的几个动态链接库不被拦截才能正常工作。并且由于采用排除法来避免内存分配的递归调用,就会导致一些DLL未被拦截(hook),这样记录的内存操作记录就不完整,无法获得全部内存操作记录。进一步的,由于拦截内存分配和内存释放时直接进行内存操作记录的插入或移除等操作,影响了被检测程序的性能,也使得系统资源的开销较大。并且,程序性能的下降,还可能会导致某些与当前运行程序的性能有关系的内存泄漏现象在低速运行时不会产生,从而不能及时被发现。总之,目前需要本领域技术人员迫切解决的一个技术问题就是如何能够创新的提出一种内存操作记录的处理方法,以解决现有技术中内存操作记录的完整性较低以及被测程序性能降低而导致的系统资源开销较大的问题。
技术实现思路
本申请所要解决的技术问题是提供一种内存操作记录的处理方法,用以解决现有技术中内存操作记录的完整性较低以及被测程序性能降低而导致的系统资源开销较大的问题。本申请还提供了一种内存操作记录的处理装置,用以保证上述方法在实际中的实现及应用。为了解决上述问题,本申请公开了一种内存操作记录的处理方法,所述方法应用于内存操作记录的处理装置,所述处理装置包括内存操作记录池、内存操作记录读取线程模块、内存操作记录映射表和多个工作线程模块,所述内存操作记录池用于存储内存分配记录,所述内存操作记录映射表用于保存内存操作记录与其涉及的内存地址之间的映射关系;该方法包括所述工作线程模块将内存操作记录写入预先设置的内存操作记录池中;所述内存操作记录包括当前内存分配记录和/或内存释放记录; 所述内存操作记录读取线程模块从所述内存操作记录池中读取内存操作记录,并判断所述内存操作记录是否为内存分配记录,如果是,则将所述内存分配记录插入至所述内存操作记录映射表中,如果否,则从所述内存操作记录映射表中删除该条内存释放记录的内存地址指不的映射关系。本申请公开了一种内存操作记录的处理装置,该装置包括内存操作记录池、内存操作记录读取线程模块、内存操作记录映射表和多个工作线程模块;其中,所述内存操作记录池,用于存储内存分配记录;所述内存操作记录映射表,用于保存内存操作记录与其中的内存地址之间的映射关系;所述工作线程模块,用于将内存操作记录写入预先设置的内存操作记录池中;所述内存操作记录包括内存分配记录和/或内存释放记录;所述内存操作记录读取线程模块包括读取子模块和第一判断子模块;所述读取子模块,用于从所述内存操作记录池中读取内存操作记录;所述第一判断子模块,用于判断所述内存操作记录是否为内存分配记录,如果是,则将所述内存分配记录插入至所述内存操作记录映射表中,如果否,则从所述内存操作记录映射表中删除该条内存释放记录的内存地址指示的映射关系。与现有技术相比,本申请包括以下优点在本申请中,通过预先分配缓存区作为内存操作记录池,从而在对内存操作记录池进行操作时,不会引起无限递归,因此不会影响被测程序的性能,并且,因为内存操作记录都会在该内存操作记录池中存储,所以可以解决现有技术中内存操作记录的完整性较低的问题,节约了系统资源开销。进一步的,还能进行准确性较高的内存泄露检测。当然,实施本申请的任一产品并不一定需要同时达到以上所述的所有优点。附图说明为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。图I是本申请实施例在实际应用中的一个结构框图;图2是本申请的一种内存操作记录的处理方法实施例I的流程图;图3是本申请的方法实施例I中步骤201的流程图;图4是本申请的方法实施例I中步骤202的流程图;图5是本申请的一种内存操作记录的处理方法实施例2的流程图;图6是本申请的一种内存操作记录的处理装置实施例I的结构框图; 图7是本申请的装置实施例I中工作线程模块604的结构框图;图8是本申请的装置实施例I中读取子模块6021的结构框图;图9是本申请的一种内存操作记录的处理装置实施例2的结构框图。具体实施例方式下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本申请保护的范围。本申请可用于众多通用或专用的计算装置环境或配置中。例如个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器装置、包括以上任何装置或设备的分布式计算环境等等。本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。本申请的主要思想之一可以包括,通过预先分配缓存区作为内存操作记录池,并相应的采用专门的一个内存操作记录读取线程从所述内存操作记录池中读取记录,从而在对内存操作记录池进行操作时,不会引起无限递归,因此不会影响被测程序的性能,并且,因为内存操作记录都会在该内存操作记录池中存储,所以可以解决现有技术中内存操作记本文档来自技高网
...

【技术保护点】
一种内存操作记录的处理方法,其特征在于,所述方法应用于内存操作记录的处理装置,所述处理装置包括:内存操作记录池、内存操作记录读取线程模块、内存操作记录映射表和多个工作线程模块,所述内存操作记录池用于存储内存分配记录,所述内存操作记录映射表用于保存内存操作记录与其涉及的内存地址之间的映射关系;该方法包括:所述工作线程模块将内存操作记录写入预先设置的内存操作记录池中;所述内存操作记录包括:当前内存分配记录和/或内存释放记录;所述内存操作记录读取线程模块从所述内存操作记录池中读取内存操作记录,并判断所述内存操作记录是否为内存分配记录,如果是,则将所述内存分配记录插入至所述内存操作记录映射表中,如果否,则从所述内存操作记录映射表中删除该条内存释放记录的内存地址指示的映射关系。

【技术特征摘要】

【专利技术属性】
技术研发人员:唐红兵邵有石
申请(专利权)人:阿里巴巴集团控股有限公司
类型:发明
国别省市:

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

1