CN111506500A - 内存泄露检测方法、装置、电子设备及可读存储介质 - Google Patents
内存泄露检测方法、装置、电子设备及可读存储介质 Download PDFInfo
- Publication number
- CN111506500A CN111506500A CN202010272601.3A CN202010272601A CN111506500A CN 111506500 A CN111506500 A CN 111506500A CN 202010272601 A CN202010272601 A CN 202010272601A CN 111506500 A CN111506500 A CN 111506500A
- Authority
- CN
- China
- Prior art keywords
- program
- detected
- class
- objects
- class object
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/366—Software debugging using diagnostics
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
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)
- Stored Programmes (AREA)
Abstract
本发明提供一种内存泄露检测方法、装置、电子设备及可读存储介质,包括:在待检测程序退出运行的情况下,获取待检测程序的第一哈希表;第一哈希表关联存储有第一类对象的第一类标识以及待检测程序退出运行时第一类对象对应的调用结果信息,调用结果信息包括第一类对象的实例化对象的第一数量,第一类对象为待检测程序运行过程中使用过的类对象;将第一类标识关联的实例化对象的第一数量与初始数量进行比较,得到比较结果;其中,初始数量包括待检测程序启动时第一类标识关联的实例化对象的第二数量;基于比较结果,确定待检测程序的内存泄露结果。本发明实施例能够节省内存额外开销,且还不影响待检测程序的性能和正常运行。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种内存泄露检测方法、装置、电子设备及可读存储介质。
背景技术
在大型工程应用中,复杂的业务逻辑会导致开发人员在编码过程中未较好的管理对象的内存,可能会造成内存泄漏;比如,由程序语言C++或面向对象Objective-C编写的应用程序,动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费。内存泄露可能会导致程序运行速度减慢甚至系统崩溃等严重后果,因此,需要借助一些分析方法来定位内存泄漏的位置及原因,以解决内存泄露的问题。
目前,可以在开发环境中集成工具来进行内存泄露的检测,然而,使用工具检测内存泄露会存在检测结果不准确的问题。因此,相关技术中,还可以通过建立动态检测机制,来进行内存泄露的检测。具体的,首先,创建数据结构,当对象内存进行分配时,在管理哈希表、红黑树或链表中,采用数据结构体记录内存分配的基本信息;然后,在特定时机挂起子线程,暂停程序运行,通过判定释放的内存地址与所述数据结构体记录的内存分配缓冲地址是否相同,来检测是否产生内存泄漏。
然而,在动态检测机制中,通过维护数据结构的方式来进行内存泄漏的检测,会造成内存额外开销,并会影响程序的正常运行。
发明内容
本发明实施例提供一种内存泄露检测方法、装置、电子设备及可读存储介质,以解决动态检测机制中,通过维护数据结构的方式来进行内存泄漏的检测,而造成的内存额外开销,且影响程序的正常运行的问题。
第一方面,本发明实施例提供了一种内存泄露检测方法,所述方法包括:
在待检测程序退出运行的情况下,获取所述待检测程序的第一哈希表;其中,所述第一哈希表关联存储有第一类对象的第一类标识以及所述待检测程序退出运行时所述第一类对象对应的调用结果信息,所述调用结果信息包括所述第一类对象的实例化对象的第一数量,所述第一类对象为所述待检测程序运行过程中使用过的类对象;
将所述第一类标识关联的实例化对象的第一数量与初始数量进行比较,得到比较结果;其中,所述初始数量包括所述待检测程序启动时所述第一类标识关联的实例化对象的第二数量;
基于所述比较结果,确定所述待检测程序的内存泄露结果。
第二方面,本发明实施例还提供一种内存泄露检测装置,所述装置包括:
第一获取模块,用于在待检测程序退出运行的情况下,获取所述待检测程序的第一哈希表;其中,所述第一哈希表关联存储有第一类对象的第一类标识以及所述待检测程序退出运行时所述第一类对象对应的调用结果信息,所述调用结果信息包括所述第一类对象的实例化对象的第一数量,所述第一类对象为所述待检测程序运行过程中使用过的类对象;
比较模块,用于将所述第一类标识关联的实例化对象的第一数量与初始数量进行比较,得到比较结果;其中,所述初始数量包括所述待检测程序启动时所述第一类标识关联的实例化对象的第二数量;
确定模块,用于基于所述比较结果,确定所述待检测程序的内存泄露结果。
第三方面,本发明实施例还提供一种电子设备,包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现上述内存泄露检测方法的步骤。
第四方面,本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现上述内存泄露检测方法的步骤。
本发明实施例中,通过比较待检测程序退出运行时第一类对象的实例化对象的数量与所述待检测程序启动时第一类对象的实例化对象的初始数量,以判定所述待检测程序运行过程中第一类对象的实例化对象的数量是否发生变化,以确定所述待检测程序的内存泄露结果。如此,无需通过数据结构的方式来管理内存泄漏,从而节省了内存额外开销;并且,还不影响待检测程序的性能和正常运行。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的内存泄露检测方法的流程图;
图2是本发明实施例提供的内存泄露检测装置的结构图之一;
图3是本发明实施例提供的内存泄露检测装置的结构图之二;
图4是本发明实施例提供的内存泄露检测装置的结构图之三;
图5是本发明实施例提供的内存泄露检测装置的结构图之四;
图6是本发明实施例提供的内存泄露检测装置的结构图之五;
图7是本发明实施提供的电子设备的结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
首先,对本发明实施例提供的内存泄露检测方法进行说明。
需要说明的是,本发明实施例提供的内存泄露检测方法可以应用于电子设备,所述电子设备可以为终端设备,用于对待检测程序进行调试,达到在确定所述待检测程序的内存泄露结果的前提下,还能够节省内存额外开销,且不影响待检测程序的性能和正常运行的目的。
参见图1,图1是本发明实施例提供的内存泄露检测方法的流程图,如图1所示,包括以下步骤:
步骤101,在待检测程序退出运行的情况下,获取所述待检测程序的第一哈希表;其中,所述第一哈希表关联存储有第一类对象的第一类标识以及所述待检测程序退出运行时所述第一类对象对应的调用结果信息,所述调用结果信息包括所述第一类对象的实例化对象的第一数量,所述第一类对象为所述待检测程序运行过程中使用过的类对象;
步骤102,将所述第一类标识关联的实例化对象的第一数量与初始数量进行比较,得到比较结果;其中,所述初始数量包括所述待检测程序启动时所述第一类标识关联的实例化对象的第二数量;
步骤103,基于所述比较结果,确定所述待检测程序的内存泄露结果。
在步骤101中,所述待检测程序可以理解为采用任意程序语言编写的应用程序,比如,所述待检测程序可以为程序语言C++编写的应用程序,又比如,所述待检测程序也可以为程序语言Objective-C编写的应用程序。当然,所述待检测程序还可以为由其他程序语言编写的应用程序,这里不再对其一一赘述。
更具体的,所述待检测程序可以为由C++或Objective-C编写的微软基础类库(Microsoft Foundation Classes,MFC)、图形用户界面QT等桌面应用,或者,可以为移动操作系统iOS应用程序,或者,可以为C++编写的后端服务等应用程序。
所述第一哈希表可以为所述待检测程序在启动时建立的哈希表,所述第一哈希表用于存储所述待检测程序在运行过程中使用过的类对象的调用结果信息,如调用类对象的相关函数之后第一类对象的实例化对象的数量。
其中,所述调用结果信息可以理解为待检测程序运行至当前时间节点时调用类对象的相关函数之后生成的结果信息,举个例子来说,待检测程序运行至当前时间节点时,调用类对象A的构造函数创建了10个实例化对象,而调用类对象A的析构函数又将创建的10个实例化对象进行了销毁,则类对象A的调用结果信息中类对象A的实例化对象的数量为0。
需要解释的是,本发明实施例提到的类对象是一个抽象的概念,如对象为人,将类对象进行实例化,比如调用类对象的构造函数来初始化对象,即可以创建实例化对象,而与类对象不同的是,实例化对象是一个具体的概念,如一个具体的人。所述待检测程序在运行过程中,可以有多种方式使用类对象来创建实例化对象,比如,调用类对象的构造函数来创建实例化对象,又比如,调用类对象的拷贝构造函数来创建实例化对象。而在创建的实例化对象运行完成之后,又可以调用类对象的析构函数销毁所创建的实例化对象。
所述第一哈希表可以以第一类标识作为键值,以第一类对象的调用结果信息作为内容的方式,来关联存储所述第一类对象的第一类标识以及所述第一类对象的调用结果信息。这样,若在待检测程序运行过程中再次使用该第一类对象,即可以基于第一类对象的第一类标识,将第一类对象的调用结果信息存储至第一类对象的第一类标识关联的调用结果信息中,或者,可以基于第一类对象的第一类标识,更新第一类对象的第一类标识关联的调用结果信息。其中,所述第一类对象的第一类标识可以为所述第一类对象的类名。
所述第一类对象的调用结果信息可以至少包括所述第一类对象的实例化对象的数量,在一可选实施方式中,所述第一类对象的调用结果信息还可以包括所述第一类对象的实例化对象的数量和第一类对象的实例化对象的相关信息,比如,还可以包括第一类对象的实例化对象的函数调用栈信息和内存地址,这里不做具体限定。另外,所述第一类对象的数量可以为1个,也可以为多个,这里也不做具体限定。
在所述待检测程序运行过程中,可以基于第一类对象的调用信息,更新所述第一哈希表,最终在所述待检测程序退出运行时,所述第一哈希表关联存储有第一类对象的第一类标识以及所述待检测程序退出运行时所述第一类对象对应的调用结果信息。其中,所述第一类对象的调用信息可以包括第一类对象调用的函数信息、第一类对象的实例化对象的函数调用栈信息、第一类对象的实例化对象的内存地址等。
具体的,可以基于第一类对象调用的函数信息,更新所述第一哈希表中存储的所述第一类对象的实例化对象的数量,比如,若第一类对象调用的函数信息是构造函数或拷贝构造函数,则可以将第一类对象的实例化对象的数量加上1,又比如,若第一类对象调用的函数信息是析构函数,则可以将第一类对象的实例化对象的数量减去1。最终,在所述待检测程序退出运行时,所述第一哈希表中存储有所述第一类对象的实例化对象的第一数量。
上述对本发明实施例的应用场景以及步骤101中的相关概念进行了解释,而实际应用中,步骤101的具体实现可以为,在待检测程序退出运行的情况下,将第一哈希表写入至日志,通过获取该日志来获取第一哈希表。
在步骤102中,所述初始数量可以包括所述待检测程序启动时所述第一类标识关联的实例化对象的第二数量。所述第一类标识关联的实例化对象的第二数量的获取方式可以有多种,比如,可以在待检测程序上次退出运行后,在内存中读取第一类对象的实例化对象的第二数量,也可以接收用户设置的第一类对象的实例化对象的第二数量。
在第一类对象的数量为多个的情况下,也可以结合上述两种方式获取第一类对象关联的实例化对象的第二数量。比如,在待检测程序上次退出运行后,在内存中仅能读取到部分第一类对象的实例化对象的第二数量,其他第一类对象的实例化对象的第二数量可以由用户设置。
可以根据第一类对象的属性来设置第一类对象的实例化对象的第二数量,将特殊属性的第一类对象的第二数量设置为特定值,其他第一类对象的第二数量可以设置为0。比如,某些类对象在应用程序运行过程中会一直存在,例如,用于对应用程序首页进行页面控制的类对象在应用程序退出时还会依然存在,其类对象的实例化对象的第二数量可以设置为1。
将所述第一类标识关联的实例化对象的第一数量与初始数量进行比较的方式可以有多种,比如,可以将第一类标识关联的实例化对象的第一数量与相应的第一类标识关联的实例化对象的第二数量进行逐一比较,也可以首先检索出实例化对象的第一数量大于0的第一类标识,然后将检索出的第一类标识关联的实例化对象的第一数量与相应的第一类标识关联的实例化对象的第二数量进行比较。
实际应用中,步骤102的具体实现可以为,建立检索脚本,当待检测程序即将退出时,把第一哈希表写入日志,基于日志中的第一哈希表,使用脚本检索,在该日志中检索实例化对象的第一数量大于0,且与实例化对象的第二数量不相等的第一类标识、第一类标识对应的第一类对象以及第一类对象的实例化对象,得到检索结果,该检索结果即可以包括所述比较结果。
所述比较结果可以存在两种情况,第一种情况可以为所述第一类标识关联的实例化对象的第一数量与初始数量不相等,第二种情况可以为所述一类标识关联的实例化对象的第一数量与初始数量相等。
在步骤103中,基于所述比较结果,确定所述待检测程序的内存泄露结果,也可以存在两种情况,在所述第一类标识关联的实例化对象的第一数量与初始数量不相等的情况下,确定所述待检测程序存在内存泄露。在所述第一类标识关联的实例化对象的第一数量与初始数量相等的情况下,确定所述待检测程序本次运行过程中不存在内存泄露。
本发明实施例中,通过比较待检测程序退出运行时第一类对象的实例化对象的数量与所述待检测程序启动时第一类对象的实例化对象的初始数量,以判定所述待检测程序运行过程中第一类对象的实例化对象的数量是否发生变化,以确定所述待检测程序的内存泄露结果。
一方面,相对于现有的在开发环境中集成工具来进行内存泄露的检测方案,比如,内存泄露检测工具BoundsChecker可以集成于VC++集成开发环境中,编译运行开发程序,BoundsChecker给出错误检测结果列表,定位到C++内存泄漏代码。又比如,Objective-C可借助内存泄露检测工具instrument中使用内存泄露leak功能,或者查找循环引用的代码地址。由于本发明实施例能够避免使用工具检测内存泄露的问题,因此能够提高内存泄露的检测结果准确性。
具体的,本发明实施例能够避免使用工具检测内存泄露的以下问题:
使用父类指针指向子类对象时,在销毁父类指针后对象也销毁,instrument工具会将该子类对象判定为内存泄漏。
由于工具不能动态的分析对象、引用和指针之间的关系,不能分析进程的生命周期,虽然能够看到调用的堆栈,但不能检测函数内部的对象内存布局,因此,若某个类使用了全局变量、对象或者单例对象,也会被判定为内存泄漏。
另外,内存泄漏的检测工具跟编译器关联性强,不同编译器架构的编译方式在不同的平台是不一样的。
另一方面,相对于现有的通过建立动态检测机制,来进行内存泄露的检测方案,由于本发明实施例无需通过数据结构的方式来管理内存泄漏,因此能够节省内存额外开销;并且,还不影响待检测程序的性能和正常运行。
还有,通过检测应用程序是否存在内存泄露,以在存在内存泄露的情况下,定位并解决应用程序的内存泄露问题,从而可以提升应用程序运行的稳定性,同时,还可以兼容C++编写的应用程序(比如MFC、QT、引擎等)的内存泄漏检测。
可选的,基于实施例一,所述步骤103包括:
在所述第一类标识中存在目标类标识的情况下,确定所述待检测程序存在内存泄露;其中,所述目标类标识关联的实例化对象的第一数量大于所述目标类标识关联的实例化对象的第二数量。
如此,在所述待检测程序运行过程中第一类对象的实例化对象的数量发生变化的情况下,可以确定待检测程序运行过程中存在未释放的实例化对象,从而可以确定待检测程序存在内存泄露。
进一步的,在确定待检测程序存在内存泄露的情况下,还需要查找内存泄露的原因以及定位待检测程序内存泄露的位置。
内存泄露的本质是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
举个例子来说,程序语言C++编写的程序,如下:
从上述程序可以看出,首先,声明了一个Person类,然后,在程序运行过程中,通过test函数内部在堆空间初始化了一个person对象,在初始化person对象时,调用了person对象的run方法,在调用person对象的run方法中person对象的构造函数被调用。但是,由于没有调用delete方法,使得person对象的析构函数并没有被调用,导致test函数代码执行完毕后,person对象无法释放,从而导致person对象在程序退出之后还依然存在。
因此,本实施例可以抓住内存泄露的本质,找到未释放的实例化对象,基于未释放的实例化对象的初始化信息,来查找内存泄露的原因以及定位待检测程序内存泄露的位置。
具体的,基于上述实施例,所述步骤101之前,所述方法还包括:
在所述待检测程序运行过程中调用所述第一类对象的构造函数,或者调用所述第一类对象的拷贝构造函数的情况下,将所述第一类对象的实例化对象的初始化信息存储于所述第一类对象的第一类标识关联的调用结果信息中;
在所述待检测程序运行过程中调用所述第一类对象的析构函数的情况下,将所述第一类对象的实例化对象的初始化信息从所述第一类对象的第一类标识关联的调用结果信息中删除。
其中,所述第一类对象的实例化对象的初始化信息可以包括初始化对象时调用第一类对象的构造函数或拷贝构造函数所生成的实例化对象的函数调用栈信息和/或内存地址。所述第一类对象的调用信息可以包括所述第一类对象的实例化对象的初始化信息。
本实施例中,在待检测程序运行过程中,可以基于第一类对象的实例化对象的初始化信息,更新第一哈希表中第一类标识关联的调用结果信息。具体的,在初始化对象时,将第一类对象的实例化对象的初始化信息存储于第一类标识关联的调用结果信息中,在销毁对象时,将第一类对象的实例化对象的初始化信息从调用结果信息中删除。
如此,在确定所述待检测程序存在内存泄露的情况下,查找到未释放的对象的初始化信息,即可以定位待检测程序的内存泄露问题。
可选的,所述确定所述待检测程序存在内存泄露之后,所述方法还包括:
输出所述目标类标识关联的实例化对象的初始化信息。
如此,可以基于目标类标识,查找并输出与所述目标类标识关联的第一类对象的实例化对象的初始化信息,开发人员即可以基于输出的信息定位待检测程序的内存泄露问题。
可选的,基于实施例一,所述步骤101之前,所述方法包括:
在所述待检测程序运行过程中调用所述第一类对象的构造函数,或者调用所述第一类对象的拷贝构造函数的情况下,将所述第一哈希表中所述第一类对象的实例化对象的数量加上预设值;
在所述待检测程序运行过程中调用所述第一类对象的析构函数的情况下,将所述第一哈希表中所述第一类对象的实例化对象的数量减去所述预设值。
本实施例中,在所述待检测程序运行过程中,初始化对象时,可以调用所述第一类对象的构造函数,或者调用所述第一类对象的拷贝构造函数,以构建第一类对象的实例化对象,如此,在所述待检测程序运行过程中调用所述第一类对象的构造函数,或者调用所述第一类对象的拷贝构造函数的情况下,所述第一类对象的实例化对象的数量会增加,即加上预设值,该预设值可以为1。
而在所述待检测程序运行过程中,销毁对象时,可以调用所述第一类对象的析构函数,如此,在所述待检测程序运行过程中调用所述第一类对象的析构函数的情况下,所述第一类对象的实例化对象的数量会减少,即减去预设值。
若在所述待检测程序运行过程中所构建的实例化对象全部被销毁,则所述待检测程序在退出运行时第一类对象的实例化对象的第一数量,与待检测程序启动时第一类对象的实例化对象的第二数量比较,不会有所改变。若存在未释放的对象,则第一数量与第二数量相比,会有所增大。
如此,可以通过监测第一数量与第二数量相比是否有所改变,从而确定待检测程序是否存在内存泄露。
可选的,基于实施例一,所述步骤103之后,所述方法还包括:
获取所述待检测程序的第二哈希表;其中,所述第二哈希表关联存储有第二类对象的第二类标识以及所述待检测程序退出运行时所述第二类对象对应的调用结果信息,所述调用结果信息包括所述第二类对象的实例化对象的第三数量,所述第二类对象为所述待检测程序版本更新前运行过程中使用过的类对象;
将所述第一类标识关联的实例化对象的第一数量与所述第二类标识关联的实例化对象的第三数量进行比较,输出所述第一类标识关联的实例化对象与所述第二类标识关联的实例化对象的差异信息。
在待检测程序每个版本功能开发完毕时,可将当前版本的待检测程序退出运行时第一类对象的实例化对象的第一数量,与上个版本的待检测程序退出运行时第二类对象的实例化对象的第三数量进行比较。若一一比较之后存在类对象的实例化对象的数量有所改变,则输出实例化对象的数量有所改变的第一类标识关联的实例化对象与相应第二类标识关联的实例化对象的差异信息,开发人员即可以基于输出的差异信息,从上个版本到当前版本的代码修改,查询待检测程序的内存泄漏原因。其中,所述差异信息可以包括实例化对象的函数调用栈信息和/或内存地址。
需要说明的是,本发明实施例中介绍的多种可选的实施方式,彼此可以相互结合实现,也可以单独实现,对此本发明实施例不作限定。
为了更好的理解整个过程,以下待检测程序以程序语言C++和Objective-C编写的应用程序为应用场景,对本发明实施例提供的内存泄露检测方法进行详细说明。具体如下:
首先,在类对象定义一个计数器变量m_class_count,用于记录该类对象的实例化对象的数量。
其中,m_class_count为类对象的私有静态变量,通常可以将类对象的m_class_count的初始值默认设置为0;然而,对于一些特殊的类对象,可以将特殊的类对象的m_class_count的初始值设置为特定的值,比如,某些类对象在运行过程中会一直存在,例如应用程序首页进行页面控制的类对象会在应用程序退出时还会存在,其m_class_count的初始值可以设置为1。
由于m_class_count为类对象的私有静态变量,因此外界不能访问和修改该变量,具体访问时可以通过一个接口函数进行访问。
在Objective-C类对象中可以给基类写个分类,在分类中利用运行时间的关联属性在基类中注入m_class_count。而C++中可以在抽象类定义m_class_count,后面使用的子类可以继承抽象类,各自维护m_class_count。
然后,在待检测程序启动时,建立一个哈希表,该哈希表以类名作为键值,类对象的调用结果信息作为内容,来关联存储待检测程序在运行过程中使用过的类对象。
其中,类对象的调用结果信息包括m_class_count。
接着,在待检测程序运行过程中,将使用过的类对象记录在此哈希表中。
具体的,当调用类对象的构造函数时,m_class_count增加上1,当调用类对象的析构函数时,m_class_count减去1。
由于,调用类对象的拷贝构造函数也会给实例化对象分配内存,因此,当调用类对象的拷贝构造函数,比如,在Objective-C中调用copyWithZone方法,也会将m_class_count的值加上1。
当初始化对象时,哈希表中会记录创建的实例化对象的函数调用栈信息以及内存地址,当销毁对象时,在哈希表中删除销毁的实例化对象的函数调用栈信息以及内存地址。
C++编写的应用程序中可采用观察者模式监听全局变量值的改变,Objective-C编写的应用程序中可在下载load方法或者初始化initialize方法将内容记录至哈希表。
接着,获取待检测程序启动时类对象的m_class_count的初始值。
获取待检测程序启动时为类对象的m_class_count所设置的初始值,类对象的m_class_count的初始值通常设置为0,而对于特殊的类对象,其m_class_count的初始值可以为设置的特定值,比如为1。
接着,建立检索脚本,当待检测程序即将退出时,把哈希表写入日志,使用脚本检索m_class_count大于0,且大于初始值的类对象及其实例化对象。
最后,在检索到m_class_count大于0,且大于初始值的类对象的情况下,获取该类对象的实例化对象,该类对象的实例化对象即为未释放的实例化对象,并输出该类对象的实例化对象初始化时的函数调用栈信息以及内存地址,即可助力开发人员定位内存泄漏问题。
下面对本发明实施例提供的内存泄露检测装置进行说明。
参见图2,图2是本发明实施例提供的内存泄露检测装置的结构图之一,能实现上述内存泄露检测方法的细节,并达到相同的效果。如图2所示,内存泄露检测装置200包括:
第一获取模块201,用于在待检测程序退出运行的情况下,获取所述待检测程序的第一哈希表;其中,所述第一哈希表关联存储有第一类对象的第一类标识以及所述待检测程序退出运行时所述第一类对象对应的调用结果信息,所述调用结果信息包括所述第一类对象的实例化对象的第一数量,所述第一类对象为所述待检测程序运行过程中使用过的类对象;
比较模块202,用于将所述第一类标识关联的实例化对象的第一数量与初始数量进行比较,得到比较结果;其中,所述初始数量包括所述待检测程序启动时所述第一类标识关联的实例化对象的第二数量;
确定模块203,用于基于所述比较结果,确定所述待检测程序的内存泄露结果。
可选的,所述确定模块203,具体用于在所述第一类标识中存在目标类标识的情况下,确定所述待检测程序存在内存泄露;其中,所述目标类标识关联的实例化对象的第一数量大于所述目标类标识关联的实例化对象的第二数量。
可选的,图3是本发明实施例提供的内存泄露检测装置的结构图之二,参见图3,基于图2所示的装置实施例,内存泄露检测装置200还包括:
存储模块204,用于在所述待检测程序运行过程中调用所述第一类对象的构造函数,或者调用所述第一类对象的拷贝构造函数的情况下,将所述第一类对象的实例化对象的初始化信息存储于所述第一类对象的第一类标识关联的调用结果信息中;
删除模块205,用于在所述待检测程序运行过程中调用所述第一类对象的析构函数的情况下,将所述第一类对象的实例化对象的初始化信息从所述第一类对象的第一类标识关联的调用结果信息中删除。
可选的,图4是本发明实施例提供的内存泄露检测装置的结构图之三,参见图4,基于图3所示的装置实施例,内存泄露检测装置200还包括:
第一输出模块206,用于输出所述目标类标识关联的实例化对象的初始化信息。
可选的,图5是本发明实施例提供的内存泄露检测装置的结构图之四,参见图5,基于图2所示的装置实施例,内存泄露检测装置200还包括:
第一更新模块207,用于在所述待检测程序运行过程中调用所述第一类对象的构造函数,或者调用所述第一类对象的拷贝构造函数的情况下,将所述第一哈希表中所述第一类对象的实例化对象的数量加上预设值;
第二更新模块208,用于在所述待检测程序运行过程中调用所述第一类对象的析构函数的情况下,将所述第一哈希表中所述第一类对象的实例化对象的数量减去所述预设值。
可选的,图6是本发明实施例提供的内存泄露检测装置的结构图之五,参见图6,基于图2所示的装置实施例,内存泄露检测装置200还包括:
第二获取模块209,用于获取所述待检测程序的第二哈希表;其中,所述第二哈希表关联存储有第二类对象的第二类标识以及所述待检测程序退出运行时所述第二类对象对应的调用结果信息,所述调用结果信息包括所述第二类对象的实例化对象的第三数量,所述第二类对象为所述待检测程序版本更新前运行过程中使用过的类对象;
第二输出模块210,用于将所述第一类标识关联的实例化对象的第一数量与所述第二类标识关联的实例化对象的第三数量进行比较,输出所述第一类标识关联的实例化对象与所述第二类标识关联的实例化对象的差异信息。
上述内存泄露检测装置200能实现上述内存泄露检测方法实施例中电子设备实现的各个过程,并能达到相同的技术效果,为避免重复,这里不再赘述。
参见图7,图7是本发明实施提供的电子设备的结构图,如图7所示的电子设备包括:处理器701、存储器702及存储在所述存储器702上并可在所述处理器上运行的计算机程序,电子设备中的各个组件通过总线接口703耦合在一起,所述计算机程序被所述处理器701执行时实现如下步骤:
在待检测程序退出运行的情况下,获取所述待检测程序的第一哈希表;其中,所述第一哈希表关联存储有第一类对象的第一类标识以及所述待检测程序退出运行时所述第一类对象对应的调用结果信息,所述调用结果信息包括所述第一类对象的实例化对象的第一数量,所述第一类对象为所述待检测程序运行过程中使用过的类对象;
将所述第一类标识关联的实例化对象的第一数量与初始数量进行比较,得到比较结果;其中,所述初始数量包括所述待检测程序启动时所述第一类标识关联的实例化对象的第二数量;
基于所述比较结果,确定所述待检测程序的内存泄露结果。
可选的,所述处理器701,具体用于:
在所述第一类标识中存在目标类标识的情况下,确定所述待检测程序存在内存泄露;其中,所述目标类标识关联的实例化对象的第一数量大于所述目标类标识关联的实例化对象的第二数量。
可选的,所述处理器701,还用于:
在所述待检测程序运行过程中调用所述第一类对象的构造函数,或者调用所述第一类对象的拷贝构造函数的情况下,将所述第一类对象的实例化对象的初始化信息存储于所述第一类对象的第一类标识关联的调用结果信息中;
在所述待检测程序运行过程中调用所述第一类对象的析构函数的情况下,将所述第一类对象的实例化对象的初始化信息从所述第一类对象的第一类标识关联的调用结果信息中删除。
可选的,所述处理器701,还用于:
输出所述目标类标识关联的实例化对象的初始化信息。
可选的,所述处理器701,还用于:
在所述待检测程序运行过程中调用所述第一类对象的构造函数,或者调用所述第一类对象的拷贝构造函数的情况下,将所述第一哈希表中所述第一类对象的实例化对象的数量加上预设值;
在所述待检测程序运行过程中调用所述第一类对象的析构函数的情况下,将所述第一哈希表中所述第一类对象的实例化对象的数量减去所述预设值。
可选的,所述处理器701,还用于:
获取所述待检测程序的第二哈希表;其中,所述第二哈希表关联存储有第二类对象的第二类标识以及所述待检测程序退出运行时所述第二类对象对应的调用结果信息,所述调用结果信息包括所述第二类对象的实例化对象的第三数量,所述第二类对象为所述待检测程序版本更新前运行过程中使用过的类对象;
将所述第一类标识关联的实例化对象的第一数量与所述第二类标识关联的实例化对象的第三数量进行比较,输出所述第一类标识关联的实例化对象与所述第二类标识关联的实例化对象的差异信息。
优选的,本发明实施例还提供一种电子设备,包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现上述任一方法实施例的内存泄露检测方法的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。
本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述内存泄露检测方法的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。其中,所述的计算机可读存储介质,如只读存储器(Read-Only Memory,简称ROM)、随机存取存储器(Random Access Memory,简称RAM)、磁碟或者光盘等。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本发明实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。
Claims (10)
1.一种内存泄露检测方法,其特征在于,所述方法包括:
在待检测程序退出运行的情况下,获取所述待检测程序的第一哈希表;其中,所述第一哈希表关联存储有第一类对象的第一类标识以及所述待检测程序退出运行时所述第一类对象对应的调用结果信息,所述调用结果信息包括所述第一类对象的实例化对象的第一数量,所述第一类对象为所述待检测程序运行过程中使用过的类对象;
将所述第一类标识关联的实例化对象的第一数量与初始数量进行比较,得到比较结果;其中,所述初始数量包括所述待检测程序启动时所述第一类标识关联的实例化对象的第二数量;
基于所述比较结果,确定所述待检测程序的内存泄露结果。
2.根据权利要求1所述的方法,其特征在于,所述基于所述比较结果,确定所述待检测程序的内存泄露结果,包括:
在所述第一类标识中存在目标类标识的情况下,确定所述待检测程序存在内存泄露;其中,所述目标类标识关联的实例化对象的第一数量大于所述目标类标识关联的实例化对象的第二数量。
3.根据权利要求2所述的方法,其特征在于,所述在所述待检测程序退出运行的情况下,获取待检测程序的第一哈希表之前,所述方法还包括:
在所述待检测程序运行过程中调用所述第一类对象的构造函数,或者调用所述第一类对象的拷贝构造函数的情况下,将所述第一类对象的实例化对象的初始化信息存储于所述第一类对象的第一类标识关联的调用结果信息中;
在所述待检测程序运行过程中调用所述第一类对象的析构函数的情况下,将所述第一类对象的实例化对象的初始化信息从所述第一类对象的第一类标识关联的调用结果信息中删除。
4.根据权利要求3所述的方法,其特征在于,所述确定所述待检测程序存在内存泄露之后,所述方法还包括:
输出所述目标类标识关联的实例化对象的初始化信息。
5.根据权利要求1所述的方法,其特征在于,所述在所述待检测程序退出运行的情况下,获取待检测程序的第一哈希表之前,所述方法还包括:
在所述待检测程序运行过程中调用所述第一类对象的构造函数,或者调用所述第一类对象的拷贝构造函数的情况下,将所述第一哈希表中所述第一类对象的实例化对象的数量加上预设值;
在所述待检测程序运行过程中调用所述第一类对象的析构函数的情况下,将所述第一哈希表中所述第一类对象的实例化对象的数量减去所述预设值。
6.根据权利要求1所述的方法,其特征在于,所述基于所述比较结果,确定所述待检测程序的内存泄露结果之后,所述方法还包括:
获取所述待检测程序的第二哈希表;其中,所述第二哈希表关联存储有第二类对象的第二类标识以及所述待检测程序退出运行时所述第二类对象对应的调用结果信息,所述调用结果信息包括所述第二类对象的实例化对象的第三数量,所述第二类对象为所述待检测程序版本更新前运行过程中使用过的类对象;
将所述第一类标识关联的实例化对象的第一数量与所述第二类标识关联的实例化对象的第三数量进行比较,输出所述第一类标识关联的实例化对象与所述第二类标识关联的实例化对象的差异信息。
7.一种内存泄露检测装置,其特征在于,所述装置包括:
第一获取模块,用于在待检测程序退出运行的情况下,获取所述待检测程序的第一哈希表;其中,所述第一哈希表关联存储有第一类对象的第一类标识以及所述待检测程序退出运行时所述第一类对象对应的调用结果信息,所述调用结果信息包括所述第一类对象的实例化对象的第一数量,所述第一类对象为所述待检测程序运行过程中使用过的类对象;
比较模块,用于将所述第一类标识关联的实例化对象的第一数量与初始数量进行比较,得到比较结果;其中,所述初始数量包括所述待检测程序启动时所述第一类标识关联的实例化对象的第二数量;
确定模块,用于基于所述比较结果,确定所述待检测程序的内存泄露结果。
8.根据权利要求7所述的装置,其特征在于,所述确定模块,具体用于在所述第一类标识中存在目标类标识的情况下,确定所述待检测程序存在内存泄露;其中,所述目标类标识关联的实例化对象的第一数量大于所述目标类标识关联的实例化对象的第二数量。
9.一种电子设备,其特征在于,包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如权利要求1至6中任一项所述的内存泄露检测方法的步骤。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现如权利要求1至6中任一项所述的内存泄露检测方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010272601.3A CN111506500B (zh) | 2020-04-09 | 2020-04-09 | 内存泄露检测方法、装置、电子设备及可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010272601.3A CN111506500B (zh) | 2020-04-09 | 2020-04-09 | 内存泄露检测方法、装置、电子设备及可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111506500A true CN111506500A (zh) | 2020-08-07 |
CN111506500B CN111506500B (zh) | 2023-05-23 |
Family
ID=71872550
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010272601.3A Active CN111506500B (zh) | 2020-04-09 | 2020-04-09 | 内存泄露检测方法、装置、电子设备及可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111506500B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112115048A (zh) * | 2020-08-26 | 2020-12-22 | 北京奇艺世纪科技有限公司 | 内存泄露检测方法、装置、电子设备及可读存储介质 |
CN113360407A (zh) * | 2021-07-02 | 2021-09-07 | 北京百度网讯科技有限公司 | 函数的定位方法、装置、电子设备及可读存储介质 |
CN113918377A (zh) * | 2021-12-16 | 2022-01-11 | 深圳软牛科技有限公司 | C++程序崩溃的定位方法、装置、设备及存储介质 |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102053868A (zh) * | 2009-11-04 | 2011-05-11 | 突触计算机系统(上海)有限公司 | 一种内存泄露检测方法和装置 |
CN103455424A (zh) * | 2013-09-18 | 2013-12-18 | 哈尔滨工业大学 | 基于VxWorks操作系统的动态内存泄漏检测方法及装置 |
CN105094710A (zh) * | 2015-09-06 | 2015-11-25 | 国电南瑞科技股份有限公司 | 基于哈希表的单进程动态存储管理方法 |
CN105630662A (zh) * | 2014-10-28 | 2016-06-01 | 腾讯科技(深圳)有限公司 | 内存检测方法和装置 |
CN106055478A (zh) * | 2016-05-31 | 2016-10-26 | 腾讯科技(深圳)有限公司 | 检测内存泄漏的方法和装置 |
CN106802861A (zh) * | 2015-11-26 | 2017-06-06 | 大唐移动通信设备有限公司 | 一种检测内存泄露的方法和装置 |
US20180046585A1 (en) * | 2016-08-11 | 2018-02-15 | Massachusetts Institute Of Technology | Timely address space randomization |
CN108182146A (zh) * | 2017-12-27 | 2018-06-19 | 北京奇艺世纪科技有限公司 | 一种内存泄漏的检测方法及系统 |
CN110618928A (zh) * | 2019-06-25 | 2019-12-27 | 北京无限光场科技有限公司 | 一种内存泄露检测方法、装置、终端设备及介质 |
CN110908865A (zh) * | 2019-11-15 | 2020-03-24 | 珠海豹趣科技有限公司 | 内存泄漏监控方法、装置及电子设备 |
-
2020
- 2020-04-09 CN CN202010272601.3A patent/CN111506500B/zh active Active
Patent Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102053868A (zh) * | 2009-11-04 | 2011-05-11 | 突触计算机系统(上海)有限公司 | 一种内存泄露检测方法和装置 |
CN103455424A (zh) * | 2013-09-18 | 2013-12-18 | 哈尔滨工业大学 | 基于VxWorks操作系统的动态内存泄漏检测方法及装置 |
CN105630662A (zh) * | 2014-10-28 | 2016-06-01 | 腾讯科技(深圳)有限公司 | 内存检测方法和装置 |
CN105094710A (zh) * | 2015-09-06 | 2015-11-25 | 国电南瑞科技股份有限公司 | 基于哈希表的单进程动态存储管理方法 |
CN106802861A (zh) * | 2015-11-26 | 2017-06-06 | 大唐移动通信设备有限公司 | 一种检测内存泄露的方法和装置 |
CN106055478A (zh) * | 2016-05-31 | 2016-10-26 | 腾讯科技(深圳)有限公司 | 检测内存泄漏的方法和装置 |
US20180046585A1 (en) * | 2016-08-11 | 2018-02-15 | Massachusetts Institute Of Technology | Timely address space randomization |
CN108182146A (zh) * | 2017-12-27 | 2018-06-19 | 北京奇艺世纪科技有限公司 | 一种内存泄漏的检测方法及系统 |
CN110618928A (zh) * | 2019-06-25 | 2019-12-27 | 北京无限光场科技有限公司 | 一种内存泄露检测方法、装置、终端设备及介质 |
CN110908865A (zh) * | 2019-11-15 | 2020-03-24 | 珠海豹趣科技有限公司 | 内存泄漏监控方法、装置及电子设备 |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112115048A (zh) * | 2020-08-26 | 2020-12-22 | 北京奇艺世纪科技有限公司 | 内存泄露检测方法、装置、电子设备及可读存储介质 |
CN113360407A (zh) * | 2021-07-02 | 2021-09-07 | 北京百度网讯科技有限公司 | 函数的定位方法、装置、电子设备及可读存储介质 |
CN113360407B (zh) * | 2021-07-02 | 2023-10-13 | 北京百度网讯科技有限公司 | 函数的定位方法、装置、电子设备及可读存储介质 |
CN113918377A (zh) * | 2021-12-16 | 2022-01-11 | 深圳软牛科技有限公司 | C++程序崩溃的定位方法、装置、设备及存储介质 |
CN113918377B (zh) * | 2021-12-16 | 2022-03-25 | 深圳软牛科技有限公司 | C++程序崩溃的定位方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN111506500B (zh) | 2023-05-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9274768B2 (en) | Runtime code hooking for print driver and functionality testing | |
CN111506500B (zh) | 内存泄露检测方法、装置、电子设备及可读存储介质 | |
CN102054149B (zh) | 一种恶意代码行为特征提取方法 | |
US9336018B2 (en) | Mechanism for class data sharing using extension and application class-loaders | |
US20070204261A1 (en) | Robust software library wrapper method and apparatus | |
CN109471697B (zh) | 一种监控虚拟机中系统调用的方法、装置及存储介质 | |
CN110007920B (zh) | 一种获取代码依赖关系的方法、装置及电子设备 | |
US6714991B1 (en) | Method and apparatus for implementing fast subclass and subtype checks | |
CN110609687A (zh) | 一种编译方法、装置、电子设备和存储介质 | |
CN115357940A (zh) | 一种数据处理的方法、装置、存储介质及电子设备 | |
CN113312618A (zh) | 程序漏洞检测方法、装置、电子设备及介质 | |
CN109977020B (zh) | 一种自动化测试方法 | |
CN111625225A (zh) | 一种程序指定数据输出方法和装置 | |
CN112069052A (zh) | 一种异常对象检测方法、装置、设备及存储介质 | |
CN117785540A (zh) | 内存错误检测方法、装置、设备及介质 | |
CN103198244A (zh) | 保护动态链接库的方法 | |
CN113805861B (zh) | 基于机器学习的代码生成方法、代码编辑系统及存储介质 | |
CN115687129A (zh) | 一种覆盖率报告生成方法、装置、存储介质和计算机设备 | |
CN111897559B (zh) | 热更新代码检测方法、装置、电子设备及存储介质 | |
CN114936368A (zh) | 一种Java内存木马检测方法、终端设备及存储介质 | |
CN110633210B (zh) | 文件执行方法、装置、存储介质和电子设备 | |
CN112925523A (zh) | 对象比较方法、装置、设备及计算机可读介质 | |
CN112784264B (zh) | 越狱状态检测方法、装置、设备及存储介质 | |
CN114780952B (zh) | 敏感应用调用场景的检测方法、系统及存储介质 | |
Fu et al. | C++ memory detection tool based on dynamic instrumentation |
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 |