CN111639018B - 一种内存泄漏检测方法和装置 - Google Patents

一种内存泄漏检测方法和装置 Download PDF

Info

Publication number
CN111639018B
CN111639018B CN201910156442.8A CN201910156442A CN111639018B CN 111639018 B CN111639018 B CN 111639018B CN 201910156442 A CN201910156442 A CN 201910156442A CN 111639018 B CN111639018 B CN 111639018B
Authority
CN
China
Prior art keywords
memory
target process
image file
occupied
mirror image
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
CN201910156442.8A
Other languages
English (en)
Other versions
CN111639018A (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.)
Alibaba Group Holding Ltd
Original Assignee
Alibaba Group Holding 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 Alibaba Group Holding Ltd filed Critical Alibaba Group Holding Ltd
Priority to CN201910156442.8A priority Critical patent/CN111639018B/zh
Publication of CN111639018A publication Critical patent/CN111639018A/zh
Application granted granted Critical
Publication of CN111639018B publication Critical patent/CN111639018B/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/366Software debugging using diagnostics
    • 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

本公开涉及一种内存泄漏检测方法和装置。该方法包括:通过Hook目标进程运行过程中每个内存操作对应的内存操作相关函数,确定每个内存操作对应的内存分配信息;根据每个内存操作对应的内存分配信息,生成内存镜像文件;根据内存镜像文件,检测所述目标进程运行过程中是否出现内存泄漏。本公开可以实现对目标进程运行过程中是否发生内存泄漏的有效检测。

Description

