检测内存泄漏的方法和装置制造方法及图纸

技术编号:13928094 阅读:83 留言:0更新日期:2016-10-28 11:01
本发明专利技术实施例公开了一种检测内存泄漏的方法和装置。本发明专利技术实施例方法包括:创建第一数据结构;获取预置对象的内存地址,将所述预置对象的存储地址和堆栈信息存储到所述第一数据结构中;获取指针变量集合,所述指针变量集合包括内存空间中的所有指针变量;检测所述第一数据结构中是否存在不被所述指针变量集合中的任一指针变量指向的内存地址;若存在,则确定内存泄漏,并确定所述内存地址中的对象为泄漏对象。

【技术实现步骤摘要】

本专利技术涉及计算机领域,特别是一种检测内存泄漏的方法和装置
技术介绍
内存泄漏,也称作“存储渗漏”,指的是用动态存储分配函数动态开辟的空间在使用完毕后未释放,导致对象一直占据该内存单元的现象。现有的ios系统中采用leak内存泄漏检测工具来检测手机中的内存泄漏,但苹果公司并没有对外开放该工具的原理,该工具是一个在mac电脑上的软件,因此每一次手机检测内存泄漏时,都需要将手机连接到电脑才可以使用。这导致手机APP无法独立检测内存泄漏。
技术实现思路
本专利技术实施例提供了一种检测内存泄漏的方法和装置,能够不依靠外界设备独立检测内存泄漏。第一专利技术,本专利技术实施例提供一种检测内存泄漏的方法,包括:创建第一数据结构;获取预置对象的内存地址,将所述预置对象的存储地址和堆栈信息存储到所述第一数据结构中;获取指针变量集合,所述指针变量集合包括内存空间中的所有指针变量;检测所述第一数据结构中是否存在不被所述指针变量集合中的任一指针变量指向的内存地址;若存在,则确定内存泄漏,并确定所述内存地址中的对象为泄漏对象。第二方面,本专利技术实施例提供一种检测内存泄漏的装置,包括:创建模块,用于创建第一数据结构;第一获取模块,用于获取预置对象的内存地址,将所述预置对象的存储地址和堆栈信息存储到所述第一数据结构中;第二获取模块,用于获取指针变量集合,所述指针变量集合包括内存空间中的所有指针变量;检测模块,用于检测所述第一数据结构中是否存在不被所述指针变量集合中的任一指针变量指向的内存地址;确定模块,用于当所述第一数据结构中存在不被所述指针变量集合中的任一指针变量指向的内存地址时,确定内存泄漏,并确定所述内存地址中的对象为泄漏对象。从以上技术方案可以看出,本专利技术实施例具有以下优点:本专利技术实施例中,记录对象的内存地址,并创建第一数据结构来存储这些信息,通过分析所有包含指针变量的内存区域中的指针变量,对于没有指针变量指向的对象,可认为在进程空间中无引用的对象,因此,当第一数据结构中存在没有指针变量指向的对象时,确定该对象为泄漏对象,这样,通过本专利技术中的检测内存泄漏方法移动终端可以独立检测内存泄漏而无需依赖其他工具。附图说明图1为本专利技术的检测内存泄漏的方法的一个实施例的流程示意图;图2为本专利技术的检测内存泄漏的方法中的获取指针变量集合的方法的一种实施例的流程示意图;图3为本专利技术的检测内存泄漏的方法中的获取指针变量集合的方法的另一种实施例的流程示意图;图4为本专利技术的检测内存泄漏的方法中的确认泄漏对象的方法的一种实施例的流程示意图;图5为本专利技术的检测内存泄漏的装置的一个实施例的结构示意图;图6为本专利技术的检测内存泄漏的装置的另一个实施例的结构示意图。具体实施方式请参阅图1,图1为本专利技术的检测内存泄漏的方法的一个实施例的流程示意图。本实施例中,检测内存泄漏的方法,包括:101、创建第一数据结构。本实施例中,第一数据结构用于存储步骤102中所获取的预置对象的内存地址。例如,该第一数据接口为哈希表、红黑树或者链表,在此不作限制。优选的,该第一数据结构为哈希表,相比其他数据结构,哈希表的效率较高。102、获取预置对象的内存地址,将所述预置内存对象的内存地址和堆栈信息存储到所述第一数据结构中。本实施例中,预置对象为已经分配了内存地址且为需要监控的对象。例如,该预置对象为所有内存区中分配好内存地址的对象。或者,该预置内存对象为objective-c类对象、malloc分配的内存区域、block代码块和C++对象中的至少一项。当然,上述仅为举例,并不作限制。确定预置对象后,获取该预置对象的内存地址。其中,获取的方法有多种。例如,ios系统中通过malloc_zone_malloc、malloc_zone_valloc和malloc_zone_calloc该三个函数来分配堆内存,本实施例中,通过hook该三个函数,在自定义的函数中记录预置对象的内存地址。可选的,本实施例中,还获取该预置对象的内存大小、堆栈信息、类名(若该预置对象有类名)等等。其中,可根据线程堆栈回溯方法获取该预置对象的分配堆栈。获取到预置对象的内存地址后,该预置对象的内存地址存储到第一数据结构中。例如,以该预置对象的内存地址为key值存储到全局哈希表中。103、获取指针变量集合,所述指针变量集合包括内存空间中的所有指针变量。获取指针变量集合的方法有多种。例如,对目标区域进行扫描,其中,该目标区域为包含所有指针变量的内存区域。例如,在ios进程虚拟内存空间中,该目标区域包括堆内存、栈内存、全局数据区和寄存器该四个内存区域。又例如,对目标区域进行扫描,查找第一指针变量集合,将所述第一指针变量集合加入所述指针变量集合中,其中,所述目标区域包括栈内存、全局数据区和寄存器,所述第一指针变量集合为所述目标区域内的所有指针变量。确定第一指针变量集合后,遍历所述第一指针变量集合,对所述第一指针变量集合中的每一个特定指针变量,所述特定指针变量为指向堆内存中任意一个区域的指针变量,执行步骤A:对所述特定指针变量指向的区域进行扫描;将所述区域中的所有指针变量加入所述指针变量集合中;当所述所有指针变量中存在所述特定指针变量,且所述特定指针变量不是指向自身所在区域时,对所述特定指针变量重复所述步骤A,当所述所有指针变量中不存在不是指向自身所在区域的特定指针变量时,停止重复所述步骤A。104、检测所述第一数据结构中是否存在不被所述指针变量集合中的任一指针变量指向的内存地址。对于指针变量集合中的任意一个指针变量,确认该指针变量所指向的内存地址是否存在第一数据结构中。这样,可以确认指针变量集合所指向的第一数据结构中的所有内存地址。具体的,对指针变量集合中的任意一个指针变量,若该指针变量指向第一数据结构中的其中一个内存地址,则对该内存地址进行标识,那么对指针变量集合遍历完后,第一数据结构中没有被标识的内存地址为不被指针变量集合中任一指针变量指向的内存地址。105、若存在,则确定内存泄漏,并确定所述内存地址中的对象为泄漏对象。本实施例中,记录对象的内存地址,并创建第一数据结构来存储这些信息,通过分析所有包含指针变量的内存区域中的指针变量,对于没有指针变量指向的对象,可认为在进程空间中无引用的对象,因此,当第一数据结构中存在没有指针变量指向的对象时,确定该对象为泄漏对象,这样,通过本专利技术中的检测内存泄漏方法移动终端可以独立检测内存泄漏而无需依赖其他工具。可选的,本实施例中,当检测到所述第一数据结构中的对象被释放时,如将所述对象的分配地址和堆栈信息从所述第一数据结构中删除。这样可以保证在第一数据结构中存储的为当前进程的驻留内存对象。其中,检测的方法有多种,例如,ios系统中通过malloc_zone_freec函数来释放内存对象,本实施例中,通过hook该函数,在自定义的函数中确定所释放的对象是否在第一数据结构中。为方便理解,下面结合图2和图3对本实施例中步骤103的一种实施方式以及结合图4对本实施例中的步骤104的一种实施方式进行举例描述。如图2所示,图2为本专利技术的检测内存泄漏的方法中的获取指针变量集合的方法的一种实施例的流程示意图。本实施例中,获取指针变量集合的方法包括:建立扫描线程,并在扫描线程开始前挂起除扫描线程以外的其他所本文档来自技高网...

