CN102831068B - 一种内存操作记录的处理方法及装置 - Google Patents
一种内存操作记录的处理方法及装置 Download PDFInfo
- Publication number
- CN102831068B CN102831068B CN201110157154.8A CN201110157154A CN102831068B CN 102831068 B CN102831068 B CN 102831068B CN 201110157154 A CN201110157154 A CN 201110157154A CN 102831068 B CN102831068 B CN 102831068B
- Authority
- CN
- China
- Prior art keywords
- internal memory
- memory operation
- operation record
- record
- write
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Abstract
本申请提供了一种内存操作记录的处理方法及装置,所述方法包括:工作线程模块将内存操作记录写入预先设置的内存操作记录池中;所述内存操作记录包括:当前内存分配记录和/或内存释放记录;内存操作记录读取线程模块从所述内存操作记录池中读取内存操作记录,并判断所述内存操作记录是否为内存分配记录,如果是,则将所述内存分配记录插入至所述内存操作记录映射表中,如果否,则从所述内存操作记录映射表中删除该条内存释放记录的内存地址指示的映射关系。本申请实施例通过预先分配内存操作记录池,可以解决内存操作记录的完整性较低以及被测程序性能降低导致的系统资源开销较大的问题。
Description
技术领域
本申请涉及计算机技术领域,特别涉及一种内存操作记录的处理方法及装置。
背景技术
在软件开发过程中常常产生一些内存泄漏现象,例如,在程序运行中向操作系统申请了一块内存,但在使用完成后没有释放,导致这块内存既不在操作系统的空闲内存池中,也不在当前程序的使用中,这样就会使得可用内存变少,而开发出的软件在使用中也往往导致过高的内存占用和性能下降。
为了检测内存泄漏现象,就需要跟踪程序中所有的内存分配,现有技术中有一种检测内存泄露的方法,具体为:开发一个动态链接库(DLL),注入到待检测的程序进程中,拦截(hook)所有的内存分配和内存释放函数,使之对原始内存分配或释放的调用可以被DLL截获,进而可以在分配内存时,记录下本次分配的内存地址、大小或调用堆栈等信息,并保存在一个合适的容器中;并当内存释放时,根据被释放的内存地址从容器中删除相应的记录。这样就可以在需要检查内存是否有泄漏时,查看留在容器中的内存记录即可。
但是在检测内存泄漏过程中,“保存内存分配的信息到一个容器中”这个操作往往引起新的内存分配,因为保存一条记录到一个容器中往往需要为这条记录分配一块新的内存。而新的内存分配也会被截获并被记录在容器中,于是又会导致另一次内存分配,以此类推,将会产生无限递归调用的现象,使程序堆栈溢出而崩溃。
而为了解决无限递归调用的问题,现有技术在注入DLL对内存分配和释放函数进行拦截时,采用导入地址表(IAT)的方式进行拦截(Hook),并排除本DLL,使之在本DLL中调用内存分配和释放函数时始终会调用到原始的函数。由于本DLL未被拦截(hook),因此,在往容器中记录内存操作记录时,分配这条记录的内存是调用的原始内存分配函数,这样就不会引起递归调用。
但是在Windows+VC平台由于内存分配的复杂性,通常还需要使VC的几个动态链接库不被拦截才能正常工作。并且由于采用排除法来避免内存分配的递归调用,就会导致一些DLL未被拦截(hook),这样记录的内存操作记录就不完整,无法获得全部内存操作记录。进一步的,由于拦截内存分配和内存释放时直接进行内存操作记录的插入或移除等操作,影响了被检测程序的性能,也使得系统资源的开销较大。并且,程序性能的下降,还可能会导致某些与当前运行程序的性能有关系的内存泄漏现象在低速运行时不会产生,从而不能及时被发现。
总之,目前需要本领域技术人员迫切解决的一个技术问题就是:如何能够创新的提出一种内存操作记录的处理方法,以解决现有技术中内存操作记录的完整性较低以及被测程序性能降低而导致的系统资源开销较大的问题。
发明内容
本申请所要解决的技术问题是提供一种内存操作记录的处理方法,用以解决现有技术中内存操作记录的完整性较低以及被测程序性能降低而导致的系统资源开销较大的问题。
本申请还提供了一种内存操作记录的处理装置,用以保证上述方法在实际中的实现及应用。
为了解决上述问题,本申请公开了一种内存操作记录的处理方法,所述方法应用于内存操作记录的处理装置,所述处理装置包括:内存操作记录池、内存操作记录读取线程模块、内存操作记录映射表和多个工作线程模块,所述内存操作记录池用于存储内存分配记录,所述内存操作记录映射表用于保存内存操作记录与其涉及的内存地址之间的映射关系;该方法包括:
所述工作线程模块将内存操作记录写入预先设置的内存操作记录池中;所述内存操作记录包括:当前内存分配记录和/或内存释放记录;
所述内存操作记录读取线程模块从所述内存操作记录池中读取内存操作记录,并判断所述内存操作记录是否为内存分配记录,如果是,则将所述内存分配记录插入至所述内存操作记录映射表中,如果否,则从所述内存操作记录映射表中删除该条内存释放记录的内存地址指示的映射关系。
本申请公开了一种内存操作记录的处理装置,该装置包括:内存操作记录池、内存操作记录读取线程模块、内存操作记录映射表和多个工作线程模块;其中,
所述内存操作记录池,用于存储内存分配记录;
所述内存操作记录映射表,用于保存内存操作记录与其中的内存地址之间的映射关系;
所述工作线程模块,用于将内存操作记录写入预先设置的内存操作记录池中;所述内存操作记录包括:内存分配记录和/或内存释放记录;
所述内存操作记录读取线程模块包括读取子模块和第一判断子模块;
所述读取子模块,用于从所述内存操作记录池中读取内存操作记录;
所述第一判断子模块,用于判断所述内存操作记录是否为内存分配记录,如果是,则将所述内存分配记录插入至所述内存操作记录映射表中,如果否,则从所述内存操作记录映射表中删除该条内存释放记录的内存地址指示的映射关系。
与现有技术相比,本申请包括以下优点:
在本申请中,通过预先分配缓存区作为内存操作记录池,从而在对内存操作记录池进行操作时,不会引起无限递归,因此不会影响被测程序的性能,并且,因为内存操作记录都会在该内存操作记录池中存储,所以可以解决现有技术中内存操作记录的完整性较低的问题,节约了系统资源开销。进一步的,还能进行准确性较高的内存泄露检测。当然,实施本申请的任一产品并不一定需要同时达到以上所述的所有优点。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例在实际应用中的一个结构框图;
图2是本申请的一种内存操作记录的处理方法实施例1的流程图;
图3是本申请的方法实施例1中步骤201的流程图;
图4是本申请的方法实施例1中步骤202的流程图;
图5是本申请的一种内存操作记录的处理方法实施例2的流程图;
图6是本申请的一种内存操作记录的处理装置实施例1的结构框图;
图7是本申请的装置实施例1中工作线程模块604的结构框图;
图8是本申请的装置实施例1中读取子模块6021的结构框图;
图9是本申请的一种内存操作记录的处理装置实施例2的结构框图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本申请保护的范围。
本申请可用于众多通用或专用的计算装置环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器装置、包括以上任何装置或设备的分布式计算环境等等。
本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本申请的主要思想之一可以包括,通过预先分配缓存区作为内存操作记录池,并相应的采用专门的一个内存操作记录读取线程从所述内存操作记录池中读取记录,从而在对内存操作记录池进行操作时,不会引起无限递归,因此不会影响被测程序的性能,并且,因为内存操作记录都会在该内存操作记录池中存储,所以可以解决现有技术中内存操作记录的完整性较低的问题,节约了系统资源开销。进一步的,还能准确性较高的进行内存泄露检测。
为了方便本领域技术人员对于本申请实施例的理解,参考图1,其示出了本申请实施例在实际应用中的一个结构框图。在图1中,被检测程序的工作线程即是可以检测其是否存在内存泄露的n个工作线程,工作内存操作记录池用于内存操作记录,包括内存分配记录和内存释放记录;内存操作记录映射表和多个工作线程模块,所述内存操作记录映射表用于保存内存操作记录与其涉及的内存地址之间的映射关系;内存操作记录读取线程是对内存操作记录池和内存操作记录映射表进行操作的线程。
具体的,工作线程(WorkThread)是被检测程序的线程,由于内存分配和内存释放的相关函数已被拦截(hook),因此,这些工作线程中任何内存分配和内存释放都能被拦截下来,进而被存入内存操作记录池(MemoryRecordPool)中,并等待内存操作记录读取线程(MemoryRecordReadThread)的处理。
内存操作记录池(MemoryRecordPool)可以是一个固定大小的循环队列,可在程序初始化时,通过预先分配的一个固定大小的静态字节数组来实现。内存操作记录池的大小可以根据经验值设置,例如设置5M字节以上的空间。内存分配记录和内存释放记录将被工作线程写入内存操作记录池中。因为内存操作记录池是预先分配好的一块内存空间,所以在将内存操作记录写入其中时,不需要再分配新的内存。由于在写入的过程中,没有新的内存分配产生,因此不会引起递归调用堆栈溢出的问题。
内存操作记录映射表(MemoryRecordMap)是一个以内存地址为键(key)、内存分配记录(MemoryAllocRecord)为值(value)的普通映射表(map)。内存分配记录可以被内存操作记录读取线程(MemoryRecordReadThread)插入到内存操作记录映射表中。如果内存操作记录读取线程读取到内存释放记录,则该内存释放记录中内存地址所对应的内存分配记录被内存操作记录读取线程(MemoryRecordReadThread)从内存操作记录映射表中删除。因此可以看出,在内存操作记录映射表中,保存的一直是内存分配记录及其与内存地址的映射关系。
内存操作记录读取线程(MemoryRecordReadThread)可以从内存操作记录池(MemoryRecordPool)中读取每一条内存分配记录或内存释放记录,如果是内存分配操作,则存入内存操作记录映射表(MemoryRecordMap)中;如果是内存释放的操作,则根据内存释放记录释放的内存地址从内存操作记录映射表(MemoryRecordMap)中删除所属的映射关系。
参考图2,示出了本申请提出的一种内存操作记录的处理方法实施例1的流程图,该方法应用于内存操作记录的处理装置,所述处理装置可以包括:内存操作记录池、内存操作记录读取线程模块、内存操作记录映射表和多个工作线程模块,所述内存操作记录池用于存储内存分配记录,所述内存操作记录映射表用于保存内存操作记录与其涉及的内存地址之间的映射关系;可以包括以下步骤:
步骤201:所述工作线程模块将内存操作记录写入预先设置的内存操作记录池中;所述内存操作记录包括:当前内存分配记录和/或内存释放记录。
本申请实施例中的内存操作记录池在预先分配时可以在堆中分配,也可以在静态存储区中分配。进程中的各个工作线程在进行内存分配和内存释放时,把本次内存操作的信息组装成一条内存操作记录写入内存操作记录池中。
内存操作记录池中保存的每条内存操作记录由三部分组成:写入完成标志位(FinishFlag)、记录头(RecordHeader)和记录体(RecordBody)。其中:
写入完成标志位:其可以只占用1字节(Byte),用来表明本条内操作记录是否写入完成。该写入完成标志位可以解决内存操作记录读取线程与工作线程在处理同一条内存操作记录时的同步问题,在一条内存操作记录的写入完成时该标志位的值为有效,例如可以采用1表示,而为0时则表示该条内存操作记录还未写入完成。
记录头:其可以表明本条内存操作记录的类型(分配或释放)和本条内存操作记录的记录体的长度。在表示内存操作类型的时候,可以采用“TRUE”来表示某条内存操作记录为内存分配记录,同时采用“FALSE”来表示某条内存操作记录为内存释放记录。记录头在表示记录体(RecordBody)的长度时可以以字节为单位。
记录体:其用于保存本条内存操作记录的主体信息。对于内存分配记录来说,需要保存的主题信息较多。因为每次进行内存分配的一块内存都有一个地址值,分配的内存是从这个地址值开始的,因此记录体需要保存内存地址。此外,还可保存内存分配的长度、分配函数和分配调用时的堆栈帧信息等。其中,分配的长度用于表示当前分配的内存块有多大,以字节为单位;分配函数用于表示由哪个内存分配函数分配的,例如new、malloc、calloc或GrobalAlloc等等;分配调用时的堆栈信息用于表示内存分配时程序是从怎样的调用路径进来的。但对于内存释放记录来讲其记录体则极为简单,可仅仅保存内存地址即可。
为了节省内存操作记录池的空间,记录体可以是变长的,如果记录头中的“Allocate”位表明本条记录是内存分配记录,则记录体是一个MemoryAllocRecord结构,用来保存更多的内存信息;否则,记录体只是一个4字节长度的内存地址值。
需要说明的是,所述步骤201在实际中可以通过调用一个函数“AppendRecord”来实现,AppendRecord函数可以由工作线程在内存分配和内存释放时调用。
参考图3所示,所述将内存操作记录写入预先设置的内存操作记录池中的步骤,即是调用AppendRecord函数之后的执行步骤,具体可以包括:
步骤301:当前工作线程计算当前内存操作记录的待写入总长度;
本步骤即是计算本内存操作记录写入内存操作记录池中需要占用多大的空间。
步骤302:当前工作线程获取所述内存操作记录池的当前写入位置和当前已写入总长度;
当前线程再获取内存操作记录池的当前写入位置和当前已写入总长度(CurrentWriteParam)。具体实现时,可以先将当前写入位置和当前已写入总长度保存到StartPos。“StartPos”是一个在“AllocPoolWriteParam”联合体,可以表示在本内存操作记录写入之前内存操作记录池的起始空闲位置,以及内存操作记录池已被使用的空间大小。
步骤303:判断所述已写入总长度和待写入总长度之和是否大于所述内存操作记录池的总长度,如果是,则进入步骤304;如果否,则进入步骤305。
本步骤即是检查内存操作记录池的剩余空间是否能容纳本条待写入的内存操作记录。
步骤304:将该内存操作记录放入等待队列,以便于在所述内存操作记录池在可写入时,接收所述内存记录读取线程的通知以继续本次写入操作;
如果内存操作记录池的剩余空间不够容纳本条内存操作记录,则将该内存操作记录放入等待队列,并在所述内存操作记录池可写入时,接收所述内存记录读取线程的通知以继续本次写入操作。具体实现时,可以调用ApendRecord的工作线程实现挂起,等待内存操作记录池可用时内核对象hEventPoolWritable的通知。这里使用的内核对象相当于一个事件、消息、信号或标志。“hEventPoolWritable”一旦有信号就表示内存操作内存池有空闲空间了,可以继续写入新的内存操作记录。其中,当前剩余空间可以通过内存操作记录池的总大小与已被使用的空间大小的差来表示。
步骤305:根据所述待写入总长度、当前已写入总长度和所述当前写入位置计算下一次写入位置和下一次已写入总长度。
在本步骤中先计算写入本内存操作记录后,内存操作记录池的新的写入位置和新的已写入总长度,具体实现时,也可以保存到NewPos中。其中,“NewPos”也是一个AllocPoolWriteParam联合体,表示在本内存操作记录写入内存操作记录池之后,内存操作内存池的当前空闲位置和已被使用的空间大小。
步骤306:在所述当前写入位置写入所述内存操作记录,并将所述下一次写入位置和下一次已写入总长度作为下一次写入时的当前写入位置和当前已写入总长度。
此时,需要根据更新内存操作记录池的当前写入位置和写入总长度(CurrentWriteParam)为新的值NewPos,即是将下一次写入位置和下一次已写入总长度作为下一次写入时的当前写入位置和当前已写入总长度。在本步骤中,为了避免在一条工作线程对一条记录进行操作的时候,其他工作线程也会对该条记录进行操作,所以为了使工作线程能安全地访问,这里必须使用某种线程的同步手段来进行。例如,在VC环境下,为了避免死锁的问题,以及出于性能问题的考虑,可以使用Windows平台的互锁函数“InterlockedCompareExchange64”来进行。该互锁函数在一个原子操作中可以同时修改写入位置和已写入总长度,保证了内存操作记录写入的正确性。
其中,所述步骤306中在所述当前写入位置写入所述内存操作记录的步骤,具体实现可以是:分别写入所述内存操作记录的记录头和记录体,并在写入完成时将写入完成标志位设置为有效;其中,在所述写入过程中如果到达所述内存操作记录池的结束位,就转向所述内存操作记录池的起始位执行所述写入操作。
即是在“StartPos”指明的当前写入位置开始写入本内存操作记录。首先写入记录头、再写入记录体,最后将写入完成标志位置为有效,表明本内存操作记录写入结束。如果当前写到了内存操作记录池的结尾,则从记录池的开始位写入数据。
步骤307:通知内存操作记录读取线程有新的内存操作记录被写入。
具体的,可以通过事件内核对象“hEventRecord”通知内存操作记录读取线程有新的内存操作记录被写入,让内存操作记录读取线程立即处理。“hEventRecord”表示内存池中有内存操作记录被写入,内存操作记录读取线程可以从内存操作记录池中读取新的内存操作记录了。
在步骤201的整个实现过程中,由于内存操作记录池是预先分配好的,所以内存操作记录在写入过程中不会产生新的内存分配。
步骤202:所述内存操作记录读取线程模块从所述内存操作记录池中读取内存操作记录。
具体的,本步骤的实现也可以通过调用RemoveRecord函数来实现。RemoveRecord可以被内存操作记录读取线程不断调用,从内存操作记录池中取出一条记录并进行处理,直至内存操作记录池为空。在前面的两个函数“ApendRecord”和“RemoveRecord”中,内存操作记录池的当前写入位置和已写入总长度分别是两个32bit的长变量,这两个长变量需要原子操作,即是互不影响。为了达到在一个原子操作中同时更新两个32bit数据的目的,则可以使用互锁函数“InterlockedCompareExchange6”4同时对两个长整型数据进行原子操作。一个长整型数据占用32位,2个占用64位,把2个长整型数组合起来,刚好是64位,因此可以非常方便地使用64位的互锁函数“InterlockedCompareExchange64”进行原子操作。
参考图4,所述内存操作记录读取线程从所述内存操作记录池读取内存操作记录的步骤,具体可以包括:
步骤401:内存操作记录读取线程检查待读取的内存操作记录的完成标志位是否为有效,如果是,进入步骤402。
内存操作记录读取线程检查读取位置“RecordPoolReadPos”的值是否为有效。该位置正是一条内存操作记录的写入完成标志位(FinishFlag),该写入完成标志位无效(为例如0)可以表明没有内存操作记录或内存操作记录尚未写入完成,调用RemoveRecord的线程被挂起,等待hEventRecord内核对象的通知。
步骤402:清除所述完成标志位的内容,读取并删除所述内存操作记录的记录头。
如果有效,则清除写入完成标志位(FinishFlag),读取并清除内存操作记录的记录头数据。内存操作记录读取线程从内存操作记录池中读取一条记录后,立即把该读完的存操作记录从内存操作记录池中删除。
步骤403:根据所述记录头中的长度信息读取并删除记录体,使用互锁函数更新所述内存操作记录池的已写入总长度。
根据记录头信息中的“lDataLen”指明的长度读取并清除记录体数据。同时使用互锁函数InterlockedCompareExchange64修改内存操作记录池的写入总长度。即是获取内存操作记录池的当前写入位置和已写入总长度(CurrentWriteParam),并保存到StartPos中。
内存操作记录读取线程再计算读取本内存操作记录后,内存操作记录池的新的已写入总长度(而写入位置则不需要变),并将新的已写入总长度保存到NewPos中。使用互锁函数“InterlockedCompareExchange64”更新内存池的写入位置和写入总长度。同时更新读取位置“RecordPoolReadPos”的值,使之指向下一条内存操作记录。
步骤404:通知工作线程可以继续写入内存操作记录。
具体的,可以通过内核对象hEventPoolWritable通知被挂起的工作线程记录池可以继续写入。
步骤203:判断所述内存操作记录是否为内存分配记录,如果是,则进入步骤204,如果否,则进入步骤205。
内存操作记录读取线程判断读取到的内存操作记录是内存分配记录还是内存释放记录。
步骤204:将所述内存分配记录插入至所述内存操作记录映射表中。
如果是内存分配记录,则把该条记录插入内存操作记录映射表(MemoryRecordMap)中。
步骤205:从所述内存操作记录映射表中删除该条内存释放记录的内存地址指示的映射关系。
当所述内存操作记录不是为内存分配记录时,从内存操作记录映射表(MemoryRecordMap)中删除该条记录的内存地址指示的映射关系。可见,内存操作记录映射表(MemoryRecordMap)可以保持对所有内存分配记录的跟踪,在某个时间点,需要获取当前泄漏的内存记录时,直接从这个映射表中读取即可。
采用本申请实施例,通过预先分配缓存区用作内存操作记录池,就可以使得内存分配记录或者内存释放记录在被处理时不会引起新的内存分配任务,这样就可以避免内存的无限递归现象,同时,还能够根据最终内存操作记录映射表中的内存分配记录检测出泄露的内存。本申请实施例有效解决了内存操作记录不够完整的问题,并且被测内存泄露的程序的性能也不会降低,系统开销资源较少。
参考图5,其示出了本申请一种内存操作记录的处理方法实施例2的流程图,本实施例可以认为是应用内存操作记录的处理方法检测内存泄露的实施例,可以包括以下步骤:
步骤501:被测程序的工作线程模块将内存操作记录写入预先设置的内存操作记录池中;所述内存操作记录包括:当前内存分配记录和/或内存释放记录。
这里的被测程序指的是可以测试出是否存在内存泄露现象的程序。
步骤502:所述内存操作记录读取线程模块从所述内存操作记录池中读取内存操作记录。
步骤503:判断所述内存操作记录是否为内存分配记录,如果是,则进入步骤503,如果否,则进入步骤506。
步骤504:将所述内存分配记录插入至所述内存操作记录映射表中。
步骤505:从所述内存操作记录映射表中删除该条内存释放记录的内存地址指示的映射关系。
前述步骤501~步骤505的实现方式在实施例1中已经详细介绍,在此不再赘述。
步骤506:从所述内存操作记录映射表中获取剩余的映射关系中包括的内存操作记录作为内存泄漏检测结果。
需要说明的是,在本实施例中,最终从内存操作记录映射表中获取剩余的映射关系,并从中获得涉及的内存操作记录,并作为内存泄漏检测结果。
对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。
与上述本申请一种内存操作记录的处理方法实施例1所提供的方法相对应,参见图6,本申请还提供了一种内存操作记录的处理装置实施例1,在本实施例中,该装置可以包括:内存操作记录池601、内存操作记录读取线程模块602、内存操作记录映射表603和多个工作线程模块604;其中,
所述内存操作记录池601用于存储内存分配记录;
所述内存操作记录映射表603用于保存内存操作记录与其中的内存地址之间的映射关系;
所述工作线程模块604,用于将内存操作记录写入预先设置的内存操作记录池中;所述内存操作记录包括:内存分配记录和/或内存释放记录;
所述工作线程模块604,参考图7所示,具体可以配置为:
计算子模块701,用于当前工作线程计算当前内存操作记录的待写入总长度;
获取子模块702,用于当前工作线程获取所述内存操作记录池的当前写入位置和当前已写入总长度;
第二判断子模块703,用于判断所述当前已写入总长度与待写入总长度之和是否大于所述内存操作记录池的总长度;
挂起子模块704,用于在所述判断子模块的结果为是的情况下,将该内存操作记录放入等待队列,以便于在所述内存操作记录池可写入时,接收所述内存记录读取线程的通知以继续本次写入操作;
写入子模块705,用于在所述判断子模块的结果为否的情况下,根据所述待写入总长度、当前已写入总长度和所述当前写入位置计算下一次写入位置和下一次已写入总长度,在所述当前写入位置写入所述内存操作记录,并将所述下一次写入位置和下一次已写入总长度作为下一次写入时的当前写入位置和当前已写入总长度;以及,通知内存操作记录读取线程有新的内存操作记录被写入。
所述写入子模块705,具体可以配置为:分别写入所述内存操作记录的记录头和记录体,并在写入完成时将写入完成标志位设置为有效;其中,在所述写入过程中如果到达所述内存操作记录池的结束位,就转向所述内存操作记录池的起始位执行所述写入操作。
所述内存操作记录读取线程模块602包括读取子模块6021和第一判断子模块6022,所述读取子模块6021用于从所述内存操作记录池中读取内存操作记录,所述第一判断子模块6022用于判断所述内存操作记录是否为内存分配记录,如果是,则将所述内存分配记录插入至所述内存操作记录映射表中,如果否,则从所述内存操作记录映射表中删除该条内存释放记录的内存地址指示的映射关系。
参考图8所示,所述读取子模块6021包括:
检测子模块801,用于检测待读取的内存操作记录的完成标志位是否为有效;
更新子模块802,用于当所述检测子模块的结果是时,清除所述完成标志位的内容,读取并删除所述内存操作记录的记录头,并根据所述记录头中的长度信息读取并删除记录体,使用互锁函数更新所述内存操作记录池的已写入总长度;并通知工作线程模块可以继续写入内存操作记录。
采用本申请实施例,通过预先分配缓存区用作内存操作记录池,就可以使得内存分配记录或者内存释放记录在处理时不会引起新的内存分配任务,这样就可以避免内存的无限递归现象,同时,还能够根据最终内存操作记录映射表中的内存分配记录检测出泄露的内存。本申请实施例有效解决了内存操作记录不够完整的问题,并且被测内存泄露的程序的性能也不会降低,系统开销资源较少。
与上述本申请一种内存操作记录的处理方法实施例2所提供的方法相对应,参见图9,本申请还提供了一种内存操作记录的处理装置实施例2,在本实施例中,该装置可以包括:内存操作记录池601、内存操作记录读取线程模块602、内存操作记录映射表603、多个工作线程模块604和检测模块901;其中,
所述内存操作记录池601用于存储内存分配记录。
所述内存操作记录映射表603用于保存内存操作记录与其中的内存地址之间的映射关系。
所述工作线程模块604,用于将内存操作记录写入预先设置的内存操作记录池中;所述内存操作记录包括:内存分配记录和/或内存释放记录。
所述内存操作记录读取线程模块602包括读取子模块6021和第一判断子模块6022,所述读取子模块6021用于从所述内存操作记录池中读取内存操作记录,所述第一判断子模块6022用于判断所述内存操作记录是否为内存分配记录,如果是,则将所述内存分配记录插入至所述内存操作记录映射表中,如果否,则从所述内存操作记录映射表中删除该条内存释放记录的内存地址指示的映射关系。
检测模块901,用于从所述内存操作记录映射表中获取剩余的映射关系中包括的内存操作记录作为内存泄漏检测结果。
本实施例所述的装置采用软件实现时,可以作为第三方交易平台的服务器新增的一个功能,也可以单独编写相应的程序,本申请不限定所述方法或装置的实现方式。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个......”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本申请所提供的一种内存操作记录的处理方法及装置进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
Claims (8)
1.一种内存操作记录的处理方法,其特征在于,所述方法应用于内存操作记录的处理装置,所述处理装置包括:内存操作记录池、内存操作记录读取线程模块、内存操作记录映射表和多个工作线程模块,所述内存操作记录池用于存储内存分配记录,所述内存操作记录映射表用于保存内存操作记录与其涉及的内存地址之间的映射关系;该方法包括:
所述工作线程模块将内存操作记录写入预先设置的内存操作记录池中;所述内存操作记录包括:当前内存分配记录和/或内存释放记录;
所述内存操作记录读取线程模块从所述内存操作记录池中读取内存操作记录,并判断所述内存操作记录是否为内存分配记录,如果是,则将所述内存分配记录插入至所述内存操作记录映射表中,如果否,则从所述内存操作记录映射表中删除该条内存释放记录的内存地址指示的映射关系;
从所述内存操作记录映射表中获取剩余的映射关系中包括的内存操作记录作为内存泄漏检测结果。
2.根据权利要求1所述的方法,其特征在于,所述将内存操作记录写入预先设置的内存操作记录池中,包括:
当前工作线程计算当前内存操作记录的待写入总长度;
当前工作线程获取所述内存操作记录池的当前写入位置和当前已写入总长度;
判断所述当前已写入总长度与待写入总长度之和是否大于所述内存操作记录池的总长度,如果是,则将该内存操作记录放入等待队列,在所述内存操作记录池可写入时,接收所述内存记录读取线程的通知以继续本次写入操作;
如果否,则根据所述待写入总长度、当前已写入总长度和所述当前写入位置计算下一次写入位置和下一次已写入总长度,在所述当前写入位置写入所述内存操作记录,并将所述下一次写入位置和下一次已写入总长度作为下一次写入时的当前写入位置和当前已写入总长度;以及,通知内存操作记录读取线程有新的内存操作记录被写入。
3.根据权利要求2所述的方法,其特征在于,所述在所述当前写入位置写入所述内存操作记录,包括:
分别写入所述内存操作记录的记录头和记录体,并在写入完成时将写入完成标志位设置为有效;其中,在所述写入过程中如果到达所述内存操作记录池的结束位,则转向所述内存操作记录池的起始位执行所述写入操作。
4.根据权利要求1所述的方法,其特征在于,所述内存操作记录读取线程从所述内存操作记录池读取内存操作记录,包括:
内存操作记录读取线程检查待读取的内存操作记录的完成标志位是否为有效,如果是,清除所述完成标志位的内容,读取并删除所述内存操作记录的记录头,并根据所述记录头中的长度信息读取并删除记录体,使用互锁函数更新所述内存操作记录池的已写入总长度;并通知工作线程可以继续写入内存操作记录。
5.一种内存操作记录的处理装置,其特征在于,该装置包括:内存操作记录池、内存操作记录读取线程模块、内存操作记录映射表和多个工作线程模块;其中,
所述内存操作记录池,用于存储内存分配记录;
所述内存操作记录映射表,用于保存内存操作记录与其中的内存地址之间的映射关系;
所述工作线程模块,用于将内存操作记录写入预先设置的内存操作记录池中;所述内存操作记录包括:内存分配记录和/或内存释放记录;
所述内存操作记录读取线程模块包括读取子模块和第一判断子模块;
所述读取子模块,用于从所述内存操作记录池中读取内存操作记录;
所述第一判断子模块,用于判断所述内存操作记录是否为内存分配记录,如果是,则将所述内存分配记录插入至所述内存操作记录映射表中,如果否,则从所述内存操作记录映射表中删除该条内存释放记录的内存地址指示的映射关系;
检测模块,用于从所述内存操作记录映射表中获取剩余的映射关系中包括的内存操作记录作为内存泄漏检测结果。
6.根据权利要求5所述的装置,其特征在于,所述工作线程模块,具体配置为:
计算子模块,用于当前工作线程计算当前内存操作记录的待写入总长度;
获取子模块,用于当前工作线程获取所述内存操作记录池的当前写入位置和当前已写入总长度;
第二判断子模块,用于判断所述当前已写入总长度与待写入总长度之和是否大于所述内存操作记录池的总长度;
挂起子模块,用于在所述判断子模块的结果为是的情况下,将该内存操作记录放入等待队列,以便于在所述内存操作记录池可写入时,接收所述内存记录读取线程的通知以继续本次写入操作;
写入子模块,用于在所述判断子模块的结果为否的情况下,根据所述待写入总长度、当前已写入总长度和所述当前写入位置计算下一次写入位置和下一次已写入总长度,在所述当前写入位置写入所述内存操作记录,并将所述下一次写入位置和下一次已写入总长度作为下一次写入时的当前写入位置和当前已写入总长度;以及,通知内存操作记录读取线程有新的内存操作记录被写入。
7.根据权利要求6所述的装置,其特征在于,所述写入子模块,具体配置为:分别写入所述内存操作记录的记录头和记录体,并在写入完成时将写入完成标志位设置为有效;其中,在所述写入过程中如果到达所述内存操作记录池的结束位,就转向所述内存操作记录池的起始位执行所述写入操作。
8.根据权利要求5所述的装置,其特征在于,所述读取子模块包括:
检测子模块,用于检测待读取的内存操作记录的完成标志位是否为有效;
更新子模块,用于当所述检测子模块的结果是时,清除所述完成标志位的内容,读取并删除所述内存操作记录的记录头,并根据所述记录头中的长度信息读取并删除记录体,使用互锁函数更新所述内存操作记录池的已写入总长度;并通知工作线程模块可以继续写入内存操作记录。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110157154.8A CN102831068B (zh) | 2011-06-13 | 2011-06-13 | 一种内存操作记录的处理方法及装置 |
HK13101166.1A HK1173820A1 (zh) | 2011-06-13 | 2013-01-28 | 種內存操作記錄的處理方法及裝置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110157154.8A CN102831068B (zh) | 2011-06-13 | 2011-06-13 | 一种内存操作记录的处理方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102831068A CN102831068A (zh) | 2012-12-19 |
CN102831068B true CN102831068B (zh) | 2016-04-06 |
Family
ID=47334217
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110157154.8A Active CN102831068B (zh) | 2011-06-13 | 2011-06-13 | 一种内存操作记录的处理方法及装置 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN102831068B (zh) |
HK (1) | HK1173820A1 (zh) |
Families Citing this family (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104021085A (zh) * | 2014-04-24 | 2014-09-03 | 北京掌阔移动传媒科技有限公司 | 一种移动终端内存清理方法和装置 |
CN106557300B (zh) * | 2015-09-24 | 2020-04-07 | 腾讯科技(深圳)有限公司 | 一种野指针的函数栈信息确定方法、装置及电子设备 |
CN106610892B (zh) * | 2015-10-23 | 2020-12-22 | 腾讯科技(深圳)有限公司 | 内存泄漏检测方法和装置 |
CN105975356A (zh) * | 2016-04-28 | 2016-09-28 | 乐视控股(北京)有限公司 | 内存错误检测方法、内存管理系统和装置、以及服务器 |
CN106055478B (zh) * | 2016-05-31 | 2020-09-22 | 腾讯科技(深圳)有限公司 | 检测内存泄漏的方法和装置 |
CN106407031B (zh) * | 2016-09-14 | 2019-05-28 | 华为数字技术(成都)有限公司 | 一种内存泄露定位方法及电子设备 |
CN106776356A (zh) * | 2016-11-28 | 2017-05-31 | 新疆熙菱信息技术股份有限公司 | 一种实现内存高速交互的系统及方法 |
CN110134454B (zh) * | 2018-02-09 | 2022-06-14 | 聚好看科技股份有限公司 | 一种启动应用程序的方法及其装置 |
CN109086205A (zh) * | 2018-07-25 | 2018-12-25 | 郑州云海信息技术有限公司 | 基于内存池的内存错误调试方法和装置 |
CN111858112B (zh) * | 2019-04-26 | 2023-04-25 | 腾讯科技(深圳)有限公司 | 一种检测内存泄露的方法、客户端及服务器 |
CN110119615B (zh) * | 2019-05-24 | 2021-06-08 | 北京智游网安科技有限公司 | 一种安卓日志防泄漏的控制方法、装置和计算机设备 |
CN111104347B (zh) * | 2019-12-23 | 2022-03-25 | 北京东土军悦科技有限公司 | 堆内存块查找方法、装置、设备及存储介质 |
CN111694747B (zh) * | 2020-06-17 | 2023-03-28 | 抖音视界有限公司 | 线程的检测方法、装置、设备及计算机可读介质 |
CN113220554B (zh) * | 2021-05-17 | 2023-07-25 | 北京百度网讯科技有限公司 | 检测程序代码的性能的方法和设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101093455A (zh) * | 2006-06-21 | 2007-12-26 | 中兴通讯股份有限公司 | 一种嵌入式操作系统的内存池分配方法 |
CN101110044A (zh) * | 2007-08-28 | 2008-01-23 | 中兴通讯股份有限公司 | 一种内存监控管理的方法及系统 |
CN101539870A (zh) * | 2008-03-21 | 2009-09-23 | 中兴通讯股份有限公司 | 内存泄漏检测装置及方法 |
CN101593152A (zh) * | 2009-06-25 | 2009-12-02 | 青岛海信移动通信技术股份有限公司 | 一种移动终端内存泄漏检测方法及装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100388233C (zh) * | 2005-12-29 | 2008-05-14 | 兆日科技(深圳)有限公司 | 一种定位无操作系统的嵌入式系统内存泄露的方法 |
US8473789B2 (en) * | 2009-09-21 | 2013-06-25 | International Business Machines Corporation | Memory leak monitoring system and associated methods |
-
2011
- 2011-06-13 CN CN201110157154.8A patent/CN102831068B/zh active Active
-
2013
- 2013-01-28 HK HK13101166.1A patent/HK1173820A1/zh unknown
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101093455A (zh) * | 2006-06-21 | 2007-12-26 | 中兴通讯股份有限公司 | 一种嵌入式操作系统的内存池分配方法 |
CN101110044A (zh) * | 2007-08-28 | 2008-01-23 | 中兴通讯股份有限公司 | 一种内存监控管理的方法及系统 |
CN101539870A (zh) * | 2008-03-21 | 2009-09-23 | 中兴通讯股份有限公司 | 内存泄漏检测装置及方法 |
CN101593152A (zh) * | 2009-06-25 | 2009-12-02 | 青岛海信移动通信技术股份有限公司 | 一种移动终端内存泄漏检测方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
HK1173820A1 (zh) | 2013-05-24 |
CN102831068A (zh) | 2012-12-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102831068B (zh) | 一种内存操作记录的处理方法及装置 | |
US10114740B2 (en) | Memory management techniques | |
CN103455424B (zh) | 基于VxWorks操作系统的动态内存泄漏检测方法及装置 | |
CN110865888B (zh) | 一种资源加载方法、装置、服务器及存储介质 | |
US10540284B2 (en) | Cache-coherent multiprocessor system and a method for detecting failures in a cache-coherent multiprocessor system | |
JP2008276763A (ja) | メモリエラーの検出法 | |
US20150067279A1 (en) | Data processing system and method for operating a data processing system | |
CN110209493B (zh) | 内存管理方法、装置、电子设备及存储介质 | |
KR20150141282A (ko) | 복수의 가상 머신에서 수행되는 응용 프로그램들간 참조 데이터를 공유하는 방법 및 이를 위한 참조 데이터 관리 장치 및 시스템 | |
CN102760080A (zh) | 一种内存管理的方法和装置 | |
CN111625546B (zh) | 一种数据写入方法、装置、设备、介质 | |
CN102855214B (zh) | 实现数据一致性的方法和一种多核系统 | |
CN103914355A (zh) | 对内存重复释放进行定位的方法和装置 | |
CN103049328A (zh) | 计算机系统中内存资源分配方法 | |
CN110209354B (zh) | 用于处理数据的方法、装置、设备和介质 | |
US8910004B2 (en) | Information processing apparatus, and method of controlling information processing apparatus | |
CN112650692A (zh) | 堆内存分配方法、装置及存储介质 | |
CN117112215A (zh) | 内存分配方法、设备及存储介质 | |
CN108197005B (zh) | Ios应用的底层运行性能监测方法、介质、设备及系统 | |
CN105512091A (zh) | 一种内存分配方法及装置 | |
CN106406745A (zh) | 根据目录信息维护Cache数据一致性的方法及装置 | |
CN113849311B (zh) | 内存空间管理方法、装置、计算机设备和存储介质 | |
US20140082305A1 (en) | Providing usage statistics for virtual storage | |
EP2960798B1 (en) | Automatic memory leak detection | |
CN103164290A (zh) | 应用内存管理方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 1173820 Country of ref document: HK |
|
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: GR Ref document number: 1173820 Country of ref document: HK |