一种内存泄漏检测方法和装置
技术领域
本公开涉及计算机技术领域,尤其涉及一种内存泄漏检测方法和装置。
背景技术
内存泄漏也称作“存储渗漏”,指的是程序运行过程中动态分配的内存在使用完毕后未释放或无法释放的现象。内存泄漏会造成内存的浪费,以及导致程序运行速度减慢甚至崩溃等严重后果。因此,亟需一种有效的内存泄漏检测方法检测程序运行过程中是否发生了内存泄漏。
发明内容
有鉴于此,本公开提出了一种内存泄漏检测方法和装置,使得可以实现对目标进程运行过程中是否发生内存泄漏的有效检测。
根据本公开的第一方面,提供了一种内存泄漏检测方法,包括:通过Hook目标进程运行过程中每个内存操作对应的内存操作相关函数,确定每个内存操作对应的内存分配信息;根据每个内存操作对应的内存分配信息,生成内存镜像文件;根据内存镜像文件,检测所述目标进程运行过程中是否出现内存泄漏。
在一种可能的实现方式中,所述方法还包括:当检测到所述目标进程运行过程中出现内存泄漏时,根据内存镜像文件定位内存泄漏位置。
在一种可能的实现方式中,所述内存操作相关函数包括下述至少一种:malloc函数、calloc函数、free函数、mmap函数,和munmap函数。
在一种可能的实现方式中,根据每个内存操作对应的内存分配信息,生成内存镜像文件,包括:确定第一时刻所述目标进程占用的内存大小;若所述第一时刻所述目标进程占用的内存大小大于等于第一阈值,根据所述第一时刻之前每个内存操作对应的内存分配信息,生成所述目标进程在所述第一时刻对应的内存镜像文件。
在一种可能的实现方式中,所述第一时刻为首次生成内存镜像文件的时刻,所述方法还包括:确定第一时刻后的第二时刻所述目标进程占用的内存大小;若所述第二时刻所述目标进程占用的内存大小相比于上次生成内存镜像文件时所述目标进程占用的内存大小增加第二阈值,根据所述第二时刻之前每个内存操作对应的内存分配信息,生成所述目标进程在所述第二时刻对应的内存镜像文件。
在一种可能的实现方式中,所述目标进程占用的内存大小为VmSize或VmRSS。
在一种可能的实现方式中,根据每个内存操作对应的内存分配信息,生成内存镜像文件,包括:接收用户输入的内存镜像文件生成指令;通过响应所述内存镜像文件生成指令,根据所述内存镜像文件生成指令的响应时刻之前每个内存操作对应的内存分配信息,生成所述响应时刻对应的内存镜像文件。
在一种可能的实现方式中,内存镜像文件中包括:所述目标进程占用的VmSize和所述目标进程占用的VmRSS。
在一种可能的实现方式中,所述目标进程占用的VmSize包括下述至少一种:通过malloc函数分配的内存信息、通过mmap函数分配的内存信息、所述目标进程运行过程中未跟踪到的内存信息、确定所述目标进程运行过程中每个内存操作对应的内存分配信息所占用的内存信息、所述目标进程中的线程栈占用的内存信息。
在一种可能的实现方式中,所述方法还包括:解析内存镜像文件,以及按照预设展示方式对解析后的内存镜像文件进行展示。
在一种可能的实现方式中,所述预设展示方式为按照时间分布进行展示;按照预设展示方式对解析后的内存镜像文件进行展示,包括:对所述目标进程运行过程中任一时间点下所述目标进程占用的VmSize和所述目标进程占用的VmRSS进行展示。
在一种可能的实现方式中,所述预设展示方式为按照类别分布进行展示;按照预设展示方式对解析后的内存镜像文件进行展示,包括:对所述目标进程运行过程中占用的内存信息按照至少一个层级的类别进行分类展示。
在一种可能的实现方式中,按照预设展示方式对解析后的内存镜像文件进行展示,包括:按照所述预设展示方式,使用html文件对解析后的内存镜像文件进行展示。
在一种可能的实现方式中,所述方法还包括:根据每个内存操作对应的内存分配信息,生成内存日志文件。
在一种可能的实现方式中,所述方法还包括:根据内存镜像文件,检测所述目标进程运行过程中是否出现内存占用过大。
根据本公开的第二方面,提供了一种内存泄漏检测装置,包括:内存Hook模块,用于通过Hook目标进程运行过程中每个内存操作对应的内存操作相关函数,确定每个内存操作对应的内存分配信息;内存镜像文件生成模块,用于根据每个内存操作对应的内存分配信息,生成内存镜像文件;检测模块,用于根据内存镜像文件,检测所述目标进程运行过程中是否出现内存泄漏。
在一种可能的实现方式中,所述装置还包括:内存泄漏定位模块,用于当检测到所述目标进程运行过程中出现内存泄漏时,根据内存镜像文件定位内存泄漏位置。
在一种可能的实现方式中,所述内存操作相关函数包括下述至少一种:malloc函数、calloc函数、free函数、mmap函数,和munmap函数。
在一种可能的实现方式中,所述内存镜像文件生成模块包括:确定子模块,用于确定第一时刻所述目标进程占用的内存大小;第一生成子模块,用于若所述第一时刻所述目标进程占用的内存大小大于等于第一阈值,根据所述第一时刻之前每个内存操作对应的内存分配信息,生成所述目标进程在所述第一时刻对应的内存镜像文件。
在一种可能的实现方式中,所述第一时刻为首次生成内存镜像文件的时刻,所述确定子模块,还用于确定所述第一时刻后的第二时刻所述目标进程占用的内存大小;所述第一生成子模块,还用于若所述第二时刻所述目标进程占用的内存大小相比于上次生成内存镜像文件时所述目标进程占用的内存大小增加第二阈值,根据所述第二时刻之前每个内存操作对应的内存分配信息,生成所述目标进程在所述第二时刻对应的内存镜像文件。
在一种可能的实现方式中,所述目标进程占用的内存大小为VmSize或VmRSS。
在一种可能的实现方式中,所述内存镜像文件生成模块包括:接收子模块,用于接收用户输入的内存镜像文件生成指令;第二生成子模块,用于通过响应所述内存镜像文件生成指令,根据所述内存镜像文件生成指令的响应时刻之前每个内存操作对应的内存分配信息,生成所述响应时刻对应的内存镜像文件。
在一种可能的实现方式中,内存镜像文件中包括:所述目标进程占用的VmSize和所述目标进程占用的VmRSS。
在一种可能的实现方式中,所述目标进程占用的VmSize包括下述至少一种:通过malloc函数分配的内存信息、通过mmap函数分配的内存信息、所述目标进程运行过程中未跟踪到的内存信息、确定所述目标进程运行过程中每个内存操作对应的内存分配信息所占用的内存信息、所述目标进程中的线程栈占用的内存信息。
在一种可能的实现方式中,所述装置还包括:解析模块,用于解析内存镜像文件;展示模块,用于按照预设展示方式对解析后的内存镜像文件进行展示。
在一种可能的实现方式中,所述预设展示方式为按照时间分布进行展示;所述展示模块具体用于:对所述目标进程运行过程中任一时间点下所述目标进程占用的VmSize和所述目标进程占用的VmRSS进行展示。
在一种可能的实现方式中,所述预设展示方式为按照类别分布进行展示;所述展示模块具体用于:对所述目标进程运行过程中占用的内存信息按照至少一个层级的类别进行分类展示。
在一种可能的实现方式中,所述展示模块具体用于:按照所述预设展示方式,使用html文件对解析后的内存镜像文件进行展示。
在一种可能的实现方式中,所述装置还包括:内存日志文件生成模块,用于根据每个内存操作对应的内存分配信息,生成内存日志文件。
在一种可能的实现方式中,所述检测模块,还用于根据内存镜像文件,检测所述目标进程运行过程中是否出现内存占用过大。
根据本公开的第三方面,提供了一种内存泄漏检测装置,包括:处理器;用于存储处理器可执行指令的存储器;其中,所述处理器被配置为执行上述第一方面所述的内存泄漏检测方法。
根据本公开的第四方面,提供了一种非易失性计算机可读存储介质,其上存储有计算机程序指令,其中,所述计算机程序指令被处理器执行时实现上述第一方面所述的内存泄漏检测方法。
通过Hook目标进程运行过程中每个内存操作对应的内存操作相关函数,确定每个内存操作对应的内存分配信息,根据每个内存操作对应的内存分配信息生成内存镜像文件,进而根据内存镜像文件检测目标进程运行过程中是否出现内存泄漏,从而可以实现对目标进程运行过程中是否发生内存泄漏的有效检测。
根据下面参考附图对示例性实施例的详细说明,本公开的其它特征及方面将变得清楚。
附图说明
包含在说明书中并且构成说明书的一部分的附图与说明书一起示出了本公开的示例性实施例、特征和方面,并且用于解释本公开的原理。
图1示出本公开一实施例的内存泄漏检测方法的流程示意图;
图2示出本公开一实施例的按照时间分布展示解析后的内存镜像文件的示意图;
图3示出本公开一实施例中缩放图2中时间粒度后的内存镜像文件的示意图;
图4示出本公开一实施例的按照类别分布展示解析后的内存镜像文件的示意图;
图5示出本公开一实施例的内存泄漏检测装置的结构示意图;
图6示出本公开一实施例的电子设备的结构示意图。
具体实施方式
以下将参考附图详细说明本公开的各种示例性实施例、特征和方面。附图中相同的附图标记表示功能相同或相似的元件。尽管在附图中示出了实施例的各种方面,但是除非特别指出,不必按比例绘制附图。
在这里专用的词“示例性”意为“用作例子、实施例或说明性”。这里作为“示例性”所说明的任何实施例不必解释为优于或好于其它实施例。
另外,为了更好的说明本公开,在下文的具体实施方式中给出了众多的具体细节。本领域技术人员应当理解,没有某些具体细节,本公开同样可以实施。在一些实例中,对于本领域技术人员熟知的方法、手段、元件和电路未作详细描述,以便于凸显本公开的主旨。
应用程序(APP,Application)中的Native层指的是使用C/C++语言编写的模块或组件。目前,APP(例如,安卓Android系统中的APP)在运行过程中,Native层对应的内存分配和使用较灵活,而系统提供的内存使用信息(meminfo,memory information)是非常粗略的,开发者无法对Native层的内存具体使用信息进行分析,进而也无法对APP运行过程中Native层是否出现内存泄漏进行有效检测。
正如背景技术中所述,程序运行过程中出现内存泄漏会导致程序运行速度减慢甚至崩溃等严重后果,因此,当APP运行过程中Native层出现内存泄漏时,会导致APP运行速度减慢、稳定性变差甚至崩溃等问题,影响用户的使用体验。
本公开提供的内存泄漏检测方法可以有效应用于对APP运行过程中Native层是否发生内存泄漏进行检测,同样也可以应用于其它内存泄漏检测场景,本公开对此不作具体限定。下面详细介绍本公开提供的内存泄漏检测方法。
图1示出本公开一实施例的内存泄漏检测方法的流程示意图。如图1所示,该方法可以包括:
步骤S11,通过Hook目标进程运行过程中每个内存操作对应的内存操作相关函数,确定每个内存操作对应的内存分配信息。
步骤S12,根据每个内存操作对应的内存分配信息,生成内存镜像文件。
步骤S13,根据内存镜像文件,检测目标进程运行过程中是否出现内存泄漏。
APP在移动终端(例如,手机)中运行时,移动终端的操作系统(例如,Android系统)为APP创建一个或多个进程来进行内存资源分配和调度。本公开可以以进程为单位进行内存泄漏检测,通过Hook APP中目标进程运行过程中每个内存操作(例如,针对于Native层的内存操作)对应的内存操作相关函数,可以确定每个内存操作对应的内存分配信息(例如,分配内存资源,或释放内存资源),根据每个内存操作对应的内存分配信息可以生成目标进程的内存镜像文件,内存镜像文件中可以包括目标进程的内存使用详情,进而根据内存镜像文件可以检测目标进程运行过程中是否出现内存泄漏。
在一示例中,本公开提供一种内存泄漏分析工具(Memhook),针对于安装有Memhook的移动终端,当启动APP后,Memhook可以通过Hook APP中目标进程运行过程中每个内存操作对应的内存操作相关函数,从而确定每个内存操作对应的内存分配信息。
Memhook可以提供自动安装脚本,使用简单的命令即可在具有系统用户及权限(root)的移动终端中完成Memhook的安装,提高了Memhook的兼容性。
在一种可能的实现方式中,内存操作相关函数包括下述至少一种:malloc函数、calloc函数、free函数、mmap函数,和munmap函数。
内存操作相关函数除了可以包括上述记载之外,还可以包括其它内存操作相关函数,本公开对此不作具体限定。
例如,Memhook可以提供动态链接库libmemhook.so,在libmemhook.so中定义了malloc函数、calloc函数、free函数、mmap函数,和munmap函数等一系列内存操作相关函数。Memhook可以使用预加载机制,在目标进程启动的最开始(尚未加载其它动态链接库),预先加载libmemhook.so。在目标进程运行过程中加载其它动态链接库(so库)时,将其它so库使用的内存操作相关函数指向libmemhook.so中实现,使得Memhook可以Hook到每个内存操作对应的内存操作相关函数,进而Memhook可以确定并记录每个内存操作对应的内存分配信息,其中,内存分配信息可以包括内存资源分配大小、时间、调用栈等。
在确定目标进程运行过程中每个内存操作对应的内存分配信息后,根据每个内存操作对应的内存分配信息生成内存镜像文件,其中,生成内存镜像文件的方式包括下述至少两种方式。
第一种:自动生成。
在一种可能的实现方式中,根据每个内存操作对应的内存分配信息,生成内存镜像文件,包括:确定第一时刻目标进程占用的内存大小;若第一时刻目标进程占用的内存大小大于等于第一阈值,根据第一时刻之前每个内存操作对应的内存分配信息,生成目标进程在第一时刻对应的内存镜像文件。
在一种可能的实现方式中,目标进程占用的内存大小为VmSize或VmRSS。
在目标进程运行过程中的第一时刻(可以为任一时刻)确定目标进程占用的内存大小,若第一时刻目标进程占用的内存大小大于等于第一阈值,表示目标进程可能出现了内存泄漏,则根据第一时刻之前每个内存操作对应的内存分配信息,自动生成目标进程在第一时刻对应的内存镜像文件,从而实现及时检测目标进程是否出现内存泄漏。本公开对第一阈值的具体取值不作限定。
例如,当目标进程在第一时刻占用的VmSize大于等于2800MB(第一阈值),或当目标进程在第一时刻占用的VmRSS大于等于600MB(第一阈值)时,Memhook可以根据第一时刻之前每个内存操作对应的内存分配信息,在/sdcard/memhook/中自动生成目标进程在第一时刻对应的内存镜像文件。
在一种可能的实现方式中,第一时刻为首次生成内存镜像文件的时刻,还包括:确定第一时刻后的第二时刻目标进程占用的内存大小;若第二时刻目标进程占用的内存大小相比于上次生成内存镜像文件时目标进程占用的内存大小增加第二阈值,根据第二时刻之前每个内存操作对应的内存分配信息,生成目标进程在第二时刻对应的内存镜像文件。
目标进程在某一时刻占用的内存大小大等于第一阈值,可能是目标进程出现内存泄漏,也可能是目标进程出现内存占用过大。为了精确检测目标进程运行过程中是否出现内存泄漏,在目标进程占用的内存大小大于等于第一阈值的第一时刻首次自动生成内存镜像文件之后,确定第一时刻后的第二时刻目标进程占用的内存大小,若第二时刻目标进程占用的内存大小相比于上次生成内存镜像文件时目标进程占用的内存大小增加第二阈值,则根据第二时刻之前每个内存操作对应的内存分配信息,自动生成目标进程在第二时刻对应的内存镜像文件,从而实现精确检测目标进程是否出现内存泄漏。本公开对第二阈值的具体取值不作限定。
例如,当目标进程在第二时刻占用的VmSize相比于上次生成内存镜像文件时目标进程占用的VmSize增加100MB(第二阈值),或当目标进程在第二时刻占用的VmRSS相比于上次生成内存镜像文件时目标进程占用的VmRSS增加80MB(第二阈值)时,Memhook可以根据第二时刻之前每个内存操作对应的内存分配信息,在/sdcard/memhook/中自动生成目标进程在第二时刻对应的内存镜像文件。
Memhook自动生成目标进程对应的内存镜像文件的次数不作具体限定。
第二种:手动生成。
在一种可能的实现方式中,还包括:根据每个内存操作对应的内存分配信息,生成内存日志文件。
例如,目标进程运行过程中,Memhook可以根据每个内存操作对应的内存分配信息,向命令行工具logcat中输出目标进程对应的内存概要和内存详情,以使得生成标签(tag)为mem的内存日志文件。
在一示例中,内存概要的输出频率较高,例如,每执行6万次内存操作输出一次内存概要;内存详情的输出频率较低,例如,每连续输出10次内存概要输出一次内存详情。
内存概要中可以包括下述至少一种:通过malloc函数分配的内存信息、通过mmap函数分配的内存信息、Memhook自身使用的内存、目标进程运行过程中Memhook未跟踪到的内存信息、目标进程中线程栈占用的内存信息、显存信息。
内存概要中还可以包括:Memhook Hook到的目标进程占用的VmSize的累加值、系统底层maps中确定的目标进程占用的VmSize的累加值、系统底层status中获取到的目标进程占用的VmSize的累加值,以及系统底层确定的目标进程占用的VmRSS。
在一示例中,内存信息和/或占用的VmSize/VmRSS的数值大小的单位可以为kb,本公开对此不作具体限定。
内存详情可以为根据通过malloc函数分配的内存信息、通过mmap函数分配的内存信息、目标进程运行过程中Memhook未跟踪到的内存信息、目标进程中线程栈占用的内存信息,以及显存信息,进一步按照申请内存的so库得到的内存使用详细信息。
内存详情中还可以包括为目标进程分配的且未被释放的内存个数(count)。
根据内存日志文件可以实时了解到目标进程运行过程中的内存使用情况,使得在发现可能出现内存泄漏时,用户可以通过输入内存镜像文件生成指令,实现手动生成内存镜像文件。
在一种可能的实现方式中,根据每个内存操作对应的内存分配信息,生成内存镜像文件,包括:接收用户输入的内存镜像文件生成指令;通过响应内存镜像文件生成指令,根据内存镜像文件生成指令的响应时刻之前每个内存操作对应的内存分配信息,生成响应时刻对应的内存镜像文件。
在一示例中,Memhook启动后,可以在/sdcard/memhook/中自动创建一个命令文件,文件名可以为/sdcard/memhook/pipe_com.UCMobile,其中,UCMobile为目标进程的进程名。用户希望获取UCMobile的内存镜像文件时,可以使用echo命令向该命令文件中写入内存镜像文件生成指令。Memhook定期检测该命令文件,当检测到该命令文件中包括内存镜像文件生成指令时,读取并响应该存镜像文件生成指令,根据响应时刻之前每个内存操作对应的内存分配信息,生成响应时刻对应的内存镜像文件。其中,Memhook读取命令文件中包括的内存镜像文件生成指令之后,删除该内存镜像文件生成指令,以便用户下一次写入内存镜像文件生成指令。
在一示例中,用户通过在adb.shell中执行“内存镜像文件生成指令”>/sdcard/memhook/pipe_com.UCMobile向命令文件中写入内存镜像文件生成指令。其中,内存镜像文件生成指令中可以包括下述至少一种目标值:all、mmap、malloc和other。all表示响应该内存镜像文件生成指令,可以根据目标进程运行过程中的所有内存信息生成内存镜像文件;malloc表示响应该内存镜像文件生成指令,可以根据通过malloc函数分配的内存信息生成内存镜像文件;mmap表示响应该内存镜像文件生成指令,可以根据通过mmap函数分配的内存信息生成内存镜像文件;other表示响应该内存镜像文件生成指令,可以根据目标进程运行过程中通过malloc函数分配的内存信息和通过mmap函数分配的内存信息以外的其它内存信息生成内存镜像文件。
在一种可能的实现方式中,内存镜像文件中包括:目标进程占用的VmSize和目标进程占用的VmRSS。
相比于现有的内存分析工具仅能够分析VmSize,本公开生成的内存镜像文件中包括目标进程占用的VmSize和VmRSS,使得根据内存镜像文件可以更加精确地检测目标进程是否出现内存泄漏。
在一种可能的实现方式中,目标进程占用的VmSize包括下述至少一种:通过malloc函数分配的内存信息、通过mmap函数分配的内存信息、目标进程运行过程中未跟踪到的内存信息、确定目标进程运行过程中每个内存操作对应的内存分配信息所占用的内存信息、目标进程中的线程栈占用的内存信息。
目标进程占用的VmSize除了可以包括上述记载之外,还可以包括其它内存信息,本公开对此不作具体限定。
在一种可能的实现方式中,还包括:当检测到目标进程运行过程中出现内存泄漏时,根据内存镜像文件定位内存泄漏位置。
由于内存镜像文件中包括目标进程占用的VmSize和VmRSS,且VmSize中可以包括各个内存操作对应的内存分配信息,使得根据内存镜像文件检测到目标进程运行过程中出现内存泄漏后,还可以根据内存镜像文件来精确定位内存泄漏位置。
在一种可能的实现方式中,还包括:解析内存镜像文件,以及按照预设展示方式对解析后的内存镜像文件进行展示。
在根据内存镜像文件检测内存泄漏时,可以解析内存镜像文件之后,按照预设展示方式对解析后的内存镜像文件进行展示,以减少检测者查看内存镜像文件需要的专业知识,便于检测者快速进行内存泄漏检测和定位。
在一示例中,可以使用脚本pull2parse.py将内存镜像文件从移动终端中拉取到检测终端(例如,PC端),以及根据申请内存的so库进行addr2line解析,解析后的内存镜像文件中包括每次内存操作对应的内存操作相关函数、源代码和行号信息等。
在一示例中,当使用脚本pull2parse.py将内存镜像文件从移动终端中拉取到检测终端后,或已经对内存镜像文件进行过一次解析但未解析完全时,可以使用脚本memparser.py对内存镜像文件进行二次解析。
在一种可能的实现方式中,按照预设展示方式对解析后的内存镜像文件进行展示,包括:按照预设展示方式,使用html文件对解析后的内存镜像文件进行展示。
使用html文件对解析后的内存镜像文件进行展示,界面和操作十分简单,使得可以降低检测者根据内存镜像文件检测和定位内存泄漏的难度。
在一种可能的实现方式中,预设展示方式为按照时间分布进行展示;按照预设展示方式对解析后的内存镜像文件进行展示,包括:对目标进程运行过程中任一时间点下目标进程占用的VmSize和目标进程占用的VmRSS进行展示。
图2示出本公开一实施例的按照时间分布展示解析后的内存镜像文件的示意图。如图2所示,使用正弦曲线对目标进程运行过程(0-88s)中占用的VmSize(实线)和VmRSS(虚线)进行展示。使用鼠标在图中移动时,可以显示鼠标所在位置的内存使用信息(虚线框):时间、VmSize和VmRSS(例如,时间:16s-17s,VmSize:14.738MB,VmRSS:11.464MB)。
在一示例中,可以通过滚动鼠标中间键缩放图2所示展示图中的时间粒度,以显示其中某一时间范围内的内存使用细节。图3示出本公开一实施例中缩放图2中时间粒度后的内存镜像文件的示意图。如图3所示,对图2中33s-47s内的内存使用细节进行展示。
在一示例中,根据检测内存泄漏的需要,可以通过按下Ctrl键后,使用鼠标移动图2所示展示图中的时间区间,以便于对不同时间区间的内存使用情况进行分析。
在一种可能的实现方式中,预设展示方式为按照类别分布进行展示;按照预设展示方式对解析后的内存镜像文件进行展示,包括:对目标进程运行过程中占用的内存信息按照至少一个层级的类别进行分类展示。
图4示出本公开一实施例的按照类别分布展示解析后的内存镜像文件的示意图。如图2所示,对目标进程运行过程中占用的内存信息按照多个层级的类别进行分类展示,第一层级为total,第一层级下包括六个第二层级:mmap、mmap files、untracked files、malloc、memhook、stack。第二层级下将调用内存操作相关函数的so库作为第三层级,第三层级下按照内存分配时的调用栈进一步对内存信息进行分类展示。
在一示例中,第二层级mmap下可以为通过mmap函数分配的内存信息,第二层级mmap files下为mmap中具有对应映射文件的内存信息。第二层级mmap files下先按文件扩展名或者路径中第一个目录名为第一级子分类,第二级子类别为完整的文件路径、第三级子类别及之后为对应的调用栈。
在一示例中,第二层级untracked files下可以为目标进程运行过程中Memhook未跟踪到的内存,可以通过/proc/self/maps计算得到,这部分主要为目标进程所在移动终端系统中的可执行程序库文件,如.so,.odex等.
在一示例中,第二层级malloc下可以为所有通过libc.so实现的通过malloc函数分配的内存信息,例如,在Android 5.0及之后,这部分通常同时被包含在libc.so的mmap内存中,Memhook在计算总内存时会根据实际情况决定是否加上通过malloc函数分配的内存信息的内存值。
在一示例中,第二层级memhook下可以为Memhook为了确定并记录每个内存操作对应的内存分配信息和调用栈等信息消耗的内存。
在一示例中,第二层级stack下可以为目标进程中所有线程的栈占用的内存。每个线程在创建时系统会为其分配出1MB左右的内存作为调用栈,进而可以知道目标进程创建了多少线程、每个线程的名字、以及具体的调用栈。在Android 5.0及之后,这部分通常同时被包含在libc.so的mmap内存中。
在一示例中,对目标进程运行过程中占用的内存信息按照至少一个层级的类别进行分类展示的展示图中,还可以包含以下至少一种功能:1)与按照时间分布展示的展示图进行互相联动更新;2)任一层级前设置“+”按钮,当点击“+”按钮时,可展示其对应的子层级;3)当鼠标移动到某个层级时,可在其前面显示“++”按钮,在点击“++”按钮时,可一次性展开该层级下的多个子层级,一次性展开的子层级的级数可设置;4)每个层级前设置勾选框,去掉对该勾选框的勾选后,该层级及其子层级会变灰(不可展开显示状态);5)当某一层级下只有部分子层级被勾选时,该层级会变为半勾选选状态(只有部分子层级可展开显示);6)任一层级中设置“i”按钮,当点击“i”按钮时,可显示该层级对应的内存操作使用函数详情、或源代码完整路径及行号信息;7)任一层级中设置“s”按钮,当点击“s”按钮时,可显示该层级的调用栈,当该层级中包括多个子层级时,可以按一定的算法选择较合适的子层级进行调用栈的展示;8)内存信息经过转换后,自动选择合适的单位(MB,kB,或B)显示;9)可将调用栈中复杂难懂的stl函数名简化成可读性好、直观的名称,如将std::__ndk1::basic_string<char,...,...>转换为std::string,另外可以支持的stl还有std::map,std::vector等容器。
在一种可能的实现方式中,当生成目标进程对应的多个内存镜像文件时,可以将多个内存镜像文件进行对比,计算出不同内存镜像文件之间的差异,以进一步对目标进程中是否出现内存泄漏精确进行检测及定位。
在一种可能的实现方式中,还包括:根据内存镜像文件,检测目标进程运行过程中是否出现内存占用过大。
由于内存镜像文件中包括目标进程占用的VmSize和VmRSS,且VmSize中可以包括各个内存操作对应的内存分配信息,使得还根据内存镜像文件检测到目标进程运行过程中出现内存占用过大。
内存镜像文件除了可以对目标进程运行过程中的内存泄漏问题、内存占用过大问题进行分析之外,还可以对其它内存分布情况进行分析,本公开对此不作具体限定。
通过Hook目标进程运行过程中每个内存操作对应的内存操作相关函数,确定每个内存操作对应的内存分配信息,根据每个内存操作对应的内存分配信息生成内存镜像文件,进而根据内存镜像文件检测目标进程运行过程中是否出现内存泄漏,从而可以实现对目标进程运行过程中是否发生内存泄漏的有效检测。
图5示出本公开一实施例的内存泄漏检测装置的结构示意图。图5所示的装置50可以用于执行上述图1所示方法实施例的步骤,装置50包括:
内存Hook模块51,用于通过Hook目标进程运行过程中每个内存操作对应的内存操作相关函数,确定每个内存操作对应的内存分配信息;
内存镜像文件生成模块52,用于根据每个内存操作对应的内存分配信息,生成内存镜像文件;
检测模块53,用于根据内存镜像文件,检测目标进程运行过程中是否出现内存泄漏。
在一种可能的实现方式中,50装置还包括:
内存泄漏定位模块,用于当检测到目标进程运行过程中出现内存泄漏时,根据内存镜像文件定位内存泄漏位置。
在一种可能的实现方式中,内存操作相关函数包括下述至少一种:
malloc函数、calloc函数、free函数、mmap函数,和munmap函数。
在一种可能的实现方式中,内存镜像文件生成模块包括:
确定子模块,用于确定第一时刻目标进程占用的内存大小;
第一生成子模块,用于若第一时刻目标进程占用的内存大小大于等于第一阈值,根据第一时刻之前每个内存操作对应的内存分配信息,生成目标进程在第一时刻对应的内存镜像文件。
在一种可能的实现方式中,第一时刻为首次生成内存镜像文件的时刻,
确定子模块,还用于确定第一时刻后的第二时刻目标进程占用的内存大小;
第一生成子模块,还用于若第二时刻目标进程占用的内存大小相比于上次生成内存镜像文件时目标进程占用的内存大小增加第二阈值,根据第二时刻之前每个内存操作对应的内存分配信息,生成目标进程在第二时刻对应的内存镜像文件。
在一种可能的实现方式中,目标进程占用的内存大小为VmSize或VmRSS。
在一种可能的实现方式中,内存镜像文件生成模块包括:
接收子模块,用于接收用户输入的内存镜像文件生成指令;
第二生成子模块,用于通过响应内存镜像文件生成指令,根据内存镜像文件生成指令的响应时刻之前每个内存操作对应的内存分配信息,生成响应时刻对应的内存镜像文件。
在一种可能的实现方式中,内存镜像文件中包括:
目标进程占用的VmSize和目标进程占用的VmRSS。
在一种可能的实现方式中,目标进程占用的VmSize包括下述至少一种:
通过malloc函数分配的内存信息、通过mmap函数分配的内存信息、目标进程运行过程中未跟踪到的内存信息、确定目标进程运行过程中每个内存操作对应的内存分配信息所占用的内存信息、目标进程中的线程栈占用的内存信息。
在一种可能的实现方式中,装置50还包括:
解析模块,用于解析内存镜像文件;
展示模块,用于按照预设展示方式对解析后的内存镜像文件进行展示。
在一种可能的实现方式中,预设展示方式为按照时间分布进行展示;
展示模块具体用于:
对目标进程运行过程中任一时间点下目标进程占用的VmSize和目标进程占用的VmRSS进行展示。
在一种可能的实现方式中,预设展示方式为按照类别分布进行展示;
展示模块具体用于:
对目标进程运行过程中占用的内存信息按照至少一个层级的类别进行分类展示。
在一种可能的实现方式中,展示模块具体用于:
按照预设展示方式,使用html文件对解析后的内存镜像文件进行展示。
在一种可能的实现方式中,装置50还包括:
内存日志文件生成模块,用于根据每个内存操作对应的内存分配信息,生成内存日志文件。
在一种可能的实现方式中,检测模块,还用于根据内存镜像文件,检测目标进程运行过程中是否出现内存占用过大。
本公开提供的装置50能够实现图1所示方法实施例中的各个步骤,并实现相同的技术效果,为避免重复,这里不再赘述。
图6示出本公开一实施例的电子设备的结构示意图。如图6所示,在硬件层面,该电子设备包括处理器,可选地还包括内部总线、网络接口、存储器。其中,存储器可能包含内存,例如高速随机存取存储器(Random-Access Memory,RAM),也可能还包括非易失性存储器(non-volatile memory),例如至少1个磁盘存储器等。当然,该电子设备还可能包括其他业务所需要的硬件。
处理器、网络接口和存储器可以通过内部总线相互连接,该内部总线可以是ISA(Industry Standard Architecture,工业标准体系结构)总线、PCI(PeripheralComponent Interconnect,外设部件互连标准)总线或EISA(Extended Industry StandardArchitecture,扩展工业标准结构)总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图6中仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。
存储器,存放程序。具体地,程序可以包括程序代码,所述程序代码包括计算机操作指令。存储器可以包括内存和非易失性存储器,并向处理器提供指令和数据。
处理器从非易失性存储器中读取对应的计算机程序到内存中然后运行,在逻辑层面上形成内存泄漏检测装置。处理器,执行存储器所存放的程序,并具体执行:通过Hook目标进程运行过程中每个内存操作对应的内存操作相关函数,确定每个内存操作对应的内存分配信息;根据每个内存操作对应的内存分配信息,生成内存镜像文件;根据内存镜像文件,检测目标进程运行过程中是否出现内存泄漏。
在一种可能的实现方式中,处理器还被配置为执行:当检测到目标进程运行过程中出现内存泄漏时,根据内存镜像文件定位内存泄漏位置。
在一种可能的实现方式中,内存操作相关函数包括下述至少一种:malloc函数、calloc函数、free函数、mmap函数,和munmap函数。
在一种可能的实现方式中,处理器被具体配置为执行:确定第一时刻目标进程占用的内存大小;若第一时刻目标进程占用的内存大小大于等于第一阈值,根据第一时刻之前每个内存操作对应的内存分配信息,生成目标进程在第一时刻对应的内存镜像文件。
在一种可能的实现方式中,第一时刻为首次生成内存镜像文件的时刻,处理器还被配置为执行:确定第一时刻后的第二时刻目标进程占用的内存大小;若第二时刻目标进程占用的内存大小相比于上次生成内存镜像文件时目标进程占用的内存大小增加第二阈值,根据第二时刻之前每个内存操作对应的内存分配信息,生成目标进程在第二时刻对应的内存镜像文件。
在一种可能的实现方式中,目标进程占用的内存大小为VmSize或VmRSS。
在一种可能的实现方式中,处理器被具体配置为执行:接收用户输入的内存镜像文件生成指令;通过响应内存镜像文件生成指令,根据内存镜像文件生成指令的响应时刻之前每个内存操作对应的内存分配信息,生成响应时刻对应的内存镜像文件。
在一种可能的实现方式中,内存镜像文件中包括:目标进程占用的VmSize和目标进程占用的VmRSS。
在一种可能的实现方式中,目标进程占用的VmSize包括下述至少一种:通过malloc函数分配的内存信息、通过mmap函数分配的内存信息、目标进程运行过程中未跟踪到的内存信息、确定目标进程运行过程中每个内存操作对应的内存分配信息所占用的内存信息、目标进程中的线程栈占用的内存信息。
在一种可能的实现方式中,处理器还被配置为执行:解析内存镜像文件,以及按照预设展示方式对解析后的内存镜像文件进行展示。
在一种可能的实现方式中,预设展示方式为按照时间分布进行展示;处理器被具体配置为执行:对目标进程运行过程中任一时间点下目标进程占用的VmSize和目标进程占用的VmRSS进行展示。
在一种可能的实现方式中,预设展示方式为按照类别分布进行展示;处理器被具体配置为执行:对目标进程运行过程中占用的内存信息按照至少一个层级的类别进行分类展示。
在一种可能的实现方式中,处理器被具体配置为执行:按照预设展示方式,使用html文件对解析后的内存镜像文件进行展示。
在一种可能的实现方式中,处理器还被配置为执行:根据每个内存操作对应的内存分配信息,生成内存日志文件。
在一种可能的实现方式中,处理器还被配置为执行:根据内存镜像文件,检测目标进程运行过程中是否出现内存占用过大。
处理器可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器可以是通用处理器,包括中央处理器(Central Processing Unit,CPU)、网络处理器(Network Processor,NP)等;还可以是数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本说明书实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本说明书实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件完成上述方法的步骤。
该电子设备可执行图1所示方法实施例执行的方法,并实现上述图1所示方法实施例的功能,本说明书实施例在此不再赘述。
本说明书实施例还提出了一种计算机可读存储介质,该计算机可读存储介质存储一个或多个程序,该一个或多个程序包括指令,该指令当被包括多个应用程序的电子设备执行时,能够使该电子设备执行图1所示实施例中的内存泄漏检测方法,并具体执行图1所示方法实施例的步骤。
本公开可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本公开的各个方面的计算机可读程序指令。
计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。
这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。
用于执行本公开操作的计算机程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如Smalltalk、C++等,以及常规的过程式编程语言—诸如“C”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA),该电子电路可以执行计算机可读程序指令,从而实现本公开的各个方面。
这里参照根据本公开实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本公开的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。
也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。
附图中的流程图和框图显示了根据本公开的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上已经描述了本公开的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。

