CN101593152A - 一种移动终端内存泄漏检测方法及装置 - Google Patents
一种移动终端内存泄漏检测方法及装置 Download PDFInfo
- Publication number
- CN101593152A CN101593152A CNA2009101486567A CN200910148656A CN101593152A CN 101593152 A CN101593152 A CN 101593152A CN A2009101486567 A CNA2009101486567 A CN A2009101486567A CN 200910148656 A CN200910148656 A CN 200910148656A CN 101593152 A CN101593152 A CN 101593152A
- Authority
- CN
- China
- Prior art keywords
- memory
- dram
- internal memory
- record sheet
- run time
- 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.)
- Granted
Links
Images
Landscapes
- Memory System (AREA)
Abstract
本发明涉及移动通信领域,尤其涉及检测移动终端中内存泄漏的技术。本发明提供的一种移动终端内存泄漏检测装置及方法,包括:在移动终端的应用程序运行过程中,若运行第一执行代码,则根据所述第一执行代码进行动态内存分配,并将该次分配的内存的相关信息记录到内存分配记录表中;若运行第二执行代码,则根据所述第二执行代码进行动态内存释放,将该次释放的内存所对应的相关信息从所述内存分配记录表中删除。由于利用记录表中记录的内容跟踪每个分配的内存,从而可以及时检测出内存泄漏。
Description
技术领域
本发明涉及移动通信领域,尤其涉及检测移动终端中内存泄漏的技术。
背景技术
内存泄漏指的是用动态存储分配函数(malloc函数)动态分配的空间,在使用完毕后未释放(free),结果导致分配的空间一直被占据,不能被其它程序使用的情况。一般常见的内存泄漏是堆内存的泄漏,堆内存是指程序从堆中分配的、大小任意的(内存块的大小可以在程序运行期决定)、使用完后必须显示释放的内存。应用程序一般使用函数malloc从堆中分配到一块内存,使用完后,程序应该负责相应的调用free函数释放该内存块,否则,这块内存就不能被再次使用,那么就认为这块内存泄漏了。
内存泄漏后,如果没有被释放的内存块并不大,那么在短时间内对程序不会有太大的影响,这也使得内存泄漏问题有很强的隐蔽性,不容易被发现。然而不管内存泄漏多么轻微,当程序长时间运行时,其破坏力是惊人的,从性能下降到内存耗尽,甚至会影响到其他程序的正常运行。另外内存泄漏问题的另一个危害是,内存泄漏的当时不会有很明显的现象,当有异常现象出现时已时过境迁,其现场已非内存泄漏时的现场了,这给调试带来了很大的难度。
并且当多次内存泄漏堆积起来时,会最终消耗尽系统所有的内存。在消耗尽系统所有的内存后,表现为:cpu资源耗尽、或者进程id耗尽、或者硬盘耗尽。
因此,及时检测到内存泄漏可以及时发现问题,避免系统因内存泄漏而资源耗尽无法正常运行。
然而内存泄漏是一种很难定位和跟踪的错误,目前检测内存泄漏的方法主要是截获对分配内存和释放内存的函数的调用,从而跟踪每一块内存的生命周期。通常,技术人员通过调用malloc函数或new函数进行内存分配,通过调用realloc函数、free函数或delete函数进行内存释放;而new函数最终也是通过malloc函数实现内存分配的,realloc以及delete函数最终是通过free函数进行内存释放的;因此,现有技术中是通过截获应用程序对malloc函数以及free函数的调用来检测内存泄漏的。
但是,实现截获malloc函数以及free函数的工具往往比较复杂,需要占用大量内存空间和较多的系统资源,对于移动终端来说,由于本身内存比较紧张和用户操作需要实时响应的特点,现有技术的方法并不适用于移动终端。
发明内容
本发明实施例提供了一种移动终端内存泄漏检测方法及装置,用以检测移动终端的内存泄漏。
一种移动终端内存泄漏检测方法,包括:
在移动终端的应用程序运行过程中,若运行用于进行动态内存分配,并将该次分配的内存的相关信息记录到内存分配记录表中的第一执行代码,则根据所述第一执行代码执行相应操作;
在移动终端的应用程序运行过程中,若运行用于进行动态内存释放,将该次释放的内存所对应的相关信息从所述内存分配记录表中删除的第二执行代码,则根据所述第二执行代码执行相应操作;
根据所述内存分配记录表中记录的内容确定是否存在内存泄漏。
其中,所述第一执行代码、第二执行代码分别是根据所述应用程序的源代码中调用的动态内存分配宏、动态内存释放宏生成的,所述动态内存分配宏与动态内存释放宏定义在所述应用程序引用的头文件中,并且所述动态内存分配宏的名称和传递参数分别与动态内存分配函数的名称和传递参数相同;所述动态内存释放宏的名称和传递参数分别与动态内存释放函数的名称和传递参数相同。
一种移动终端内存泄漏检测装置,包括:
第一执行代码运行模块,用于在所述应用程序运行过程中运行用于根据所述第一执行代码进行动态内存分配,并将该次分配的内存的相关信息记录到内存分配记录表中的第一执行代码;
第二执行代码运行模块,用于在所述应用程序运行过程中运行用于根据所述第二执行代码进行动态内存释放,将该次释放的内存所对应的相关信息从所述内存分配记录表中删除的第二执行代码;
内存泄漏检测模块,用于根据所述内存分配记录表中记录的内容确定是否存在内存泄漏。
所述装置还包括:
头文件存储模块,用于存储应用程序引用的头文件,所述头文件中定了动态内存分配宏与动态内存释放宏;所述动态内存分配宏的名称与传递参数分别与动态内存分配函数的名称与传递参数相同;所述动态内存释放宏的名称与传递参数分别与动态内存释放函数的名称与传递参数相同;以及
所述第一执行代码、第二执行代码分别是根据所述应用程序的源代码中调用的动态内存分配宏、动态内存释放宏生成的。
本发明实施例由于在分配内存时将分配的内存的相关信息记录到记录表中,在释放内存时,将释放的内存所对应的相关信息从记录表中删除;从而可以检测记录表中的内容,根据记录表中的内容判断是否存在内存泄漏。该方法不必如现有技术的方法需要截获程序运行过程中调用的mallco函数以及free函数,实现方法不复杂,不需占用大量内存空间和较多的系统资源,更适于应用在移动终端上。
进一步,由于在头文件中定义了具有将分配的内存的相关信息记录到记录表的功能的动态内存分配宏,以及具有将释放的内存所对应的相关信息从记录表中删除的动态内存释放宏,而动态内存分配宏与动态内存释放宏的名称和传递参数与通常应用程序调用的动态内存分配函数与动态内存释放函数的名称和传递参数相同,所以不必更改应用程序的源代码,同时又可以实现上述的两个功能,从而利用记录表中记录的内容跟踪每个分配的内存,及时检测出内存泄漏。
附图说明
图1为本发明实施例的内存泄漏检测方法流程图;
图2为本发明实施例的一种具体动态内存分配宏定义示意图;
图3为本发明实施例的一种具体动态内存分配宏内容的源码示意图;
图4为本发明实施例的一种具体动态内存释放宏定义示意图;
图5为本发明实施例的一种具体动态内存释放宏内容的源码示意图;
图6为本发明实施例的内存泄漏检测装置结构框图。
具体实施方式
本发明实施例提供的一种应用在移动终端上的内存泄漏检测方法,在应用程序运行时,若该应用程序进行了内存分配操作,则将分配的内存的相关信息记录到记录表中;若执行了内存释放操作,则将释放的内存所对应的相关信息从记录表中删除。这样,通过检测记录表中没有被删除的内存的相关信息就可以判断出内存泄漏的情况。而且,本发明实施例的方法中,在头文件中定义了具有将分配的内存的相关信息记录到记录表的功能的动态内存分配宏(比如mallco宏),以及具有将释放的内存所对应的相关信息从记录表中删除的动态内存释放宏(比如free宏),而动态内存分配宏与动态内存释放宏的名称和传递参数与通常应用程序调用的动态内存分配函数(比如mallco函数)与动态内存释放函数(比如free函数)的名称和传递参数相同,所以不必更改应用程序的源代码,同时又可以实现新增的上述的两个功能,实现过程简单,可操作性强。
下面结合说明书附图详细说明本发明实施例的具体技术方案。
本发明实施例提供的一种内存泄漏检测方法,流程图如图1所示,包括如下步骤:
S101、移动终端在运行应用程序的过程中,若运行该应用程序的第一执行代码,则根据所述第一执行代码进行动态内存分配,并将该次分配的内存的相关信息记录到内存分配记录表中。
移动终端在运行应用程序的过程中,若运行用于进行动态内存分配,并将该次分配的内存的相关信息记录到内存分配记录表中的第一执行代码,则根据第一执行代码执行相应操作。
所述内存的相关信息具体包括:内存的起始地址以及内存的大小。进一步,内存的相关信息还可以包括:分配该内存的应用程序的文件名称、该应用程序中分配该内存的函数的名称,以及该函数中执行分配该内存的代码的行号等。
S102、移动终端在运行应用程序的过程中,若运行该应用程序的第二执行代码,则根据所述第二执行代码进行动态内存释放,将该次释放的内存所对应的相关信息从所述内存分配记录表中删除。
在移动终端的应用程序运行过程中,若运行用于进行动态内存释放,将该次释放的内存所对应的相关信息从所述内存分配记录表中删除的第二执行代码,则根据所述第二执行代码执行相应操作。
S103、根据内存分配记录表中记录的内容确定是否存在内存泄漏。
可以在多种情况下检测内存分配记录表中记录的内容,从而判断是否存在内存泄漏。
例如,内存分配记录表可以以文件的形式保存在移动终端的存储介质上,在移动终端关机后,可以通过工具(比如计算机)从移动终端中读取内存分配记录表,并检测内存分配记录表中记录的内容,若记录的内容为空,表明不存在内存泄漏;否则,存在内存泄漏。
或者,在移动终端每次待机状态时,检测内存分配记录表中记录的内容;由于在待机状态下基本运行相同的应用程序,因此,若检测内存分配记录表中记录的内容与上次待机状态时内存分配记录表中的内容不相同,则表明存在内存泄漏;否则,无内存泄漏。
再或者,在每次应用程序退出时,比较该应用程序运行前、运行后内存分配记录表中的内容,若比较结果为不同,则说明该应用程序在运行过程中分配了一些内存,但是在退出前并没有释放掉这些内存,从而可以确定检测到了内存泄漏;否则,认为无内存泄漏。
若确定检测到内存泄漏,则可以根据内存分配记录表中记录的内容查找泄漏原因。
例如,在移动终端关机后,从移动终端中导出内存分配记录表,若根据内存分配记录表检测到内存泄漏,则可以根据内存分配记录表中记录的内存的相关信息中的分配该内存的应用程序的文件名称定位引起该次泄漏的文件、根据相关信息中的分配该内存的函数的名称进而定位引起该次泄漏的函数,并且还可以根据相关信息中的执行分配该内存的代码的行号直接定位源代码在函数中的位置。比如,检测到内存分配记录表中记录的内容如下表1所示:
表1
内存起始地址 | 内存大小 | 文件名称 | 函数名称 | 行号 |
0x0e566625 | 0x1000 | mmi_idle_touch.c | App_touch_func | 4850 |
依据表1就可以判定出名称为“mmi_idle_touch.c”的文件中,名称为“App_touch_func”的函数引起了内存泄漏。
再比如,在应用程序运行前,缓存了内存分配记录表中记录的内容如表2所示;在应用程序退出后,内存分配记录表中记录的内容如表3所示:
表2
内存起始地址 | 内存大小 | 文件名称 | 函数名称 | 行号 |
0x07ffffff | 0x100 | mmi_idle.c | App_idle_func | 1620 |
0x072546fe | 0x100 | mmi_idle.c | App_idle_proc | 520 |
表3
内存起始地址 | 内存大小 | 文件名称 | 函数名称 | 行号 |
0x07ffffff | 0x100 | mmi_idle.c | App_idle_func | 1620 |
0x072546fe | 0x100 | mmi_idle.c | App_idle_proc | 520 |
0x0fde5410 | 0x120 | mmi_pb.c | App_pb_func | 530 |
显然,表3中的内容比表2中的内容多了一条内存的相关信息的记录,那么,表明该应用程序“mmi_pb.c”在运行过程中分配了该内存,但是,在退出前没有释放该内存,从而造成内存泄漏。
本领域技术人员可以通过多种方式生成上述的第一执行代码,例如,在应用程序源代码中调用动态内存分配函数(动态内存分配函数)的后面增加对分配内存信息记录函数的调用,而分配内存信息记录函数可用于将该次分配的内存的相关信息记录到内存分配记录表中。但是,这种方法需要修改应用程序的源代码。
本发明实施例提供的一种第一执行代码生成方法可以是,根据应用程序的源代码中的动态内存分配宏(比如mallco宏)的名称和传递参数生成第一执行代码。具体为,在应用程序源代码的编译过程中根据源代码中调用的动态内存分配宏以及头文件中定义的动态内存分配宏生成第一执行代码。所述动态内存分配宏的名称与传递参数分别与动态内存分配函数(比如mallco函数)的名称与传递参数相同;而动态内存分配宏定义在应用程序引用的头文件中(例如,TEST_MALLOC_H头文件中)。
这样,就不必对原有的每个应用程序的源代码进行修改;也就是说,在原有的应用程序的源代码中存在对动态内存分配函数进行调用的源代码的话,在对应用程序的源代码进行编译的过程中,由于动态内存分配宏的名称与传递参数与动态内存分配函数的名称和传递参数相同,因此,会根据头文件中定义的动态内存分配宏的内容生成第一执行代码。而动态内存分配宏的内容包括第一源代码,所述第一源代码在编译后生成的执行代码(即第一执行代码)在运行时用于进行动态内存分配,并将该次分配的内存的相关信息记录到内存分配记录表中。
本领域技术人员可以根据第一执行代码所要完成的执行操作来编写动态内存分配宏的内容(即所述第一源代码)。例如,定义的动态内存分配宏的一种具体内容可以包括动态内存分配函数的内容,以及分配内存信息记录函数的内容。而编写的分配内存信息记录函数在编译后生成的执行代码可用于将动态内存分配函数分配的内存的相关信息记录到一个指定的内存分配记录表中。
例如,在头文件中定义的动态内存分配宏(mallco宏)如图2所示。
图2中的malloc(size)即为动态内存分配宏的名称和传递的参数,而动态内存分配宏的内容为test_malloc(size,__FILE__,___FUNCTION__,__LINE__)。
test_malloc(size,__FILE__,__FUNCTION__,__LINE__)中包括动态内存分配函数以及分配内存信息记录函数,例如,具体的编码可以如图3所示。
其中,“mem=(struct memory*)malloc(size+sizeof(size_t))”即为动态内存分配函数的调用;“test_insert_record(file,func,lineno,mem->address,size)”即为分配内存信息记录函数用于将执行该次内存分配的文件名、函数名、行号、内存起始地址、内存大小等相关信息记录到内存分配记录表中的函数。
类似地,本领域技术人员可以通过多种方式生成上述的第二执行代码,例如,在应用程序源代码中调用动态内存释放函数(动态内存释放函数)的后面增加对内存信息删除函数的调用,而内存信息删除函数可用于将该次释放的内存所对应的相关信息从内存分配记录表中删除。但是,这种方法需要修改应用程序的源代码。
本发明实施例提供的一种第二执行代码生成方法可以是,根据应用程序的源代码中的动态内存释放宏(比如free宏)的名称和传递参数生成第二执行代码。具体为,在应用程序源代码的编译过程中根据源代码中调用的动态内存释放宏以及头文件中定义的动态内存释放宏(动态内存释放宏)生成第二执行代码。所述动态内存释放宏的名称与传递参数分别与动态内存释放函数(比如free函数)的名称与传递参数相同;而动态内存释放宏定义在应用程序引用的头文件中(例如,TEST_MALLOC_H头文件中)。
这样,就不必对原有的每个应用程序的源代码进行修改;也就是说,在原有的应用程序的源代码中存在对动态内存释放函数进行调用的源代码的话,在对应用程序的源代码进行编译的过程中,由于动态内存释放宏的名称与传递参数与动态内存释放函数的名称和传递参数相同,因此,会根据头文件中定义的动态内存释放宏的内容生成第二执行代码。而动态内存释放宏的内容包括第二源代码,所述第二源代码在编译后生成的执行代码(即第二执行代码)在运行时用于进行行动态内存释放时,将该次释放的内存所对应的相关信息从所述内存分配记录表中删除。例如,可以根据释放的内存的起始地址从内存分配记录表中找到起始地址相同的内存,并将该起始地址的内存的相关信息,比如该内存的大小、分配该内存的应用程序的文件名称、该应用程序中分配该内存的函数的名称,以及该函数中执行分配该内存的代码的行号从内存分配记录表中删除。
本领域技术人员可以根据第二执行代码所要完成的执行操作来编写动态内存释放宏的内容(即所述第二源代码)。例如,定义的动态内存释放宏的一种具体内容可以包括动态内存释放函数的内容,以及内存信息删除函数的内容。而编写的内存信息删除函数在编译后生成的执行代码可用于将动态内存释放函数释放的内存所对应的相关信息从内存分配记录表中删除。众所周知,动态内存释放函数的传递参数为释放的内存的起始地址,因此,根据释放的内存的起始地址可以从内存分配记录表中找到具有相同的起始地址的内存的相关信息,并将之删除。
例如,在头文件中定义的动态内存释放宏(free宏)如图4所示。
图4中的free(address)即为动态内存释放宏的名称和传递的参数,而动态内存释放宏的内容为test_free(address)。
test_free(address)的源代码中可以包括动态内存释放函数以及内存信息删除函数,例如,具体的编码可以如图5所示。
其中,“free(mem)”即为动态内存释放函数的调用;“test_remove_record(mem->index)”即为内存信息删除函数用于将释放的内存所对应的相关信息从内存分配记录表中删除的函数。
事实上,在实际运行中由于从内存分配记录表中并不是按照内存的分配顺序删除内存的相关信息的;因此,长久下来会导致内存分配记录表中存在许多“漏洞”,导致内存分配记录表的资源被浪费。解决该问题的一个办法是:
在上述步骤S101根据所述第一执行代码进行动态内存分配时,还判断索引号记录表中是否记录有索引号;若有,则选择一个索引号作为该内存的索引号;否则,将所述内存分配记录表中记录的最大索引号加1后得到的索引号作为该内存的索引号。
在上述步骤S102根据所述第二执行代码进行动态内存释放时,将释放的内存的索引号记录到索引号记录表中。这样,内存分配记录表中释放的内存的索引号被记录到索引号记录表中,可以作为下次分配的内存的索引号;从而就可以填补内存分配记录表中的“漏洞”,节约内存分配记录表的资源。
也就是说,在动态内存分配宏内容中定义的函数,还增加该功能:进行动态内存分配时,判断索引号记录表中是否记录有索引号;若有,则选择一个索引号作为该内存的索引号;否则,将所述内存分配记录表中记录的最大索引号加1后得到的索引号作为该内存的索引号。比如,在上述动态内存分配宏中定义的分配内存信息记录函数中增加该功能的源代码。
在动态内存释放宏内容中定义的函数,还增加该功能:进行动态内存释放时,将释放的内存的索引号记录到索引号记录表中。比如,在上述动态内存释放宏中定义的内存信息删除函数中增加该功能的源代码。
本领域技术人员可以理解,虽然上述说明中,为便于理解,对方法的步骤采用了顺序性描述,但是应当指出,对于上述步骤的顺序并不作严格限制。
本发明实施例提供的一种内存泄漏检测装置,该装置可以安装在移动终端中;换言之,移动终端可以实现该装置。该装置的结构框图如图6所示,包括:头文件存储模块601、第一执行代码运行模块602、第二执行代码运行模块603、内存泄漏检测模块604。
第一执行代码运行模块602用于在所述应用程序运行过程中运行用于进行动态内存分配,并将该次分配的内存的相关信息记录到内存分配记录表中的第一执行代码;所述第一执行代码、是根据所述应用程序的源代码中调用的动态内存分配宏生成的。所述内存的相关信息具体包括:内存的起始地址以及内存的大小。进一步,所述内存的相关信息还包括:分配或释放该内存的应用程序的文件名称、该应用程序中分配或释放该内存的函数的名称,以及该函数中执行分配或释放该内存的代码的行号。
第二执行代码运行模块603用于在所述应用程序运行过程中运行用于进行动态内存释放,将该次释放的内存所对应的相关信息从所述内存分配记录表中删除的第二执行代码;所述第二执行代码是根据所述应用程序的源代码中调用的动态内存释放宏生成的。
内存泄漏检测模块604用于根据所述内存分配记录表中记录的内容确定是否存在内存泄漏。
进一步,所述内存泄漏检测装置还包括:头文件存储模块601。
头文件存储模块601用于存储应用程序引用的头文件,所述头文件中定了动态内存分配宏与动态内存释放宏;所述动态内存分配宏的名称与传递参数分别与动态内存分配函数的名称与传递参数相同;所述动态内存释放宏的名称与传递参数分别与动态内存释放函数的名称与传递参数相同;以及所述第一执行代码、第二执行代码分别是根据所述应用程序的源代码中调用的动态内存分配宏、动态内存释放宏生成的。具体为,在应用程序源代码的编译过程中根据源代码中调用的动态内存分配宏以及头文件中定义的动态内存分配宏生成第一执行代码;在应用程序源代码的编译过程中根据源代码中调用的动态内存释放宏以及头文件中定义的动态内存释放宏生成第二执行代码。
进一步,所述内存的相关信息还包括:该内存的索引号;以及
所述装置中的第一执行代码运行模块602还用于根据所述第一执行代码进行动态内存分配时,判断索引号记录表中是否记录有索引号;若有,则选择一个索引号作为该内存的索引号;否则,将所述内存分配记录表中记录的最大索引号加1后得到的索引号作为该内存的索引号;
第二执行代码运行模块603还用于进行动态内存释放时,将释放的内存的索引号记录到索引号记录表中。
上述的内存泄漏检测模块604具体包括如下单元之一或组合:
第一检测单元,在移动终端每次处于待机状态时,检测内存分配记录表中的内容是否与上次待机状态时的内存分配记录表中的内容相同;如果不同,则确定检测到内存泄漏;
第二检测单元,用于在所述应用程序退出运行后,比较所述应用程序运行前、运行后内存分配记录表中的内容,若比较结果为不同,则确定检测到内存泄漏。
本发明实施例由于在分配内存时将分配的内存的相关信息记录到记录表中,在释放内存时,将释放的内存所对应的相关信息从记录表中删除;从而可以检测记录表中的内容,根据记录表中的内容判断是否存在内存泄漏。该方法不需占用大量内存空间和较多的系统资源,更适于应用在移动终端上。
进一步,由于在头文件中定义了具有将分配的内存的相关信息记录到记录表的功能的动态内存分配宏,以及具有将释放的内存所对应的相关信息从记录表中删除的动态内存释放宏,而动态内存分配宏与动态内存释放宏的名称和传递参数与通常应用程序调用的动态内存分配函数与动态内存释放函数的名称和传递参数相同,所以不必更改应用程序的源代码,同时又可以实现上述的两个功能,从而利用记录表中记录的内容跟踪每个分配的内存,及时检测出内存泄漏。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读取存储介质中,如:ROM/RAM、磁碟、光盘等。
还可以理解的是,附图或实施例中所示的装置结构仅仅是示意性的,表示逻辑结构。其中作为分离部件显示的模块可能是或者可能不是物理上分开的,作为模块显示的部件可能是或者可能不是物理模块。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (12)
1、一种移动终端内存泄漏检测方法,其特征在于,包括:
在移动终端的应用程序运行过程中,若运行用于进行动态内存分配,并将该次分配的内存的相关信息记录到内存分配记录表中的第一执行代码,则根据所述第一执行代码执行相应操作;
在移动终端的应用程序运行过程中,若运行用于进行动态内存释放,将该次释放的内存所对应的相关信息从所述内存分配记录表中删除的第二执行代码,则根据所述第二执行代码执行相应操作;
根据所述内存分配记录表中记录的内容确定是否存在内存泄漏。
2、如权利要求1所述的方法,其特征在于,所述第一执行代码、第二执行代码分别是根据所述应用程序的源代码中调用的动态内存分配宏、动态内存释放宏生成的,所述动态内存分配宏与动态内存释放宏定义在所述应用程序引用的头文件中,并且所述动态内存分配宏的名称和传递参数分别与动态内存分配函数的名称和传递参数相同;所述动态内存释放宏的名称和传递参数分别与动态内存释放函数的名称和传递参数相同。
3、如权利要求2所述的方法,其特征在于,所述内存的相关信息具体包括:内存的起始地址以及内存的大小。
4、如权利要求3所述的方法,其特征在于,所述内存的相关信息还包括:分配该内存的应用程序的文件名称、该应用程序中分配该内存的函数的名称,以及该函数中执行分配该内存的代码的行号。
5、如权利要求4所述的方法,其特征在于,所述内存的相关信息还包括:该内存的索引号;以及
根据所述第一执行代码进行动态内存分配时,还包括:
判断索引号记录表中是否记录有索引号;若有,则选择一个索引号作为该内存的索引号;否则,将所述内存分配记录表中记录的最大索引号加1后得到的索引号作为该内存的索引号;以及
根据所述第二执行代码进行动态内存释放时,还包括:
将释放的内存的索引号记录到索引号记录表中。
6、如权利要求4或5所述的方法,其特征在于,所述根据所述内存分配记录表中记录的内容确定是否存在内存泄漏,具体包括:
在移动终端关机后,从移动终端中读取出内存分配记录表,并检测内存分配记录表中记录的内容,若内容不为空,则确定检测到内存泄漏;或者,
在移动终端每次处于待机状态时,检测内存分配记录表中的内容是否与上次待机状态时的内存分配记录表中的内容相同;如果不同,则确定检测到内存泄漏;或者
在所述应用程序退出运行后,比较所述应用程序运行前、运行后内存分配记录表中的内容,若比较结果为不同,则确定检测到内存泄漏。
7、如权利要求6所述的方法,其特征在于,在确定检测到内存泄漏后,还包括:
根据内存分配记录表中记录的内存的相关信息,确定出引起内存泄漏的应用程序,以及该应用程序中引起内存泄漏的函数。
8、一种移动终端内存泄漏检测装置,其特征在于,包括:
第一执行代码运行模块,用于在所述应用程序运行过程中运行用于根据所述第一执行代码进行动态内存分配,并将该次分配的内存的相关信息记录到内存分配记录表中的第一执行代码;
第二执行代码运行模块,用于在所述应用程序运行过程中运行用于根据所述第二执行代码进行动态内存释放,将该次释放的内存所对应的相关信息从所述内存分配记录表中删除的第二执行代码;
内存泄漏检测模块,用于根据所述内存分配记录表中记录的内容确定是否存在内存泄漏。
9、如权利要求8所述的装置,其特征在于,还包括:
头文件存储模块,用于存储应用程序引用的头文件,所述头文件中定了动态内存分配宏与动态内存释放宏;所述动态内存分配宏的名称与传递参数分别与动态内存分配函数的名称与传递参数相同;所述动态内存释放宏的名称与传递参数分别与动态内存释放函数的名称与传递参数相同;以及
所述第一执行代码、第二执行代码分别是根据所述应用程序的源代码中调用的动态内存分配宏、动态内存释放宏生成的。
10、如权利要求9所述的装置,其特征在于,所述内存的相关信息具体包括:内存的起始地址以及内存的大小。
11、如权利要求10所述的装置,其特征在于,所述内存的相关信息还包括:分配或释放该内存的应用程序的文件名称、该应用程序中分配或释放该内存的函数的名称,以及该函数中执行分配或释放该内存的代码的行号。
12、如权利要求11所述的装置,其特征在于,所述内存的相关信息还包括:该内存的索引号;以及
所述第一执行代码运行模块还用于根据所述第一执行代码进行动态内存分配时,判断索引号记录表中是否记录有索引号;若有,则选择一个索引号作为该内存的索引号;否则,将所述内存分配记录表中记录的最大索引号加1后得到的索引号作为该内存的索引号;
所述第二执行代码运行模块还用于进行动态内存释放时,将释放的内存的索引号记录到索引号记录表中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009101486567A CN101593152B (zh) | 2009-06-25 | 2009-06-25 | 一种移动终端内存泄漏检测方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009101486567A CN101593152B (zh) | 2009-06-25 | 2009-06-25 | 一种移动终端内存泄漏检测方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101593152A true CN101593152A (zh) | 2009-12-02 |
CN101593152B CN101593152B (zh) | 2011-07-27 |
Family
ID=41407818
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2009101486567A Expired - Fee Related CN101593152B (zh) | 2009-06-25 | 2009-06-25 | 一种移动终端内存泄漏检测方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101593152B (zh) |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102148844A (zh) * | 2010-02-09 | 2011-08-10 | 深圳市金蝶中间件有限公司 | 定位内存泄漏的方法、服务器端、客户端和系统 |
CN101763305B (zh) * | 2009-12-29 | 2011-12-14 | 青岛海信宽带多媒体技术有限公司 | 一种嵌入式系统内存泄露的检测方法 |
CN102375776A (zh) * | 2010-08-18 | 2012-03-14 | 康佳集团股份有限公司 | 一种嵌入式设备及其检测和定位内存泄漏的方法 |
CN102831068A (zh) * | 2011-06-13 | 2012-12-19 | 阿里巴巴集团控股有限公司 | 一种内存操作记录的处理方法及装置 |
CN103473172A (zh) * | 2013-09-05 | 2013-12-25 | 无敌科技(西安)有限公司 | 检查后台程序内存泄露并定位泄露内存点的系统及方法 |
CN104216824A (zh) * | 2013-06-04 | 2014-12-17 | 北京千橡网景科技发展有限公司 | 用于测试移动终端的测试方法及测试系统 |
CN104778087A (zh) * | 2014-01-09 | 2015-07-15 | 中国移动通信集团山东有限公司 | 一种信息处理方法以及信息处理装置 |
CN105988823A (zh) * | 2015-01-27 | 2016-10-05 | 阿里巴巴集团控股有限公司 | 终端中应用启动时的内存分配方法及其系统 |
CN106933733A (zh) * | 2015-12-30 | 2017-07-07 | 华为技术有限公司 | 一种确定内存泄露位置的方法和装置 |
CN107277226A (zh) * | 2017-05-11 | 2017-10-20 | 珠海金山网络游戏科技有限公司 | 一种获取手机应用内存快照和内存分配堆栈的方法及装置 |
CN107688497A (zh) * | 2017-07-25 | 2018-02-13 | 努比亚技术有限公司 | 一种内存调控方法、设备及计算机可读存储介质 |
CN108664394A (zh) * | 2018-04-10 | 2018-10-16 | 北京奇安信科技有限公司 | 一种内存泄露过程追溯方法及装置 |
CN108664390A (zh) * | 2017-03-31 | 2018-10-16 | 华为技术有限公司 | 一种内存泄露检测方法及设备 |
CN110659194A (zh) * | 2018-06-28 | 2020-01-07 | 中兴通讯股份有限公司 | 一种动态内存检测的方法、装置及存储介质 |
CN110888822A (zh) * | 2019-12-03 | 2020-03-17 | 北京小米智能科技有限公司 | 内存处理方法、装置及存储介质 |
-
2009
- 2009-06-25 CN CN2009101486567A patent/CN101593152B/zh not_active Expired - Fee Related
Cited By (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101763305B (zh) * | 2009-12-29 | 2011-12-14 | 青岛海信宽带多媒体技术有限公司 | 一种嵌入式系统内存泄露的检测方法 |
CN102148844A (zh) * | 2010-02-09 | 2011-08-10 | 深圳市金蝶中间件有限公司 | 定位内存泄漏的方法、服务器端、客户端和系统 |
CN102148844B (zh) * | 2010-02-09 | 2014-08-27 | 深圳市金蝶中间件有限公司 | 定位内存泄漏的方法、服务器端、客户端和系统 |
CN102375776A (zh) * | 2010-08-18 | 2012-03-14 | 康佳集团股份有限公司 | 一种嵌入式设备及其检测和定位内存泄漏的方法 |
CN102831068A (zh) * | 2011-06-13 | 2012-12-19 | 阿里巴巴集团控股有限公司 | 一种内存操作记录的处理方法及装置 |
CN102831068B (zh) * | 2011-06-13 | 2016-04-06 | 阿里巴巴集团控股有限公司 | 一种内存操作记录的处理方法及装置 |
CN104216824A (zh) * | 2013-06-04 | 2014-12-17 | 北京千橡网景科技发展有限公司 | 用于测试移动终端的测试方法及测试系统 |
CN103473172A (zh) * | 2013-09-05 | 2013-12-25 | 无敌科技(西安)有限公司 | 检查后台程序内存泄露并定位泄露内存点的系统及方法 |
CN104778087A (zh) * | 2014-01-09 | 2015-07-15 | 中国移动通信集团山东有限公司 | 一种信息处理方法以及信息处理装置 |
CN105988823B (zh) * | 2015-01-27 | 2019-10-22 | 阿里巴巴集团控股有限公司 | 终端中应用启动时的内存分配方法及其系统 |
CN105988823A (zh) * | 2015-01-27 | 2016-10-05 | 阿里巴巴集团控股有限公司 | 终端中应用启动时的内存分配方法及其系统 |
CN106933733A (zh) * | 2015-12-30 | 2017-07-07 | 华为技术有限公司 | 一种确定内存泄露位置的方法和装置 |
CN106933733B (zh) * | 2015-12-30 | 2020-03-10 | 华为技术有限公司 | 一种确定内存泄露位置的方法和装置 |
CN108664390A (zh) * | 2017-03-31 | 2018-10-16 | 华为技术有限公司 | 一种内存泄露检测方法及设备 |
CN108664390B (zh) * | 2017-03-31 | 2021-10-01 | 华为技术有限公司 | 一种内存泄露检测方法及设备 |
CN107277226A (zh) * | 2017-05-11 | 2017-10-20 | 珠海金山网络游戏科技有限公司 | 一种获取手机应用内存快照和内存分配堆栈的方法及装置 |
CN107688497A (zh) * | 2017-07-25 | 2018-02-13 | 努比亚技术有限公司 | 一种内存调控方法、设备及计算机可读存储介质 |
CN107688497B (zh) * | 2017-07-25 | 2021-09-14 | 努比亚技术有限公司 | 一种内存调控方法、设备及计算机可读存储介质 |
CN108664394A (zh) * | 2018-04-10 | 2018-10-16 | 北京奇安信科技有限公司 | 一种内存泄露过程追溯方法及装置 |
CN110659194A (zh) * | 2018-06-28 | 2020-01-07 | 中兴通讯股份有限公司 | 一种动态内存检测的方法、装置及存储介质 |
CN110888822A (zh) * | 2019-12-03 | 2020-03-17 | 北京小米智能科技有限公司 | 内存处理方法、装置及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN101593152B (zh) | 2011-07-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101593152B (zh) | 一种移动终端内存泄漏检测方法及装置 | |
US7900011B2 (en) | Apparatus, system, and method for improving system performance in a large memory heap environment | |
CN101599046B (zh) | 一种内存检测方法及装置 | |
US6523141B1 (en) | Method and apparatus for post-mortem kernel memory leak detection | |
CN102117240B (zh) | 一种获取进程阻塞信息的方法及装置 | |
US20020073402A1 (en) | Method for inserting global breakpoints | |
JP2009032252A (ja) | クラッシュダンプ用のメモリアロケーション | |
CN101221536A (zh) | 嵌入式系统的内存管理方法及装置 | |
JP2009525555A (ja) | 装置の非アクティブな期間の間、dramの未使用部分のリフレッシュを動作不能にすることによって電力消費量を低減すること | |
Zhou et al. | I/O characteristics of smartphone applications and their implications for eMMC design | |
WO2015065449A1 (en) | Cache controller for non-volatile memory | |
CN110413521A (zh) | 一种堆内存的写越界检测方法和装置 | |
CN115080455B (zh) | 一种计算机芯片、计算机板卡、存储空间分配方法及装置 | |
US20220075523A1 (en) | Flash memory local purge | |
US10241895B2 (en) | Memory stack trace management tool | |
CN100392606C (zh) | 一种定位虚拟操作系统内存泄漏的方法 | |
US20100005265A1 (en) | Method for isolating objects in memory region | |
CN102541969A (zh) | 基于fat文件系统的文件保护方法、系统及存储器 | |
KR20110002742A (ko) | 메모리 회로 및 메모리 회로의 엑세스 방법, 메모리 관리 시스템 및 메모리 관리방법 | |
CN102053868A (zh) | 一种内存泄露检测方法和装置 | |
CN113434470B (zh) | 数据分布方法、装置及电子设备 | |
CN104951370A (zh) | 一种内存管理方法及装置 | |
CN102799523B (zh) | 动态探测程序执行路径的方法、装置和计算机系统 | |
CN102622242A (zh) | 一种加快电子设备开机速度的方法及电子设备 | |
US10417121B1 (en) | Monitoring memory usage in computing devices |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20110727 Termination date: 20200625 |