CN114253825A - 内存泄漏检测方法、装置、计算机设备和存储介质 - Google Patents
内存泄漏检测方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN114253825A CN114253825A CN202011002326.XA CN202011002326A CN114253825A CN 114253825 A CN114253825 A CN 114253825A CN 202011002326 A CN202011002326 A CN 202011002326A CN 114253825 A CN114253825 A CN 114253825A
- Authority
- CN
- China
- Prior art keywords
- memory
- dynamic link
- link library
- thread
- abnormal
- 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
- 230000015654 memory Effects 0.000 title claims abstract description 294
- 238000001514 detection method Methods 0.000 title claims abstract description 35
- 230000002159 abnormal effect Effects 0.000 claims abstract description 75
- 230000006870 function Effects 0.000 claims abstract description 60
- 238000000034 method Methods 0.000 claims abstract description 59
- 238000004590 computer program Methods 0.000 claims description 15
- 238000010586 diagram Methods 0.000 description 6
- 238000004891 communication Methods 0.000 description 5
- 238000005516 engineering process Methods 0.000 description 3
- 230000005856 abnormality Effects 0.000 description 2
- 230000004931 aggregating effect Effects 0.000 description 2
- 238000007667 floating Methods 0.000 description 2
- 230000006399 behavior Effects 0.000 description 1
- 230000000903 blocking effect Effects 0.000 description 1
- 230000006378 damage Effects 0.000 description 1
- 230000003111 delayed effect Effects 0.000 description 1
- 238000003745 diagnosis Methods 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
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
-
- 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/3644—Software debugging by instrumenting at runtime
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
本申请涉及一种内存泄漏检测方法、装置、计算机设备和存储介质,所述方法包括:接收待检测应用程序启动信号;获取所述待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息;其中,所述目标范围内各可执行动态链接库文件的内存相关信息为通过调用所述钩子函数得到;基于各所述内存相关信息确定发生内存泄漏的异常可执行动态链接库文件;获取并输出所述异常可执行动态链接库文件的异常堆栈信息。上述内存泄漏检测方法可避免系统无法正常拉起被检测的应用程序的应用进程的问题。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种内存泄漏检测方法、装置、计算机设备和存储介质。
背景技术
内存泄漏是指程序中已动态分配的堆内存由于某种原因程序未释放或者无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。对于长期运行的程序,例如运行在服务器上的服务和操作系统本身,内存泄漏会带来严重的后果,可能会导致系统服务中止。一直以来,内存泄漏都是造成计算机安全事故的主要原因之一。
ASan是一个跨平台C/C++内存错误检测工具集,通过Asan技术实现内存错误的检测需要对内存分配释放函数进行插桩,该过程必须侵入到编译过程,这对于被检测的进程来说成本非常高,对于某些大型应用程序而言在接入Asan之后,很容易造成系统无法正常拉起应用进程。
发明内容
基于此,有必要针对上述技术问题,提供一种能够保证被检测的应用程序能够正常启动的内存泄漏检测方法、装置、计算机设备和存储介质。
一种内存泄漏检测方法,所述方法包括:
接收待检测应用程序启动信号,注册钩子函数;
获取所述待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息;其中,所述目标范围内各可执行动态链接库文件的内存相关信息为通过调用所述钩子函数得到;
基于各所述内存相关信息确定发生内存泄漏的异常可执行动态链接库文件;
获取并输出所述异常可执行动态链接库文件的异常堆栈信息。
一种内存泄漏检测装置,所述装置包括:
初始化模块,用于接收待检测应用程序启动信号,注册钩子函数;
内存相关信息获取模块,用于获取所述待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息;其中,所述目标范围内各可执行动态链接库文件的内存相关信息为通过调用所述钩子函数得到;
异常文件确定模块,用于基于各所述内存相关信息确定发生内存泄漏的异常可执行动态链接库文件;
堆栈信息获取模块,用于获取并输出所述异常可执行动态链接库文件的异常堆栈信息。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
接收待检测应用程序启动信号,注册钩子函数;
获取所述待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息;其中,所述目标范围内各可执行动态链接库文件的内存相关信息为通过调用所述钩子函数得到;
基于各所述内存相关信息确定发生内存泄漏的异常可执行动态链接库文件;
获取并输出所述异常可执行动态链接库文件的异常堆栈信息。
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
接收待检测应用程序启动信号,注册钩子函数;
获取所述待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息;其中,所述目标范围内各可执行动态链接库文件的内存相关信息为通过调用所述钩子函数得到;
基于各所述内存相关信息确定发生内存泄漏的异常可执行动态链接库文件;
获取并输出所述异常可执行动态链接库文件的异常堆栈信息。
上述内存泄漏检测方法、装置、计算机设备和存储介质,在接收到待检测应用程序的启动信号之后注册钩子函数,获取待检测应用程序中一定范围内的可执行动态链接库文件的内存相关信息,其中,待检测应用程序的内存相关信息是通过调用钩子函数得到的;并基于获取的各内存相关信息确定发生内存泄漏的异常可执行动态链接库文件,对于该异常可执行动态链接库文件获取并输出堆栈信息;进而基于堆栈信息可得出发生内存泄漏的具体位置。上述方法中由于对于获取的内存相关信息不会立即进行堆栈信息的获取,而是通过内存相关信息确定发生异常的可执行动态链接库文件之后,再对发生异常的可执行动态链接库文件获取堆栈以定位异常位置,不获取堆栈的情况下,对于待检测应用程序的影响非常小,可避免系统无法正常拉起被检测的应用程序的应用进程的问题。
附图说明
图1为一个实施例中内存泄漏检测方法的流程示意图;
图2为另一个实施例中内存泄漏检测方法的流程示意图;
图3为一个实施例中基于各内存相关信息对应可执行动态链接库文件的名称和内存大小确定发生内存泄漏的异常可执行动态链接库文件的流程示意图;
图4为另一个实施例中内存泄漏检测方法的流程示意图;
图5为一个实施例中基于预设内存中的各堆栈信息确定发生线程泄漏的异常线程的流程示意图;
图6为一个具体实施例中内存泄漏检测方法的流程示意图;
图7为一个实施例中内存泄漏检测装置的结构框图;
图8为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
在一个实施例中,如图1所示,提供了一种内存泄漏检测方法,本实施例以该方法应用于终端进行举例说明,可以理解的是,该方法也可以应用于服务器。本实施例中,该方法包括步骤S110至步骤S140。
步骤S110,接收待检测应用程序启动信号,注册钩子函数。
其中,待检测应用程序为需要进行内存泄漏检测的应用程序;应用程序启动信号为启动该应用程序的启动,可以由用户发起。在一个具体实施例中,注册钩子函数是指注册钩子函数的入口,用于后续钩子函数的插入和调用。
步骤S120,获取待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息;其中,目标范围内各可执行动态链接库文件的内存相关信息为通过调用钩子函数得到。
钩子编程(hooking),也称作“挂钩”,是计算机程序设计术语,指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。处理被拦截的函数调用、事件、消息的代码,被称为钩子(hook)。在本实施例中,可执行动态链接库文件是指so文件,是可执行文件中的一种,在Android(一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统)/linux(全称GNU/Linux,是一套类UNIX操作系统)系统中通常以.so为后缀,其中包含了可执行的指令代码。
其中,目标范围可根据实际情况进行设定。在一个实施例中,内存相关信息包括内存分配信息、内存释放信息、内存分配大小以及内存地址等等。在一个实施例中,调用钩子函数得到内存相关信息包括:调用钩子函数获取待检测应用程序中目标范围内的所有内存分配函数和内存释放函数,基于内存分配函数和内存释放函数确定内存相关信息。
在一个实施例中,如图2所示,在获取待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息之后,还包括步骤S210:若基于各内存相关信息确定未发生内存泄漏,对目标范围进行调整得到新的目标范围,并返回获取待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息的步骤。
若根据内存相关信息确定本次调用钩子函数获取的各可执行动态链接库文件均未发生内存泄漏等异常事件,则调整调用钩子函数获取可执行动态链接库文件的范围,返回重新获取待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息的步骤。
步骤S130,基于各内存相关信息确定发生内存泄漏的异常可执行动态链接库文件。
分别对获取的各内存相关信息进行分析,可确定是否存在出现异常的内存信息,从而可确定对应的可执行动态链接库文件是否发生内存泄漏;进一步地,若确定其中存在发生异常的内存相关信息,即可确定对应的可执行动态链接库文件本实施例中记为异常可执行动态链接库文件;本实施例中将发生内存泄漏的可执行动态链接库文件记为异常可执行动态链接库文件。
在一个实施例中,基于各内存相关信息确定发生内存泄漏的异常可执行动态链接库文件,包括:分别基于内存相关信息中的内存大小和名称确定发生内存泄漏的可执行动态链接库文件。
步骤S140,获取并输出异常可执行动态链接库文件的异常堆栈信息。
堆栈是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的;所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“后进先出(LIFO,last infirst out)”的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。在一个实施例中,获取堆栈信息实际对应的是unwind stacktrace,或者stacktrace unwinding的过程;函数调用会在内存中特定的一块区域(这块内存称为函数栈、或栈内存)中入栈一个栈帧(上述后进先出的一个元素或单元)。每一个栈帧对应了一个函数,每调用一个函数,栈中入栈一个栈帧,每当一个函数结束返回调用点,栈中出栈一个栈帧。通过栈帧中存储的信息,以及CPU的寄存器信息,可以计算出上一个栈帧的地址、对应的函数的地址以及上一个函数运行时的CPU寄存器信息(当前函数的地址记录在CPU的PC寄存器当中),通过重复的运算,可以一直向前推导上一个栈帧对应的函数的地址。如此得到一系列函数地址的过程称为unwind stacktrace,一系列地址结果称为stacktrace。在一个具体实施例中,对于Arm64,使用了Fp unwind实现unwind stacktrace的过程,可以提高unwind的性能。
在本实施例中,当确定存在发生内存泄漏的可执行动态链接库文件时,对该可执行动态链接库文件获取对应的堆栈信息,对堆栈信息进行分析以定位发生内存泄漏的具体位置。
上述内存泄漏检测方法,在接收到待检测应用程序的启动信号之后注册钩子函数,获取通过调用钩子函数得到的待检测应用程序中一定范围内的可执行动态链接库文件的内存相关信息,其中,待检测应用程序的内存相关信息是通过调用钩子函数得到的;并基于获取的各内存相关信息确定发生内存泄漏的异常可执行动态链接库文件,对于该异常可执行动态链接库文件获取并输出堆栈信息;进而基于堆栈信息可得出发生内存泄漏的具体位置。上述方法中由于对于获取的内存相关信息不会立即进行堆栈信息的获取,而是通过内存相关信息确定发生异常的可执行动态链接库文件之后,再对发生异常的可执行动态链接库文件获取堆栈以定位异常位置,不获取堆栈的情况下,对于待检测应用程序的影响非常小,可避免系统无法正常拉起被检测的应用程序的应用进程的问题。
在一个实施例中,基于各内存相关信息确定发生内存泄漏的异常可执行动态链接库文件,包括:读取各内存相关信息对应可执行动态链接库文件的名称和内存大小;基于各内存相关信息对应可执行动态链接库文件的名称和内存大小,确定发生内存泄漏的异常可执行动态链接库文件。
其中,可执行动态链接库文件的内存大小表示该可执行动态链接库文件调用函数时分配的内存大小。
进一步地,在一个实施例中,如图3所示,基于各内存相关信息对应可执行动态链接库文件的名称和内存大小,确定发生内存泄漏的异常可执行动态链接库文件,包括步骤S310至步骤S340。
步骤S310,统计属于同一名称的各可执行动态链接库文件对应的内存大小总和。
属于同一名称的可执行动态链接库文件即为相同名称的可执行动态链接库文件;对应内存大小总和为相同名称的各可执行动态链接库文件对应的内存大小的和值。
步骤S320,对属于同一名称的各可执行动态链接库文件按照内存大小进行聚类,得到聚类结果。
其中,对属于同一名称的各可执行动态链接库文件按照内存大小进行聚类包括:将名称相同的且对应的内存大小相同的各可执行动态链接库文件聚合为一个集合,对所有可执行动态链接库文件进行聚合之后,得到聚类结果。可以理解地,其中一个聚类结果中包含同一名称、同一内存大小的各可执行动态链接库文件。
步骤S330,当属于同一名称的各可执行动态链接库文件对应的内存大小总和超过预设内存大小阈值时,基于聚类结果统计同一内存大小对应的可执行动态链接库文件的数量。
将同一名称的各可执行动态链接库文件对应的内存大小总和与预设内存大小阈值进行比较,若内存大小总和超过预设内存大小阈值,则进一步对该名称对应的各聚类结果中包含的可执行动态链接库文件数量进行分析。其中,预设内存大小阈值的数值可根据实际情况进行设置。
步骤S340,将数量超过预设数量阈值的可执行动态链接库文件确定为发生内存泄漏的异常可执行动态链接库文件。
若某一内存大小对应的可执行动态链接库文件的数量超过预设数量阈值,则确定该可执行动态链接库文件发生内存泄漏,确定为异常可执行动态链接库文件。其中,预设数量阈值的数值大小可根据实际情况进行设置。
上述实施例中,通过统计各可执行动态链接库文件对应内存大小确定发生内存泄漏的异常可执行动态链接库文件,由于不会在获取可执行动态链接库文件时立即进行堆栈获取来确定是否发生内存泄漏,而是通过分析内存相关信息确定是否发生异常,因此这一过程对于待检测应用程序的性能影响较小,可避免检测是否发生内存泄漏的事件导致被检测应用程序的启动失败。同时上述整个过程是在接收到被检测应用程序的启动信号之后进行的,因此对于被检测应用程序的启动产生的影响是微小的。
更进一步地,在一个实施例中,获取通过调用钩子函数得到的待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息之后,还包括:将各内存相关信息采用线程局部存储的方式进行存储。
其中,线程局部存储(TLS,Thread Local Storage),即多个线程可访问的共享数据。在本实施例中,采用线程局部存储的方式存储调用钩子函数获取到的内存相关信息,进一步地,每隔预设时间段对各内存相关信息进行分析,以确定是否存在发生内存泄漏的异常可执行动态链接库文件。
在本实施例中,采用线程局部存储的方式存储调用钩子函数获取到的内存相关信息,可以避免访问公共容器的加锁开销,提高内存并发分配和释放的效率。
在另一个实施例中,如图4所示,上述方法还包括步骤S410至步骤S440。
步骤S410,接收线程创建信号。
其中,线程创建信号为线程创建时对应的信号。其中,线程(thread)是操作系统能够进行运算调度的最小单位;它被包含在进程之中,是进程中的实际运作单位;一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
步骤S420,获取线程创建信号对应线程的堆栈信息,将堆栈信息存储至预设内存。
在本实施例中,预设内存为用于存储获取的线程对应堆栈信息的内存。
步骤S430,若检测到线程销毁信号,将线程销毁信号对应的堆栈信息从预设内存中删除。
线程销毁信号为线程销毁时对应的信号。本实施例中,在接收到线程销毁信号时,从预设内存中找到线程销毁信号所对应线程的堆栈信息,将其从预设内存中删除。
步骤S440,基于预设内存中的各堆栈信息确定发生线程泄漏的异常线程。
本实施例中,由于对于预设内存中存储的堆栈信息,在检测到对应的线程销毁信号时,会将该堆栈信息从预设内存中删除,因此基于预设内存中的堆栈信息可确定是否发生线程泄漏。
在一个实施例中,对于预设内存中的各堆栈信息进行分析确定是否存在发生线程泄漏的异常进程可每隔预设时间段进行;进一步地,在一个实施例中,在分析各堆栈信息时,结合该堆栈信息的缓存时间进行判断,当堆栈信息的缓存时间超过预设缓存时间阈值时,将该堆栈信息进行分析。其中,预设缓存时间阈值可根据实际情况进行设置。
线程泄漏是一种特殊的内存泄漏,线程是系统调度的基本单元,通常发生线程泄漏的原因是在应用程序中创建了线程,但是没有结束释放线程,导致无用的线程累积越来越多;线程泄漏除了会影响应用程序的整体性能以及功耗外,在部分系统上中对于线程数量也有比较严格的限制;本实施例中的方法可用于对线程泄漏进行检测。
在一个实施例中,如图5所示,基于预设内存中的各堆栈信息确定发生线程泄漏的异常线程,包括步骤S510:读取预设内存中各堆栈信息所属线程的线程名称;步骤S520,根据各堆栈信息所属线程的线程名称,确定预设内存中各线程名称对应包含的堆栈信息数量;步骤S530,基于预设内存中各线程名称对应包含的堆栈信息数量确定发生线程泄漏的异常线程。
在本实施例中,在接收到线程创建信号对应线程的堆栈信息时,将堆栈信息存储至预设内存,因此从预设内存中可读取到其中存储的各堆栈信息对应的线程名称,进而根据各堆栈信息对应所属线程的线程名称,可确定各线程名称对应包含的堆栈线程数量,从而得到预设内存中出现的各线程名称对应包含的堆栈信息数量,即预设内存中存储的各堆栈信息确定预设内存中各线程出现的次数。在本实施例中,通过分析同一线程名称对应包含的堆栈信息数量确定是否存在发生线程泄漏的线程。
进一步地,在一个实施例中,将对应包含堆栈信息数量大于预设堆栈阈值的线程确定为发生线程泄漏的线程,即异常线程;即对预设内存中的堆栈信息进行分析,若对应同一线程的堆栈信息数量大于一定数量,则认为该线程可能发生线程泄漏。其中,预设堆栈阈值可根据实际情况进行设置。
上述实施例中,通过在线程创建时获取堆栈进行分析实现对于线程泄漏进行检测;由于线程的创建于销毁相对来说是低频的,加锁和获取对应的堆栈等操作并不会对性能造成太明显的影响,因此本实施例中在每次线程创建时获取对应的堆栈信息,再根据线程名称进行分析确定是否存在发生线程泄漏的线程,可保证较高的性能。
在另一个实施例中,本申请还提供一种应用场景,该应用场景应用上述的内存泄漏检测方法。具体地,该内存泄漏检测方法在该应用场景的应用如下:
本实施例中将上述内存泄漏方法应用于微信业务中进行内存泄漏的检测。如图6所示,包括以下步骤:接收微信(上述待检测应用程序)的启动信号,注册钩子函数;获取通过PLT Hook拦截到微信中目标范围内所有so文件对应的内存分配函数和内存释放函数,基于内存分配函数和内存释放函数确定预设范围内的so文件的内存相关信息(上述可执行动态链接库文件的内存相关信息)。为了实现大范围的hook而尽量减少对性能的影响,在这一步不unwind堆栈,只统计Caller(上述可执行动态链接库文件的名称)、size(上述内存大小)等信息,根据Caller、size等信息确定是否存在发生内存泄漏,若确定存在内存泄漏,进一步根据Caller、size等信息具体的so文件,而后再只针对该so进行hook并unwind堆栈并输出。
在一个具体实施例中,在确定so文件发生内存泄漏时,对该so文件进行unwindstacktrace的示例如下:
进一步地,在接收到线程创建信号时,调用钩子函数获取调用堆栈存储至预设内存,若接收到线程销毁信号则在预设内存中将该线程销毁信号对应的堆栈信息删除;对于预设内存中的堆栈信息进行分析,可确定是否存在线程泄漏。进一步地,基于相同名称的线程数量是否超出正常水平,是否导致总线程数量达到系统的限制来确定是否发生线程泄漏。
上述内存泄漏检测方法,在不获取堆栈的情况下,对性能影响非常小,发现异常时可以迅速定位。对于非必现的内存问题,往往和用户的操作习惯/系统环境等诸多因素相关,提供了排查线上内存泄漏和线程泄漏问题的能力,在用户几乎无感知的情况下即可进行诊断。同时上述内存泄漏检测方法接入方便,不需要重新编译so或者对系统有特殊的要求,可以按需进行配置。
上述方法运行时可配置不同的参数,例如第一步的配置为大范围的Hook并统计,但不获取堆栈,因为获取堆栈这个操作是非常耗时的,目的是为了缩小范围,定位到具体是哪个so(可执行动态链接库文件)在泄漏内存;然后再针对该泄漏内存的so进行小范围的Hook,包括限定so、限定该so的特定大小的内存分配操作精准地获取堆栈,这样可以保证对性能的影响就只局限在这一发生泄漏内存的so内,而对其他的诸如系统的so并不产生影响。此外,通常获取堆栈时立即反解符号信息也非常耗时,并且大部分时候因为随着分配的内存被释放,对应的堆栈也会被清除,并不需要反解符号,上述方法中在获取堆栈时只获取函数地址(即一个32或64个二进制位的正整数),而符号信息则延迟到需要dump并查看的时候再反解;如此可以在性能上满足应用程序正常启动且不会出现明显的掉帧卡顿,以及功能上灵活设置,发现并定的业务需求。
应该理解的是,虽然图1-5的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1-5中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图7所示,提供了一种内存泄漏检测装置,该装置可以采用软件模块或硬件模块,或者是二者的结合成为计算机设备的一部分,该装置具体包括:初始化模块710、内存相关信息获取模块720、异常文件确定模块730和堆栈信息获取模块740,其中:
初始化模块710,用于接收待检测应用程序启动信号,注册钩子函数。
内存相关信息获取模块720,用于获取待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息;其中,目标范围内各可执行动态链接库文件的内存相关信息为通过调用钩子函数得到。
异常文件确定模块730,用于基于各内存相关信息确定发生内存泄漏的异常可执行动态链接库文件。
堆栈信息获取模块740,用于获取并输出异常可执行动态链接库文件的异常堆栈信息。
上述内存泄漏检测装置,在接收到待检测应用程序的启动信号之后注册钩子函数,获取通过调用钩子函数得到的待检测应用程序中一定范围内的可执行动态链接库文件的内存相关信息,其中,待检测应用程序的内存相关信息是通过调用钩子函数得到的;并基于获取的各内存相关信息确定发生内存泄漏的异常可执行动态链接库文件,对于该异常可执行动态链接库文件获取并输出堆栈信息;进而基于堆栈信息可得出发生内存泄漏的具体位置。上述方法中由于对于获取的内存相关信息不会立即进行堆栈信息的获取,而是通过内存相关信息确定发生异常的可执行动态链接库文件之后,再对发生异常的可执行动态链接库文件获取堆栈以定位异常位置,不获取堆栈的情况下,对于待检测应用程序的影响非常小,可避免系统无法正常拉起被检测的应用程序的应用进程的问题。
在一个实施例中,上述装置还包括:目标范围调整模块,用于若基于各内存相关信息确定未发生内存泄漏,对目标范围进行调整得到新的目标范围,并跳转至内存相关信息获取模块720执行获取待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息的步骤。
在一个实施例中,上述装置的异常文件确定模块730包括:读取单元,用于读取各内存相关信息对应可执行动态链接库文件的名称和内存大小;在本实施例中,上述异常文件确定模块730具体用于基于各内存相关信息对应可执行动态链接库文件的名称和内存大小,确定发生内存泄漏的异常可执行动态链接库文件。
在一个实施例中,上述装置的异常文件确定模块730包括:统计子单元,用于统计属于同一名称的各可执行动态链接库文件对应的内存大小总和;聚类子单元,用于对属于同一名称的各可执行动态链接库文件按照内存大小进行聚类,得到聚类结果;数量统计子单元,用于当属于同一名称的各可执行动态链接库文件对应的内存大小总和超过预设内存大小阈值时,基于聚类结果统计同一内存大小对应的可执行动态链接库文件的数量;定位子单元,用于将数量超过预设数量阈值的可执行动态链接库文件确定为发生内存泄漏的异常可执行动态链接库文件。
在一个实施例中,上述装置还包括:存储模块,用于将各内存相关信息采用线程局部存储的方式进行存储。
在一个实施例中,上述装置还包括:接收模块,用于接收线程创建信号;在本实施例中,上述装置还包括:线程堆栈获取模块,用于获取线程创建信号对应线程的堆栈信息,将堆栈信息存储至预设内存;删除模块,用于若检测到线程销毁信号,将线程销毁信号对应的堆栈信息从预设内存中删除;异常线程确定模块,用于基于预设内存中的各堆栈信息确定发生线程泄漏的异常线程。
进一步地,在一个实施例中,上述装置的异常线程确定模块包括:线程名称读取单元,用于读取预设内存中各堆栈信息所属线程的线程名称;堆栈数量确定单元,用于根据各堆栈信息所属线程的线程名称,确定预设内存中各线程名称对应包含的堆栈信息数量;异常线程定位单元,用于基于预设内存中各线程名称对应包含的堆栈信息数量确定发生线程泄漏的异常线程。
关于内存泄漏检测装置的具体限定可以参见上文中对于内存泄漏检测方法的限定,在此不再赘述。上述内存泄漏检测装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图8所示。该计算机设备包括通过系统总线连接的处理器、存储器、通信接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的通信接口用于与外部的终端进行有线或无线方式的通信,无线方式可通过WIFI、运营商网络、NFC(近场通信)或其他技术实现。该计算机程序被处理器执行时以实现一种内存泄漏检测方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
本领域技术人员可以理解,图8中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,还提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各方法实施例中的步骤。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-Only Memory,ROM)、磁带、软盘、闪存或光存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic Random Access Memory,DRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
Claims (10)
1.一种内存泄漏检测方法,其特征在于,所述方法包括:
接收待检测应用程序启动信号,注册钩子函数;
获取所述待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息;其中,所述目标范围内各可执行动态链接库文件的内存相关信息为通过调用所述钩子函数得到;
基于各所述内存相关信息确定发生内存泄漏的异常可执行动态链接库文件;
获取并输出所述异常可执行动态链接库文件的异常堆栈信息。
2.根据权利要求1所述的内存泄漏检测方法,其特征在于,在获取所述待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息之后,还包括:
若基于各所述内存相关信息确定未发生内存泄漏,对所述目标范围进行调整得到新的目标范围,并返回所述获取所述待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息的步骤。
3.根据权利要求1所述的内存泄漏检测方法,其特征在于,所述基于各所述内存相关信息确定发生内存泄漏的异常可执行动态链接库文件,包括:
读取各所述内存相关信息对应可执行动态链接库文件的名称和内存大小;
基于各所述内存相关信息对应可执行动态链接库文件的名称和内存大小,确定发生内存泄漏的异常可执行动态链接库文件。
4.根据权利要求3所述的内存泄漏检测方法,其特征在于,所述基于各所述内存相关信息对应可执行动态链接库文件的名称和内存大小,确定发生内存泄漏的异常可执行动态链接库文件,包括:
统计属于同一名称的各所述可执行动态链接库文件对应的内存大小总和;
对属于同一名称的各所述可执行动态链接库文件按照内存大小进行聚类,得到聚类结果;
当属于同一名称的各所述可执行动态链接库文件对应的内存大小总和超过预设内存大小阈值时,基于所述聚类结果统计同一内存大小对应的可执行动态链接库文件的数量;
将所述数量超过预设数量阈值的可执行动态链接库文件确定为所述发生内存泄漏的异常可执行动态链接库文件。
5.根据权利要求1所述的内存泄漏检测方法,其特征在于,所述获取所述待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息之后,还包括:
将各所述内存相关信息采用线程局部存储的方式进行存储。
6.根据权利要求1所述的内存泄漏检测方法,其特征在于,还包括:
接收线程创建信号;
获取所述线程创建信号对应线程的堆栈信息,将所述堆栈信息存储至预设内存;
若检测到线程销毁信号,将所述线程销毁信号对应的堆栈信息从所述预设内存中删除;
基于所述预设内存中的各堆栈信息确定发生线程泄漏的异常线程。
7.根据权利要求6所述的内存泄漏检测方法,其特征在于,所述基于所述预设内存中的各堆栈信息确定发生线程泄漏的异常线程,包括:
读取所述预设内存中各堆栈信息所属线程的线程名称;
根据各堆栈信息所属线程的线程名称,确定所述预设内存中各线程名称对应包含的堆栈信息数量;
基于所述预设内存中各线程名称对应包含的堆栈信息数量确定发生线程泄漏的异常线程。
8.一种内存泄漏检测装置,其特征在于,所述装置包括:
初始化模块,用于接收待检测应用程序启动信号,注册钩子函数;
内存相关信息获取模块,用于获取所述待检测应用程序中目标范围内各可执行动态链接库文件的内存相关信息;其中,所述目标范围内各可执行动态链接库文件的内存相关信息为通过调用所述钩子函数得到;
异常文件确定模块,用于基于各所述内存相关信息确定发生内存泄漏的异常可执行动态链接库文件;
堆栈信息获取模块,用于获取并输出所述异常可执行动态链接库文件的异常堆栈信息。
9.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至7中任一项所述的方法的步骤。
10.一种计算机可读存储介质,存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至7中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011002326.XA CN114253825B (zh) | 2020-09-22 | 2020-09-22 | 内存泄漏检测方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011002326.XA CN114253825B (zh) | 2020-09-22 | 2020-09-22 | 内存泄漏检测方法、装置、计算机设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114253825A true CN114253825A (zh) | 2022-03-29 |
CN114253825B CN114253825B (zh) | 2024-06-21 |
Family
ID=80789623
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011002326.XA Active CN114253825B (zh) | 2020-09-22 | 2020-09-22 | 内存泄漏检测方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114253825B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116661987A (zh) * | 2022-12-29 | 2023-08-29 | 荣耀终端有限公司 | 内存申请方法和电子设备 |
Citations (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080127038A1 (en) * | 2006-11-23 | 2008-05-29 | Electronics And Telecommunications Research Institute | Apparatus and method for detecting self-executable compressed file |
US20140068351A1 (en) * | 2012-08-28 | 2014-03-06 | Nec Laboratories America, Inc. | Blackbox Memory Monitoring with a Calling Context Memory Map and Semantic Extraction |
CN104516817A (zh) * | 2012-05-15 | 2015-04-15 | 青岛海信移动通信技术股份有限公司 | 一种内存泄漏检测方法及装置 |
CN105912458A (zh) * | 2016-03-28 | 2016-08-31 | 中国电力科学研究院 | 一种用于动态检测c/c++内存泄露的方法及系统 |
CN106610892A (zh) * | 2015-10-23 | 2017-05-03 | 腾讯科技(深圳)有限公司 | 内存泄漏检测方法和装置 |
CN106648549A (zh) * | 2017-01-03 | 2017-05-10 | 北京华胜信泰数据技术有限公司 | 线程栈的处理方法及系统 |
CN106997316A (zh) * | 2017-04-11 | 2017-08-01 | 上海联彤网络通讯技术有限公司 | 内存异常增长的检测系统及方法 |
CN107957941A (zh) * | 2016-10-17 | 2018-04-24 | 腾讯科技(深圳)有限公司 | 移动终端内存泄漏处理方法和装置 |
CN108241560A (zh) * | 2016-12-26 | 2018-07-03 | 北京金山安全软件有限公司 | 内存测试方法、装置及电子设备 |
WO2018227822A1 (zh) * | 2017-06-12 | 2018-12-20 | 平安科技(深圳)有限公司 | 异常堆栈信息获取方法、装置及计算机可读存储介质 |
CN110908865A (zh) * | 2019-11-15 | 2020-03-24 | 珠海豹趣科技有限公司 | 内存泄漏监控方法、装置及电子设备 |
CN111090536A (zh) * | 2019-11-19 | 2020-05-01 | 北京字节跳动网络技术有限公司 | 一种获取内存泄露信息的方法、装置、介质和电子设备 |
CN111274155A (zh) * | 2020-02-25 | 2020-06-12 | 腾讯科技(深圳)有限公司 | 动态库的内存操作记录方法、装置、设备及存储介质 |
-
2020
- 2020-09-22 CN CN202011002326.XA patent/CN114253825B/zh active Active
Patent Citations (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080127038A1 (en) * | 2006-11-23 | 2008-05-29 | Electronics And Telecommunications Research Institute | Apparatus and method for detecting self-executable compressed file |
CN104516817A (zh) * | 2012-05-15 | 2015-04-15 | 青岛海信移动通信技术股份有限公司 | 一种内存泄漏检测方法及装置 |
US20140068351A1 (en) * | 2012-08-28 | 2014-03-06 | Nec Laboratories America, Inc. | Blackbox Memory Monitoring with a Calling Context Memory Map and Semantic Extraction |
CN106610892A (zh) * | 2015-10-23 | 2017-05-03 | 腾讯科技(深圳)有限公司 | 内存泄漏检测方法和装置 |
CN105912458A (zh) * | 2016-03-28 | 2016-08-31 | 中国电力科学研究院 | 一种用于动态检测c/c++内存泄露的方法及系统 |
CN107957941A (zh) * | 2016-10-17 | 2018-04-24 | 腾讯科技(深圳)有限公司 | 移动终端内存泄漏处理方法和装置 |
CN108241560A (zh) * | 2016-12-26 | 2018-07-03 | 北京金山安全软件有限公司 | 内存测试方法、装置及电子设备 |
CN106648549A (zh) * | 2017-01-03 | 2017-05-10 | 北京华胜信泰数据技术有限公司 | 线程栈的处理方法及系统 |
CN106997316A (zh) * | 2017-04-11 | 2017-08-01 | 上海联彤网络通讯技术有限公司 | 内存异常增长的检测系统及方法 |
WO2018227822A1 (zh) * | 2017-06-12 | 2018-12-20 | 平安科技(深圳)有限公司 | 异常堆栈信息获取方法、装置及计算机可读存储介质 |
CN110908865A (zh) * | 2019-11-15 | 2020-03-24 | 珠海豹趣科技有限公司 | 内存泄漏监控方法、装置及电子设备 |
CN111090536A (zh) * | 2019-11-19 | 2020-05-01 | 北京字节跳动网络技术有限公司 | 一种获取内存泄露信息的方法、装置、介质和电子设备 |
CN111274155A (zh) * | 2020-02-25 | 2020-06-12 | 腾讯科技(深圳)有限公司 | 动态库的内存操作记录方法、装置、设备及存储介质 |
Non-Patent Citations (4)
Title |
---|
刘发贵;温宇龙;罗春威;: "嵌入式软件动态内存检测工具的设计与实现", 计算机工程, no. 20, 20 October 2009 (2009-10-20) * |
刘小燕;闫振宇;韩啸;杨坤;陈献庆;: "嵌入式装置内存泄漏检测系统的设计与实现", 电子设计工程, no. 08, 20 April 2018 (2018-04-20) * |
甘红星;金大海;宫云战;: "基于源代码的内存泄漏静态分析方法", 内蒙古大学学报(自然科学版), no. 05, 15 September 2011 (2011-09-15) * |
高海昌;冯博琴;卫鹏;何杭军;: "Linux下可执行文件的动态内存检测设计与实现", 计算机工程, no. 01, 5 January 2007 (2007-01-05) * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116661987A (zh) * | 2022-12-29 | 2023-08-29 | 荣耀终端有限公司 | 内存申请方法和电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN114253825B (zh) | 2024-06-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9032254B2 (en) | Real time monitoring of computer for determining speed and energy consumption of various processes | |
US8423718B2 (en) | Low-overhead run-time memory leak detection and recovery | |
US7765528B2 (en) | Identifying sources of memory retention | |
CN108874624B (zh) | 服务器、监控Java进程的方法及存储介质 | |
US7908521B2 (en) | Process reflection | |
US8397048B2 (en) | Memory leak detection during dynamic memory allocation | |
US20070083792A1 (en) | System and method for error detection and reporting | |
US6817011B1 (en) | Memory allocation profiling to discover high frequency allocators | |
CN114328102A (zh) | 设备状态监控方法、装置、设备及计算机可读存储介质 | |
US8307246B2 (en) | Real time monitoring of computer for determining speed of various processes | |
US9575827B2 (en) | Memory management program, memory management method, and memory management device | |
US20120072779A1 (en) | Memory leak monitoring device and method for monitoring memory leak | |
CN110674149B (zh) | 业务数据处理方法、装置、计算机设备和存储介质 | |
US9009537B2 (en) | Diagnostic data capture in a computing environment | |
US8489938B2 (en) | Diagnostic data capture in a computing environment | |
CN114253825A (zh) | 内存泄漏检测方法、装置、计算机设备和存储介质 | |
KR102254159B1 (ko) | 운영체제 커널 메모리의 실시간 오류 검출 방법 | |
US8271711B2 (en) | Program status detecting apparatus and method | |
CN115543677A (zh) | 一种可纠正错误处理方法、装置、设备及可读存储介质 | |
CN113220495B (zh) | 一种进程异常事件处理方法、装置、电子设备及存储介质 | |
CN113485846A (zh) | 一种内存处理方法及装置 | |
CN113609478A (zh) | 一种ios平台应用程序篡改检测方法及装置 | |
US11989572B2 (en) | Computer system enabled with runtime software module tracking | |
CN113157513A (zh) | 一种堆内存破坏检测方法、装置、电子设备及存储介质 | |
CN117971538A (zh) | 一种内存异常检测方法、装置、电子设备及存储介质 |
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 |