Claims (28)

1.一种内存泄漏检测方法,其特征在于,包括:
通过获取Hook目标进程运行过程中每个内存操作对应的内存操作相关函数,确定每个内存操作对应的内存分配信息;
根据每个内存操作对应的内存分配信息,生成内存镜像文件;
根据内存镜像文件,检测所述目标进程运行过程中是否出现内存泄漏;
根据每个内存操作对应的内存分配信息,生成内存镜像文件,包括:
确定第一时刻所述目标进程占用的内存大小;
若所述第一时刻所述目标进程占用的内存大小大于等于第一阈值,根据所述第一时刻之前每个内存操作对应的内存分配信息,生成所述目标进程在所述第一时刻对应的内存镜像文件;
所述第一时刻为首次生成内存镜像文件的时刻,所述方法还包括:
确定第一时刻后的第二时刻所述目标进程占用的内存大小;
若所述第二时刻所述目标进程占用的内存大小相比于上次生成内存镜像文件时所述目标进程占用的内存大小增加第二阈值,根据所述第二时刻之前每个内存操作对应的内存分配信息,生成所述目标进程在所述第二时刻对应的内存镜像文件。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
当检测到所述目标进程运行过程中出现内存泄漏时,根据内存镜像文件定位内存泄漏位置。
3.根据权利要求1所述的方法,其特征在于,所述内存操作相关函数包括下述至少一种:
动态内存分配malloc函数、动态内存分配并清零calloc函数、释放内存空间free函数、内存映射mmap函数,和解除内存映射munmap函数。
4.根据权利要求1所述的方法,其特征在于,所述目标进程占用的内存大小为虚拟内存占用大小VmSize或物理内存占用大小VmRSS。
5.根据权利要求1所述的方法,其特征在于,根据每个内存操作对应的内存分配信息,生成内存镜像文件,包括:
接收用户输入的内存镜像文件生成指令;
通过响应所述内存镜像文件生成指令,根据所述内存镜像文件生成指令的响应时刻之前每个内存操作对应的内存分配信息,生成所述响应时刻对应的内存镜像文件。
6.根据权利要求1所述的方法,其特征在于,内存镜像文件中包括:
所述目标进程占用的VmSize和所述目标进程占用的VmRSS。
7.根据权利要求6所述的方法,其特征在于,所述目标进程占用的VmSize包括下述至少一种:
通过malloc函数分配的内存信息、通过mmap函数分配的内存信息、所述目标进程运行过程中未跟踪到的内存信息、确定所述目标进程运行过程中每个内存操作对应的内存分配信息所占用的内存信息、所述目标进程中的线程栈占用的内存信息。
8.根据权利要求6所述的方法,其特征在于,所述方法还包括:
解析内存镜像文件,以及按照预设展示方式对解析后的内存镜像文件进行展示。
9.根据权利要求8所述的方法,其特征在于,所述预设展示方式为按照时间分布进行展示;
按照预设展示方式对解析后的内存镜像文件进行展示,包括:
对所述目标进程运行过程中任一时间点下所述目标进程占用的VmSize和所述目标进程占用的VmRSS进行展示。
10.根据权利要求8所述的方法,其特征在于,所述预设展示方式为按照类别分布进行展示;
按照预设展示方式对解析后的内存镜像文件进行展示,包括:
对所述目标进程运行过程中占用的内存信息按照至少一个层级的类别进行分类展示。
11.根据权利要求8-10任一项所述的方法,其特征在于,按照预设展示方式对解析后的内存镜像文件进行展示,包括:
按照所述预设展示方式,使用超文本标记语言html文件对解析后的内存镜像文件进行展示。
12.根据权利要求1所述的方法,其特征在于,所述方法还包括:
根据每个内存操作对应的内存分配信息,生成内存日志文件。
13.根据权利要求1所述的方法,其特征在于,所述方法还包括:
根据内存镜像文件,检测所述目标进程运行过程中是否出现内存占用过大。
14.一种内存泄漏检测装置,其特征在于,包括:
内存Hook模块,用于通过Hook目标进程运行过程中每个内存操作对应的内存操作相关函数,确定每个内存操作对应的内存分配信息;
内存镜像文件生成模块,用于根据每个内存操作对应的内存分配信息,生成内存镜像文件;
检测模块,用于根据内存镜像文件,检测所述目标进程运行过程中是否出现内存泄漏;
所述内存镜像文件生成模块包括:
确定子模块,用于确定第一时刻所述目标进程占用的内存大小;
第一生成子模块,用于若所述第一时刻所述目标进程占用的内存大小大于等于第一阈值,根据所述第一时刻之前每个内存操作对应的内存分配信息,生成所述目标进程在所述第一时刻对应的内存镜像文件;
所述第一时刻为首次生成内存镜像文件的时刻,
所述确定子模块,还用于确定所述第一时刻后的第二时刻所述目标进程占用的内存大小;
所述第一生成子模块,还用于若所述第二时刻所述目标进程占用的内存大小相比于上次生成内存镜像文件时所述目标进程占用的内存大小增加第二阈值,根据所述第二时刻之前每个内存操作对应的内存分配信息,生成所述目标进程在所述第二时刻对应的内存镜像文件。
15.根据权利要求14所述的装置,其特征在于,所述装置还包括:
内存泄漏定位模块,用于当检测到所述目标进程运行过程中出现内存泄漏时,根据内存镜像文件定位内存泄漏位置。
16.根据权利要求14所述的装置,其特征在于,所述内存操作相关函数包括下述至少一种:
malloc函数、calloc函数、free函数、mmap函数,和munmap函数。
17.根据权利要求14所述的装置,其特征在于,所述目标进程占用的内存大小为VmSize或VmRSS。
18.根据权利要求14所述的装置,其特征在于,所述内存镜像文件生成模块包括:
接收子模块,用于接收用户输入的内存镜像文件生成指令;
第二生成子模块,用于通过响应所述内存镜像文件生成指令,根据所述内存镜像文件生成指令的响应时刻之前每个内存操作对应的内存分配信息,生成所述响应时刻对应的内存镜像文件。
19.根据权利要求14所述的装置,其特征在于,内存镜像文件中包括:
所述目标进程占用的VmSize和所述目标进程占用的VmRSS。
20.根据权利要求19所述的装置,其特征在于,所述目标进程占用的VmSize包括下述至少一种:
通过malloc函数分配的内存信息、通过mmap函数分配的内存信息、所述目标进程运行过程中未跟踪到的内存信息、确定所述目标进程运行过程中每个内存操作对应的内存分配信息所占用的内存信息、所述目标进程中的线程栈占用的内存信息。
21.根据权利要求19所述的装置,其特征在于,所述装置还包括:
解析模块,用于解析内存镜像文件;
展示模块,用于按照预设展示方式对解析后的内存镜像文件进行展示。
22.根据权利要求21所述的装置,其特征在于,所述预设展示方式为按照时间分布进行展示;
所述展示模块具体用于:
对所述目标进程运行过程中任一时间点下所述目标进程占用的VmSize和所述目标进程占用的VmRSS进行展示。
23.根据权利要求21所述的装置,其特征在于,所述预设展示方式为按照类别分布进行展示;
所述展示模块具体用于:
对所述目标进程运行过程中占用的内存信息按照至少一个层级的类别进行分类展示。
24.根据权利要求21-23任一项所述的装置,其特征在于,所述展示模块具体用于:
按照所述预设展示方式,使用html文件对解析后的内存镜像文件进行展示。
25.根据权利要求14所述的装置,其特征在于,所述装置还包括:
内存日志文件生成模块,用于根据每个内存操作对应的内存分配信息,生成内存日志文件。
26.根据权利要求14所述的装置,其特征在于,
所述检测模块,还用于根据内存镜像文件,检测所述目标进程运行过程中是否出现内存占用过大。
27.一种内存泄漏检测装置,其特征在于,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为执行权利要求1-13任一项所述的内存泄漏检测方法。
28.一种非易失性计算机可读存储介质,其上存储有计算机程序指令,其特征在于,所述计算机程序指令被处理器执行时实现权利要求1-13任一项所述的内存泄漏检测方法。
CN201910156442.8A 2019-03-01 2019-03-01 一种内存泄漏检测方法和装置 Active CN111639018B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910156442.8A CN111639018B (zh) 2019-03-01 2019-03-01 一种内存泄漏检测方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910156442.8A CN111639018B (zh) 2019-03-01 2019-03-01 一种内存泄漏检测方法和装置

Publications (2)

Publication Number Publication Date
CN111639018A CN111639018A (zh) 2020-09-08
CN111639018B true CN111639018B (zh) 2023-05-26

Family

ID=72329048

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910156442.8A Active CN111639018B (zh) 2019-03-01 2019-03-01 一种内存泄漏检测方法和装置

Country Status (1)

Country Link
CN (1) CN111639018B (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113282430A (zh) * 2020-12-03 2021-08-20 延锋伟世通电子科技(南京)有限公司 一种防止嵌入式系统内存泄露的方法
CN113094178A (zh) * 2021-04-23 2021-07-09 北京字节跳动网络技术有限公司 内存镜像文件生成方法、装置、电子设备和存储介质
CN117453446B (zh) * 2023-12-15 2024-04-26 荣耀终端有限公司 一种内存泄露定位的辅助信息获取方法及电子设备

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105912398A (zh) * 2016-04-06 2016-08-31 北京小米移动软件有限公司 内存检测方法及装置
CN106484580A (zh) * 2016-10-21 2017-03-08 腾讯科技(深圳)有限公司 一种内存检测方法、装置及系统
CN107085548A (zh) * 2016-02-16 2017-08-22 阿里巴巴集团控股有限公司 一种监控应用程序内存的方法、装置及电子设备
CN107247658A (zh) * 2017-05-25 2017-10-13 珠海金山网络游戏科技有限公司 一种通过内存快照检测手机应用内存泄露的方法及装置
CN107480047A (zh) * 2017-07-13 2017-12-15 珠海金山网络游戏科技有限公司 一种内存自动快照的方法及装置
CN107632929A (zh) * 2017-08-21 2018-01-26 北京京东尚科信息技术有限公司 一种检测内存泄漏的方法和装置
CN109324893A (zh) * 2018-08-07 2019-02-12 华为技术有限公司 分配内存的方法和装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9558055B2 (en) * 2014-02-19 2017-01-31 Cisco Technology, Inc. System level memory leak detection

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107085548A (zh) * 2016-02-16 2017-08-22 阿里巴巴集团控股有限公司 一种监控应用程序内存的方法、装置及电子设备
CN105912398A (zh) * 2016-04-06 2016-08-31 北京小米移动软件有限公司 内存检测方法及装置
CN106484580A (zh) * 2016-10-21 2017-03-08 腾讯科技(深圳)有限公司 一种内存检测方法、装置及系统
CN107247658A (zh) * 2017-05-25 2017-10-13 珠海金山网络游戏科技有限公司 一种通过内存快照检测手机应用内存泄露的方法及装置
CN107480047A (zh) * 2017-07-13 2017-12-15 珠海金山网络游戏科技有限公司 一种内存自动快照的方法及装置
CN107632929A (zh) * 2017-08-21 2018-01-26 北京京东尚科信息技术有限公司 一种检测内存泄漏的方法和装置
CN109324893A (zh) * 2018-08-07 2019-02-12 华为技术有限公司 分配内存的方法和装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
孙琳 ; 洪玫 ; 詹聪 ; 杜伊 ; 张琼宇.JavaScript 中的内存泄漏检测方法研究磁.计算机与数字工程.2015,(012),全文. *

Also Published As

Publication number Publication date
CN111639018A (zh) 2020-09-08

Similar Documents

Publication Publication Date Title
US10642608B2 (en) Associating a visualization of user interface with source code
US9519401B2 (en) Providing context menu based on predicted commands
CN111639018B (zh) 一种内存泄漏检测方法和装置
US10761963B2 (en) Object monitoring in code debugging
US8769504B2 (en) Method and apparatus for dynamically instrumenting a program
US9760464B1 (en) Memory leak detection
US9678859B2 (en) Detecting error states when interacting with web applications
US20150242380A1 (en) Checking testing coverage
US20200050540A1 (en) Interactive automation test
US20170147475A1 (en) Finding uninitialized variables outside the local scope
CN106294463B (zh) 一种动态曲线的数据点更新方法和设备
US9037994B2 (en) Navigation to a data definition in a diff context
US8769498B2 (en) Warning of register and storage area assignment errors
US9824005B1 (en) Process level memory allocation by memory type
US9442823B2 (en) Memory error tracking in a multiple-user development environment
CN111666201A (zh) 回归测试方法、装置、介质及电子设备
CN105302700A (zh) 一种记录在触摸终端上的用户操作的方法与设备
CN107077365B (zh) 有选择地加载预编译的头部和/或其部分
CN108037914B (zh) 一种安卓原生系统结合js开发的方法及装置
US11120099B2 (en) Rendering a web element in a web page
CN115809193A (zh) 前端逆向异常数据健壮性检测方法、装置及存储介质
CN111125590A (zh) 一种绘制热力图的方法及装置
CN111414284B (zh) 使用保护存储的对象加载自检
KR101225577B1 (ko) 어셈블리 언어 코드의 분석 장치 및 방법
CN116107587A (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