【技术保护点】
一种检测内存泄漏的方法,其特征在于,包括:创建第一数据结构;获取预置对象的内存地址,将所述预置对象的存储地址和堆栈信息存储到所述第一数据结构中;获取指针变量集合,所述指针变量集合包括内存空间中的所有指针变量;检测所述第一数据结构中是否存在不被所述指针变量集合中的任一指针变量指向的内存地址;若存在,则确定内存泄漏,并确定所述内存地址中的对象为泄漏对象。

【技术特征摘要】
1.一种检测内存泄漏的方法,其特征在于,包括:创建第一数据结构;获取预置对象的内存地址,将所述预置对象的存储地址和堆栈信息存储到所述第一数据结构中;获取指针变量集合,所述指针变量集合包括内存空间中的所有指针变量;检测所述第一数据结构中是否存在不被所述指针变量集合中的任一指针变量指向的内存地址;若存在,则确定内存泄漏,并确定所述内存地址中的对象为泄漏对象。2.根据权利要求1所述的检测内存泄漏的方法,其特征在于,当检测到所述第一数据结构中的对象被释放时,将所述对象的分配地址和堆栈信息从所述第一数据结构中删除。3.根据权利要求1所述的检测内存泄漏的方法,其特征在于,所述预置对象为objective-c类对象、malloc分配的内存区域、block代码块和C++对象中的至少一项。4.据权利要求1所述的检测内存泄漏的方法,其特征在于,所述检测内存泄漏的方法还包括:获取所述预置对象的堆栈信息和/或类名;所述确定泄漏对象,之后还包括:将所述泄漏对象的分配地址、堆栈信息和/或类名发送至预置分析平台,以便所述预置分析平台根据所述泄漏对象的分配地址和堆栈信息对泄漏源进行定位。5.根据权利要求1所述的检测内存泄漏的方法,其特征在于,所述获取指针变量集合,包括:对目标区域进行扫描,查找出所述目标区域内的所有指针变量,其中,所述目标区域包括堆内存、栈内存、全局数据区和寄存器。6.根据权利要求1所述的检测内存泄漏的方法,其特征在于,所述获取指针变量集合,包括:对目标区域进行扫描,查找第一指针变量集合,将所述第一指针变量集合加入所述指针变量集合中,其中,所述第一指针变量集合为所述目标区域内的所有指针变量,所述目标区域包括栈内存、全局数据区和寄存器;遍历所述第一指针变量集合,对所述第一指针变量集合中的每一个特定指针变量,所述特定指针变量为指向堆内存中任意一个区域的指针变量,执行步骤A:对所述特定指针变量指向的区域进行扫描;将所述所有指针变量加入所述指针变量集合中;当所述所有指针变量中存在所述特定指针变量,且所述特定指针变量不是指向所在区域时,对所述特定指针变量重复所述步骤A,当所述所有指针变量中不存在不是指向所在区域的特定指针变量时,停止重复所述步骤A。7.根据权利要求5或6所述的检测内存泄漏的方法,其特征在于,所述对目标区域进行扫描,包括:建立扫描线程并挂起除所述扫描线程以外的所有线程。8.一种检测内存泄漏的装置,其特征在于,包括:创建模块,用于创建第一数据结构;第一获取模块,用于获取预置对象的内存地址,...

【专利技术属性】
技术研发人员:罗鑫
申请(专利权)人:腾讯科技深圳有限公司
类型:发明
国别省市:广东;44

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

1