CN108182146B - 一种内存泄漏的检测方法及系统 - Google Patents

一种内存泄漏的检测方法及系统 Download PDF

Info

Publication number
CN108182146B
CN108182146B CN201711441958.4A CN201711441958A CN108182146B CN 108182146 B CN108182146 B CN 108182146B CN 201711441958 A CN201711441958 A CN 201711441958A CN 108182146 B CN108182146 B CN 108182146B
Authority
CN
China
Prior art keywords
class
detected
detection
counting variable
new
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
Application number
CN201711441958.4A
Other languages
English (en)
Other versions
CN108182146A (zh
Inventor
刘晓丹
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing QIYI Century Science and Technology Co Ltd
Original Assignee
Beijing QIYI Century Science and Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing QIYI Century Science and Technology Co Ltd filed Critical Beijing QIYI Century Science and Technology Co Ltd
Priority to CN201711441958.4A priority Critical patent/CN108182146B/zh
Publication of CN108182146A publication Critical patent/CN108182146A/zh
Application granted granted Critical
Publication of CN108182146B publication Critical patent/CN108182146B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3644Software debugging by instrumenting at runtime
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种内存泄漏的检测方法及系统,在应用程序启动时,创建一个用于内存泄漏检测的检测类,并将新增内存泄漏检测功能的新创建方法替换之前的创建方法,将新增内存泄漏检测功能的新释放方法替换之前的释放方法;在应用程序运行期间,当检测类监听到当前待检测类调用新创建方法时,控制与当前待检测类相对应的计数变量执行一次加一操作,当监听到当前待检测类调用新释放方法时,控制该计数变量执行一次减一操作,当应用程序运行结束,控制检测类结束监听,并创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入内存泄漏检测结果文件。本发明实现了内存泄漏自动检测,解决了现有检测方法存在的问题。

Description

一种内存泄漏的检测方法及系统
技术领域
本发明涉及内存泄漏检测技术领域,更具体的说,涉及一种内存泄漏的检测方法及系统。
背景技术
随着互联网技术的不断发展,移动终端在硬件和软件方面相较前几年都有了质的飞跃。移动终端运行内存的增大提高了软件的性能,使得应用市场越来越繁荣,单体应用规模不断增大,同时也带来了内存泄漏问题等等。
目前,使用应用开发环境提供的内存泄漏检测工具进行内存泄漏检测。然而,现有的内存泄漏检测需要安排专门的测试人员进行专项测试,因此,存在操作复杂,检测效率低,容易漏检等问题。
发明内容
有鉴于此,本发明公开一种内存泄漏的检测方法及系统,以解决现有内存泄漏检测方法存在的操作复杂,检测效率低,容易漏检等问题。
一种内存泄漏的检测方法,包括:
在应用程序启动时,创建一个用于内存泄漏检测的检测类,所述检测类的类型为开发语言提供的基类的一个扩展;
将所述基类的创建方法替换成预先创建的新创建方法,将所述基类的释放方法替换成预先创建的新释放方法,其中,所述新创建方法具有内存泄漏检测功能以及所述创建方法原有的分配内存功能,所述新释放方法具有内存泄漏检测功能以及所述释放方法原有的释放内存功能;
在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,控制预先存储的与所述当前待检测类相对应的计数变量执行一次加一操作,其中,所述计数变量用于记录所述新创建方法和所述新释放方法的调用次数;
当所述检测类监听到所述当前待检测类调用所述新释放方法时,控制所述计数变量执行一次减一操作;
当所述应用程序运行结束时,控制所述检测类结束监听操作,并创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入所述内存泄漏检测结果文件中。
优选的,在所述应用程序使用之前,还包括:
创建内存泄漏检测计数器,所述内存泄漏检测计数器内存储有与所述应用程序的各个待检测类相对应的计数变量。
优选的,在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,控制预先存储的与所述当前待检测类相对应的计数变量执行一次加一操作,具体包括:
在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,判断当前是否存储有所述计数变量;
如果没有所述计数变量,则创建所述计数变量,所述计数变量的初始值为0,并控制所述计数变量执行一次加一操作;
如果有所述计数变量,则控制所述计数变量执行一次加一操作。
优选的,在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,判断当前是否存储有所述计数变量,具体包括:
在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,判断所述当前待检测类是否存储于预设文件中,所述预设文件中存储有根据测试需求,需要进行内存泄漏检测的类的类名;
如果所述当前待检测类存储于所述预设文件中,则继续判断当前是否存储有所述计数变量。
优选的,当所述检测类监听到所述当前待检测类调用所述新释放方法时,控制所述计数变量执行一次减一操作,具体包括:
当所述检测类监听到所述当前待检测类调用所述新释放方法时,判断当前是否存储有所述计数变量;
如果没有所述计数变量,则创建所述计数变量,所述计数变量的初始值为0,并控制所述计数变量执行一次减一操作;
如果有所述计数变量,则控制所述计数变量执行一次减一操作。
优选的,当所述检测类监听到所述当前待检测类调用所述新释放方法时,判断当前是否存储有所述计数变量,具体包括:
当所述检测类监听到所述当前待检测类调用所述新释放方法时,判断所述当前待检测类是否存储于预设文件中,所述预设文件中存储有根据测试需求,需要进行内存泄漏检测的类的类名;
如果所述当前待检测类存储于所述预设文件中,则继续判断当前是否存储有所述计数变量。
优选的,在创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入所述内存泄漏检测结果文件中之后,还包括:
生成内存泄漏检测结果文档。
一种内存泄漏的检测系统,包括:
第一创建单元,用于在应用程序启动时,创建一个用于内存泄漏检测的检测类,所述检测类的类型为开发语言提供的基类的一个扩展;
替换单元,用于将所述基类的创建方法替换成预先创建的新创建方法,将所述基类的释放方法替换成预先创建的新释放方法,其中,所述新创建方法具有内存泄漏检测功能以及所述创建方法原有的分配内存功能,所述新释放方法具有内存泄漏检测功能以及所述释放方法原有的释放内存功能;
第一控制单元,用于在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,控制预先存储的与所述当前待检测类相对应的计数变量执行一次加一操作,其中,所述计数变量用于记录所述新创建方法和所述新释放方法的调用次数;
第二控制单元,用于当所述检测类监听到所述当前待检测类调用所述新释放方法时,控制所述计数变量执行一次减一操作;
第二创建单元,用于当所述应用程序运行结束时,控制所述检测类结束监听操作,并创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入所述内存泄漏检测结果文件中。
优选的,还包括:
第三创建单元,用于在所述应用程序使用之前,创建内存泄漏检测计数器,所述内存泄漏检测计数器内存储有与所述应用程序的各个待检测类相对应的计数变量。
优选的,所述第一控制单元具体包括:
第一判断子单元,用于在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,判断当前是否存储有所述计数变量;
第一创建子单元,用于在所述第一判断单元判断为否的情况下,创建所述计数变量,所述计数变量的初始值为0,并控制所述计数变量执行一次加一操作;
第一控制子单元,用于在所述第一判断子单元判断为是的情况下,控制所述计数变量执行一次加一操作。
优选的,所述第一判断子单元具体用于:
在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,判断所述当前待检测类是否存储于预设文件中,所述预设文件中存储有根据测试需求,需要进行内存泄漏检测的类的类名;
如果所述当前待检测类存储于所述预设文件中,则继续判断当前是否存储有所述计数变量。
优选的,所述第二控制单元具体包括:
第二判断子单元,用于当所述检测类监听到所述当前待检测类调用所述新释放方法时,判断当前是否存储有所述计数变量;
第二创建子单元,用于在所述第二判断子单元判断为否的情况下,创建所述计数变量,所述计数变量的初始值为0,并控制所述计数变量执行一次减一操作;
第二控制子单元,用于在所述第二判断子单元判断为是的情况下,控制所述计数变量执行一次减一操作。
优选的,所述第二判断子单元具体用于:
当所述检测类监听到所述当前待检测类调用所述新释放方法时,判断所述当前待检测类是否存储于预设文件中,所述预设文件中存储有根据测试需求,需要进行内存泄漏检测的类的类名;
如果所述当前待检测类存储于所述预设文件中,则继续判断当前是否存储有所述计数变量。
优选的,还包括:
生成单元,用于在所述第二创建单元创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入所述内存泄漏检测结果文件中之后,生成内存泄漏检测结果文档。
从上述的技术方案可知,本发明公开了一种内存泄漏的检测方法及系统,在应用程序启动时,会自动创建一个用于内存泄漏检测的检测类,并将新增内存泄漏检测功能的新创建方法替换之前的创建方法,将新增内存泄漏检测功能的新释放方法替换之前的释放方法;在应用程序运行期间,当检测类监听到当前待检测类调用新创建方法时,控制与当前待检测类相对应的计数变量执行一次加一操作,当检测类监听到当前待检测类调用新释放方法时,控制该计数变量执行一次减一操作,当应用程序运行结束时,控制检测类结束监听操作,并创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入内存泄漏检测结果文件中。由于在移动终端内存正常时,同一个待检测类会执行一次调用创建方法操作和一次调用释放方法操作,也即,当内存正常时,待检测类对应的计数变量为0。因此,当某一个待检测类相对应的计数变量不为0时,表明当前内存存在泄漏,相关人员通过查看写入内存泄漏检测结果文件中类的类名,即可获知存在内存泄漏的类。相对于现有检测方法而言,本发明在应用程序启动后,就可以自动进行内存泄漏检测,无需人工干预,因此有效解决现有检测方法存在的操作复杂,检测效率低,容易漏检等问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据公开的附图获得其他的附图。
图1为本发明实施例公开的一种内存泄漏检测方法的流程图;
图2为本发明实施例公开的一种内存泄漏检测方法的时序图;
图3为本发明实施例公开的一种内存泄漏检测系统的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例公开了一种内存泄漏的检测方法及系统,以解决现有检测方法存在的操作复杂,检测效率低,容易漏检等问题。
参见图1,本发明一实施例公开的一种内存泄漏检测方法的流程图,该内存泄漏检测方法主要应用于移动终端,比如手机,该检测方法包括步骤:
步骤S101、在应用程序启动时,创建一个用于内存泄漏检测的检测类;
其中,所述检测类的类型为开发语言提供的基类的一个扩展。
具体的,当应用程序启动时,可利用IOS(苹果公司的移动操作系统)开发语言(Objective-c)提供的类的分类原理,创建一个用于内存泄漏检测的检测类,所述检测类的类型是所述IOS开发语言提供的基类(NSObject)的一个扩展。
基类(NSObject)是IOS开发语言Objective-C类继承体系的根类。这个类遵循NSObject协议,提供了一些通用的方法,对象通过继承NSObject可以从其中继承这些通用方法,也可以通过复写修改这些通用方法的实现,并让对象具备Objective-C对象的基本能力。
步骤S102、将所述基类的创建方法替换成预先创建的新创建方法,将所述基类的释放方法替换成预先创建的新释放方法;
其中,所述新创建方法具有内存泄漏检测功能以及所述创建方法原有的分配内存功能,也就是说,新创建方法所具有的功能为:在传统创建方法原有的分配内存功能的基础上,新增加了内存泄漏检测功能;所述新释放方法具有内存泄漏检测功能以及所述释放方法原有的释放内存功能,也就是说,新释放方法具有的功能为:在传统释放方法原有的释放内存功能的基础上,新增加了内存泄漏检测功能。
具体的,在实际应用中,可以利用系统编程接口中提供的‘void
method_exchangeImplementations(Method_Nonnull m1,Method_Nonnull m2)’方法,将所述基类的创建方法替换成预先创建的新创建方法,将所述基类的释放方法替换成预先创建的新释放方法。之后,应用程序任何类调用新创建方法分配内存和调用新释放方法释放内存时,都将调用新创建方法分配内存和调用新释放方法释放内存。
其中,void
method_exchangeImplementations(Method_Nonnull m1,Method_Nonnull m2)’方法可以理解为:在应用程序运行期间,动态的使创建方法和新创建方法互换实现,释放方法和新释放方法互换实现。
步骤S103、在应用程序运行期间,当检测类监听到当前待检测类调用新创建方法时,控制预先存储的与当前待检测类相对应的计数变量执行一次加一操作;
其中,所述计数变量用于记录所述新创建方法和所述新释放方法的调用次数。
步骤S104、当所述检测类监听到所述当前待检测类调用所述新释放方法时,控制所述计数变量执行一次减一操作;
需要说明的是,在实际应用中,步骤S103和步骤S104的执行顺序并不限于本实施例公开的顺序,也可以先执行步骤S104,后执行步骤S103。
步骤S105、当应用程序运行结束时,控制检测类结束监听操作,并创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入内存泄漏检测结果文件中。
需要说明的是,当移动终端内存正常,也即内存不存在泄漏时,同一个待检测类会执行一次调用创建方法操作和一次调用释放方法操作,也即,当内存正常时,待检测类对应的计数变量为0;反之,当待检测类对应的计数变量不为0时,表明内存存在泄漏。
综上可知,本发明公开的内存泄漏的检测方法,在应用程序启动时,会自动创建一个用于内存泄漏检测的检测类,并将新增内存泄漏检测功能的新创建方法替换之前的创建方法,将新增内存泄漏检测功能的新释放方法替换之前的释放方法;在应用程序运行期间,当检测类监听到当前待检测类调用新创建方法时,控制与当前待检测类相对应的计数变量执行一次加一操作,当检测类监听到当前待检测类调用新释放方法时,控制该计数变量执行一次减一操作,当应用程序运行结束时,控制检测类结束监听操作,并创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入内存泄漏检测结果文件中。由于在移动终端内存正常时,同一个待检测类会执行一次调用创建方法操作和一次调用释放方法操作,也即,当内存正常时,待检测类对应的计数变量为0。因此,当某一个待检测类相对应的计数变量不为0时,表明当前内存存在泄漏,相关人员通过查看写入内存泄漏检测结果文件中类的类名,即可获知存在内存泄漏的类。相对于现有检测方法而言,本发明在应用程序启动后,就可以自动进行内存泄漏检测,无需人工干预,因此有效解决现有检测方法存在的操作复杂,检测效率低,容易漏检等问题。
需要说明的是,上述实施例中,在创建检测类后,首先需要初始化该检测类,然后利用初始化后的检测类对应用程序的各待检测类是否调用新创建方法和新释放方法进行监听。
为方便相关人员查看出现内存泄漏的类,在图1所示实施例的基础上,在步骤S105之后,检测方法还包括:
生成内存泄漏检测结果文档。这样,相关人员通过查看该结果文档,即可获取出现内存泄漏的类。
为方便理解本实施例,参见图2,本发明还公开了一个与本实施例相对应的时序图,当用户启动应用后,创建一个用于内存泄漏检测的检测类;初始化该检测类,利用初始化后的检测类对应用程序的各待检测类是否调用新创建方法和新释放方法进行监听(其中,上述步骤S102中的内容图2中未示出);在应用程序使用期间,当检测类监听到当前待检测类调用新创建方法时,控制预先存储的与当前待检测类相对应的计数变量执行一次加一操作;当所述检测类监听到所述当前待检测类调用所述新释放方法时,控制所述计数变量执行一次减一操作;当应用程序运行结束时,控制检测类结束监听操作,统计结果,统计结果具体包括:创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入内存泄漏检测结果文件中,并生成内存泄漏检测结果文档。
综上可知,由于在移动终端内存正常时,同一个待检测类会执行一次调用创建方法操作和一次调用释放方法操作,也即,当内存正常时,待检测类对应的计数变量为0。因此,当某一个待检测类相对应的计数变量不为0时,表明当前内存存在泄漏,相关人员通过查看写入内存泄漏检测结果文件中类的类名,即可获知存在内存泄漏的类。相对于现有检测方法而言,本发明在应用程序启动后,就可以自动进行内存泄漏检测,无需人工干预,因此有效解决现有检测方法存在的操作复杂,检测效率低,容易漏检等问题。
为进一步优化上述实施例,在步骤S103之前,也即在应用程序使用之前,还包括:
创建内存泄漏检测计数器,所述内存泄漏检测计数器内存储有与所述应用程序的各个待检测类相对应的计数变量。
综上,通过查看各个待检测类相对应的计数变量是否为0,即可确定该应用程序是否出现内存泄漏,从而实现在应用程序启动后,进行内存泄漏的自动检测。
为进一步优化上述实施例,步骤S103具体包括:
在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,判断当前是否存储有所述计数变量;
如果没有所述计数变量,则创建所述计数变量,所述计数变量的初始值为0,并控制所述计数变量执行一次加一操作;
如果有所述计数变量,则控制所述计数变量执行一次加一操作。
相应的,步骤S104具体包括:
当所述检测类监听到所述当前待检测类调用所述新释放方法时,判断当前是否存储有所述计数变量;
如果没有所述计数变量,则创建所述计数变量,所述计数变量的初始值为0,并控制所述计数变量执行一次减一操作;
如果有所述计数变量,则控制所述计数变量执行一次减一操作。
综上可知,本发明通过判断与待检测类对应的计数变量是否为0,来确定移动终端是否出现内存泄漏,并在计数变量不为0时,判定移动终端出现内存泄漏。因此计数变量是判断移动终端是否出现内存泄漏的关键变量,当检测类监听到当前待检测类调用新创建方法或新释放方法时,若判定当前未存储与当前待检测类对应的计数变量,则需要先创建该计数变量,然后再对当前待检测类进行监听,以为后续判断移动终端是否出现内存泄漏提供判断依据。
本领域技术人员知晓,现有内存泄漏检测方法无法根据定制检测需求进行内存泄漏检测,因此内存泄漏检测的针对性不强。
为提高内存泄漏检测的针对性,本发明对上述实施例进行了优化,上述实施例中的步骤S103具体包括:
在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,判断所述当前待检测类是否存储于预设文件中,所述预设文件中存储有根据测试需求,需要进行内存泄漏检测的类的类名;
如果所述当前待检测类存储于所述预设文件中,则继续判断当前是否存储有所述计数变量;
如果没有所述计数变量,则创建所述计数变量,所述计数变量的初始值为0,并控制所述计数变量执行一次加一操作;
如果有所述计数变量,则控制所述计数变量执行一次加一操作。
需要说明的是,如果当前待检测类未存储于预设文件中,表明当前待检测类并不是根据测试需求,需要进行内存泄漏检测的类,在这种情况下,结束新创建方法的执行。
相应的,为提高内存泄漏检测的针对性,本发明对上述实施例进行了优化,上述实施例中的步骤S104具体包括:
当所述检测类监听到所述当前待检测类调用所述新释放方法时,判断所述当前待检测类是否存储于预设文件中,所述预设文件中存储有根据测试需求,需要进行内存泄漏检测的类的类名;
如果所述当前待检测类存储于所述预设文件中,则继续判断当前是否存储有所述计数变量;
如果没有所述计数变量,则创建所述计数变量,所述计数变量的初始值为0,并控制所述计数变量执行一次减一操作;
如果有所述计数变量,则控制所述计数变量执行一次减一操作。
需要说明的是,如果当前待检测类未存储于预设文件中,表明当前待检测类并不是根据测试需求,需要进行内存泄漏检测的类,在这种情况下,结束新释放方法的执行。
综上可知,本发明预先根据测试需求,将需要进行内存泄漏检测的类的类名按照预设格式写入一个预设文件中,通过判断当前待检测类是否存储于预设文件中,来确定当前待检测类是否是需要进行内存泄漏检测的类,并在确定当前待检测类存储于预设文件中时,确定当前待检测类是需要进行内存泄漏检测的类,此时,再对该确定的类进行内存泄漏检测,反之,则结束内存泄漏检测流程。从而大大提高了内存泄漏检测的针对性。
与上述方法实施例相对应,本发明还公开了一种内存泄漏的检测系统。
参见图3,本发明公开的一种内存泄漏检测系统的结构示意图,该检测系统包括:
第一创建单元301,用于在应用程序启动时,创建一个用于内存泄漏检测的检测类,所述检测类的类型为开发语言提供的基类的一个扩展;
其中,所述检测类的类型为开发语言提供的基类的一个扩展。
具体的,当应用程序启动时,可利用IOS(苹果公司的移动操作系统)开发语言(Objective-c)提供的类的分类原理,创建一个用于内存泄漏检测的检测类,所述检测类的类型是所述IOS开发语言提供的基类(NSObject)的一个扩展。
替换单元302,用于将所述基类的创建方法替换成预先创建的新创建方法,将所述基类的释放方法替换成预先创建的新释放方法;
其中,所述新创建方法具有内存泄漏检测功能以及所述创建方法原有的分配内存功能,也就是说,新创建方法所具有的功能为:在传统创建方法原有的分配内存功能的基础上,新增加了内存泄漏检测功能;所述新释放方法具有内存泄漏检测功能以及所述释放方法原有的释放内存功能,也就是说,新释放方法具有的功能为:在传统释放方法原有的释放内存功能的基础上,新增加了内存泄漏检测功能。
第一控制单元303,用于在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,控制预先存储的与所述当前待检测类相对应的计数变量执行一次加一操作,其中,所述计数变量用于记录所述新创建方法和所述新释放方法的调用次数;
第二控制单元304,用于当所述检测类监听到所述当前待检测类调用所述新释放方法时,控制所述计数变量执行一次减一操作;
需要说明的是,在实际应用中,第一控制单元303和第二控制单元304的执行顺序并不限于本实施例公开的顺序,也可以先执行第二控制单元304,后执行第一控制单元303。
第二创建单元305,用于当所述应用程序运行结束时,控制所述检测类结束监听操作,并创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入所述内存泄漏检测结果文件中。
需要说明的是,当移动终端内存正常,也即内存不存在泄漏时,同一个待检测类会执行一次调用创建方法操作和一次调用释放方法操作,也即,当内存正常时,待检测类对应的计数变量为0;反之,当待检测类对应的计数变量不为0时,表明内存存在泄漏。
综上可知,本发明公开的内存泄漏的检测系统,在应用程序启动时,会自动创建一个用于内存泄漏检测的检测类,并将新增内存泄漏检测功能的新创建方法替换之前的创建方法,将新增内存泄漏检测功能的新释放方法替换之前的释放方法;在应用程序运行期间,当检测类监听到当前待检测类调用新创建方法时,控制与当前待检测类相对应的计数变量执行一次加一操作,当检测类监听到当前待检测类调用新释放方法时,控制该计数变量执行一次减一操作,当应用程序运行结束时,控制检测类结束监听操作,并创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入内存泄漏检测结果文件中。由于在移动终端内存正常时,同一个待检测类会执行一次调用创建方法操作和一次调用释放方法操作,也即,当内存正常时,待检测类对应的计数变量为0。因此,当某一个待检测类相对应的计数变量不为0时,表明当前内存存在泄漏,相关人员通过查看写入内存泄漏检测结果文件中类的类名,即可获知存在内存泄漏的类。相对于现有检测方法而言,本发明在应用程序启动后,就可以自动进行内存泄漏检测,无需人工干预,因此有效解决现有检测方法存在的操作复杂,检测效率低,容易漏检等问题。
需要说明的是,上述实施例中,在创建检测类后,首先需要初始化该检测类,然后利用初始化后的检测类对应用程序的各待检测类是否调用新创建方法和新释放方法进行监听。
为方便相关人员查看出现内存泄漏的类,在图3所示实施例的基础上,检测系统还包括:
生成单元,用于在第二创建单元305创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入所述内存泄漏检测结果文件中之后,生成内存泄漏检测结果文档。
因此,相关人员通过查看该结果文档,即可获取出现内存泄漏的类。
关于本实施例中各组成部分的具体工作原理,请参见图2所示实施例。
为进一步优化上述实施例,检测系统还包括:
第三创建单元,用于在所述应用程序使用之前,创建内存泄漏检测计数器,所述内存泄漏检测计数器内存储有与所述应用程序的各个待检测类相对应的计数变量。
综上,通过查看各个待检测类相对应的计数变量是否为0,即可确定该应用程序是否出现内存泄漏,从而实现在应用程序启动后,进行内存泄漏的自动检测。
为进一步优化上述实施例,第一控制单元303具体包括:
第一判断子单元,用于在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,判断当前是否存储有所述计数变量;
第一创建子单元,用于在所述第一判断单元判断为否的情况下,创建所述计数变量,所述计数变量的初始值为0,并控制所述计数变量执行一次加一操作;
第一控制子单元,用于在所述第一判断子单元判断为是的情况下,控制所述计数变量执行一次加一操作。
相应的,第二控制单元304具体包括:
第二判断子单元,用于当所述检测类监听到所述当前待检测类调用所述新释放方法时,判断当前是否存储有所述计数变量;
第二创建子单元,用于在所述第二判断子单元判断为否的情况下,创建所述计数变量,所述计数变量的初始值为0,并控制所述计数变量执行一次减一操作;
第二控制子单元,用于在所述第二判断子单元判断为是的情况下,控制所述计数变量执行一次减一操作。
综上可知,本发明通过判断与待检测类对应的计数变量是否为0,来确定移动终端是否出现内存泄漏,并在计数变量不为0时,判定移动终端出现内存泄漏。因此计数变量是判断移动终端是否出现内存泄漏的关键变量,当检测类监听到当前待检测类调用新创建方法或新释放方法时,若判定当前未存储与当前待检测类对应的计数变量,则需要先创建该计数变量,然后再对当前待检测类进行监听,以为后续判断移动终端是否出现内存泄漏提供判断依据。
本领域技术人员知晓,现有内存泄漏检测方法无法根据定制检测需求进行内存泄漏检测,因此内存泄漏检测的针对性不强。
为提高内存泄漏检测的针对性,本发明对上述实施例进行了优化,上述实施例中的第一判断子单元具体用于:
在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,判断所述当前待检测类是否存储于预设文件中,所述预设文件中存储有根据测试需求,需要进行内存泄漏检测的类的类名;
如果所述当前待检测类存储于所述预设文件中,则继续判断当前是否存储有所述计数变量。
需要说明的是,如果当前待检测类未存储于预设文件中,表明当前待检测类并不是根据测试需求,需要进行内存泄漏检测的类,在这种情况下,结束新创建方法的执行。
相应的,第二判断子单元具体用于:
当所述检测类监听到所述当前待检测类调用所述新释放方法时,判断所述当前待检测类是否存储于预设文件中,所述预设文件中存储有根据测试需求,需要进行内存泄漏检测的类的类名;
如果所述当前待检测类存储于所述预设文件中,则继续判断当前是否存储有所述计数变量。
需要说明的是,如果当前待检测类未存储于预设文件中,表明当前待检测类并不是根据测试需求,需要进行内存泄漏检测的类,在这种情况下,结束新释放方法的执行。
综上可知,本发明预先根据测试需求,将需要进行内存泄漏检测的类的类名按照预设格式写入一个预设文件中,通过判断当前待检测类是否存储于预设文件中,来确定当前待检测类是否是需要进行内存泄漏检测的类,并在确定当前待检测类存储于预设文件中时,确定当前待检测类是需要进行内存泄漏检测的类,此时,再对该确定的类进行内存泄漏检测,反之,则结束内存泄漏检测流程。从而大大提高了内存泄漏检测的针对性。
需要说明的是,系统实施例中各组成部分的具体工作原理,请参见方法实施例对应部分,此处不再赘述。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

Claims (10)

1.一种内存泄漏的检测方法,其特征在于,包括:
在应用程序启动时,创建一个用于内存泄漏检测的检测类,所述检测类的类型为开发语言提供的基类的一个扩展;
将所述基类的创建方法替换成预先创建的新创建方法,将所述基类的释放方法替换成预先创建的新释放方法,其中,所述新创建方法具有内存泄漏检测功能以及所述创建方法原有的分配内存功能,所述新释放方法具有内存泄漏检测功能以及所述释放方法原有的释放内存功能;
在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,控制预先存储的与所述当前待检测类相对应的计数变量执行一次加一操作,其中,所述计数变量用于记录所述新创建方法和所述新释放方法的调用次数;
当所述检测类监听到所述当前待检测类调用所述新释放方法时,控制所述计数变量执行一次减一操作;
当所述应用程序运行结束时,控制所述检测类结束监听操作,并创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入所述内存泄漏检测结果文件中;
其中,在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,控制预先存储的与所述当前待检测类相对应的计数变量执行一次加一操作,具体包括:
在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,判断所述当前待检测类是否存储于预设文件中,所述预设文件中存储有根据测试需求,需要进行内存泄漏检测的类的类名;
如果所述当前待检测类存储于所述预设文件中,则继续判断当前是否存储有所述计数变量;
如果没有所述计数变量,则创建所述计数变量,所述计数变量的初始值为0,并控制所述计数变量执行一次加一操作;
如果有所述计数变量,则控制所述计数变量执行一次加一操作。
2.根据权利要求1所述的检测方法,其特征在于,在所述应用程序使用之前,还包括:
创建内存泄漏检测计数器,所述内存泄漏检测计数器内存储有与所述应用程序的各个待检测类相对应的计数变量。
3.根据权利要求1所述的检测方法,其特征在于,当所述检测类监听到所述当前待检测类调用所述新释放方法时,控制所述计数变量执行一次减一操作,具体包括:
当所述检测类监听到所述当前待检测类调用所述新释放方法时,判断当前是否存储有所述计数变量;
如果没有所述计数变量,则创建所述计数变量,所述计数变量的初始值为0,并控制所述计数变量执行一次减一操作;
如果有所述计数变量,则控制所述计数变量执行一次减一操作。
4.根据权利要求3所述的检测方法,其特征在于,当所述检测类监听到所述当前待检测类调用所述新释放方法时,判断当前是否存储有所述计数变量,具体包括:
当所述检测类监听到所述当前待检测类调用所述新释放方法时,判断所述当前待检测类是否存储于预设文件中,所述预设文件中存储有根据测试需求,需要进行内存泄漏检测的类的类名;
如果所述当前待检测类存储于所述预设文件中,则继续判断当前是否存储有所述计数变量。
5.根据权利要求1所述的检测方法,其特征在于,在创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入所述内存泄漏检测结果文件中之后,还包括:
生成内存泄漏检测结果文档。
6.一种内存泄漏的检测系统,其特征在于,包括:
第一创建单元,用于在应用程序启动时,创建一个用于内存泄漏检测的检测类,所述检测类的类型为开发语言提供的基类的一个扩展;
替换单元,用于将所述基类的创建方法替换成预先创建的新创建方法,将所述基类的释放方法替换成预先创建的新释放方法,其中,所述新创建方法具有内存泄漏检测功能以及所述创建方法原有的分配内存功能,所述新释放方法具有内存泄漏检测功能以及所述释放方法原有的释放内存功能;
第一控制单元,用于在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,控制预先存储的与所述当前待检测类相对应的计数变量执行一次加一操作,其中,所述计数变量用于记录所述新创建方法和所述新释放方法的调用次数;
第二控制单元,用于当所述检测类监听到所述当前待检测类调用所述新释放方法时,控制所述计数变量执行一次减一操作;
第二创建单元,用于当所述应用程序运行结束时,控制所述检测类结束监听操作,并创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入所述内存泄漏检测结果文件中;
其中,所述第一控制单元具体包括:
第一判断子单元,用于在所述应用程序运行期间,当所述检测类监听到当前待检测类调用所述新创建方法时,判断所述当前待检测类是否存储于预设文件中,所述预设文件中存储有根据测试需求,需要进行内存泄漏检测的类的类名;如果所述当前待检测类存储于所述预设文件中,则继续判断当前是否存储有所述计数变量;
第一创建子单元,用于在所述第一判断子单元判断为否的情况下,创建所述计数变量,所述计数变量的初始值为0,并控制所述计数变量执行一次加一操作;
第一控制子单元,用于在所述第一判断子单元判断为是的情况下,控制所述计数变量执行一次加一操作。
7.根据权利要求6所述的检测系统,其特征在于,还包括:
第三创建单元,用于在所述应用程序使用之前,创建内存泄漏检测计数器,所述内存泄漏检测计数器内存储有与所述应用程序的各个待检测类相对应的计数变量。
8.根据权利要求6所述的检测系统,其特征在于,所述第二控制单元具体包括:
第二判断子单元,用于当所述检测类监听到所述当前待检测类调用所述新释放方法时,判断当前是否存储有所述计数变量;
第二创建子单元,用于在所述第二判断子单元判断为否的情况下,创建所述计数变量,所述计数变量的初始值为0,并控制所述计数变量执行一次减一操作;
第二控制子单元,用于在所述第二判断子单元判断为是的情况下,控制所述计数变量执行一次减一操作。
9.根据权利要求8所述的检测系统,其特征在于,所述第二判断子单元具体用于:
当所述检测类监听到所述当前待检测类调用所述新释放方法时,判断所述当前待检测类是否存储于预设文件中,所述预设文件中存储有根据测试需求,需要进行内存泄漏检测的类的类名;
如果所述当前待检测类存储于所述预设文件中,则继续判断当前是否存储有所述计数变量。
10.根据权利要求6所述的检测系统,其特征在于,所述检测系统还包括:
生成单元,用于在所述第二创建单元创建一个内存泄漏检测结果文件,将本次测试中所有计数变量值不为0的待检测类的类名写入所述内存泄漏检测结果文件中之后, 生成内存泄漏检测结果文档。
CN201711441958.4A 2017-12-27 2017-12-27 一种内存泄漏的检测方法及系统 Active CN108182146B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201711441958.4A CN108182146B (zh) 2017-12-27 2017-12-27 一种内存泄漏的检测方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201711441958.4A CN108182146B (zh) 2017-12-27 2017-12-27 一种内存泄漏的检测方法及系统

Publications (2)

Publication Number Publication Date
CN108182146A CN108182146A (zh) 2018-06-19
CN108182146B true CN108182146B (zh) 2021-08-24

Family

ID=62547549

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201711441958.4A Active CN108182146B (zh) 2017-12-27 2017-12-27 一种内存泄漏的检测方法及系统

Country Status (1)

Country Link
CN (1) CN108182146B (zh)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109710530A (zh) * 2018-12-28 2019-05-03 珠海西山居互动娱乐科技有限公司 一种检测对象的内存泄漏的方法及装置
CN109857615B (zh) * 2018-12-29 2022-07-19 奇安信科技集团股份有限公司 一种内存泄漏的检测方法及装置
CN110597737B (zh) * 2019-08-22 2022-03-08 腾讯音乐娱乐科技(深圳)有限公司 数据处理方法、装置、存储介质及电子设备
CN111309507B (zh) * 2020-02-13 2022-05-10 支付宝(杭州)信息技术有限公司 内存泄露的检测方法、装置和机器可读存储介质
CN111506500B (zh) * 2020-04-09 2023-05-23 北京奇艺世纪科技有限公司 内存泄露检测方法、装置、电子设备及可读存储介质
CN113900867A (zh) * 2021-09-06 2022-01-07 浪潮软件股份有限公司 检测ios内存泄漏的方法、装置及计算机可读介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105260314A (zh) * 2015-11-03 2016-01-20 上海斐讯数据通信技术有限公司 内存泄漏的监测方法
CN106055478A (zh) * 2016-05-31 2016-10-26 腾讯科技(深圳)有限公司 检测内存泄漏的方法和装置
CN106991042A (zh) * 2017-03-07 2017-07-28 南京航空航天大学 一种Web应用的内存泄漏定位方法

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1248114C (zh) * 2002-06-20 2006-03-29 华为技术有限公司 一种软件内存泄露的检查方法
CN101539870A (zh) * 2008-03-21 2009-09-23 中兴通讯股份有限公司 内存泄漏检测装置及方法
CN101615143B (zh) * 2008-06-27 2013-04-17 国际商业机器公司 用于内存泄漏诊断的方法和装置
US8522216B2 (en) * 2010-05-04 2013-08-27 Oracle International Corporation Memory leak detection
US10241895B2 (en) * 2013-06-07 2019-03-26 Apple Inc. Memory stack trace management tool
CN103455438A (zh) * 2013-07-30 2013-12-18 华为技术有限公司 一种内存管理方法及设备

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105260314A (zh) * 2015-11-03 2016-01-20 上海斐讯数据通信技术有限公司 内存泄漏的监测方法
CN106055478A (zh) * 2016-05-31 2016-10-26 腾讯科技(深圳)有限公司 检测内存泄漏的方法和装置
CN106991042A (zh) * 2017-03-07 2017-07-28 南京航空航天大学 一种Web应用的内存泄漏定位方法

Also Published As

Publication number Publication date
CN108182146A (zh) 2018-06-19

Similar Documents

Publication Publication Date Title
CN108182146B (zh) 一种内存泄漏的检测方法及系统
CN107562610B (zh) 获取页面加载时间的方法、装置、终端和介质
CN104636144A (zh) 一种移动终端后台程序管理方法及装置
US9086899B2 (en) Loading and debugging method and debugging system thereof
CN111459818B (zh) 可视化测试方法及装置
CN105824755A (zh) 一种自动化测试方法、装置及移动终端
WO2017206476A1 (zh) 一种cpu占用的检测方法、装置及设备
CN105740144A (zh) 一种Android移动终端的自动化测试方法及系统
CN111666217B (zh) 用于测试代码的方法和装置
CN104731643A (zh) 一种后台应用程序的管理方法和管理系统
KR20120081873A (ko) 모바일 어플리케이션 검증 방법 및 이를 적용한 단말
CN104461888A (zh) 一种应用测试方法和系统
CN107360265B (zh) 一种设备唯一标识码获取方法、装置及移动终端
CN107391362A (zh) 应用测试方法、移动终端及存储介质
CN110688168A (zh) 提高应用程序启动速度方法、装置、设备及存储介质
CN107102937B (zh) 一种用户界面测试方法和装置
CN114443502A (zh) 一种基于应用程序的稳定性测试方法及装置
CN107197088B (zh) 基于安卓移动设备的截图方法与装置
CN110019260B (zh) 一种用户数据的更新方法及相关设备
US8010950B1 (en) Method and apparatus for testing a binding application programming interface
CN111026651B (zh) 测试方法、装置、存储介质及电子设备
CN108984238B (zh) 应用程序的手势处理方法、装置及电子设备
CN109214165B (zh) 一种预装应用程序的权限声明合法性的判断方法和判断系统
CN108874569B (zh) 事件响应及文件生成的方法、装置及电子设备
CN116400846A (zh) 模拟触控操作3d应用的实现方法、设备及介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant