内存泄漏的归因方法、装置、电子设备和存储介质与流程

文档序号:26003997发布日期:2021-07-23 21:21阅读:131来源:国知局
内存泄漏的归因方法、装置、电子设备和存储介质与流程
本公开涉及信息
技术领域
,尤其涉及一种内存泄漏的归因方法、装置、电子设备和存储介质。
背景技术
:随着信息技术的发展,各种不同类型的应用程序(application,app)可以安装在终端上,从而为用户提供各种不同类型的服务。通常情况下,一个app可以由一个或多个进程来执行,进程的虚拟地址空间由进程可寻址的一个或多个虚拟内存组成。虚拟地址空间的大小通常是有限的,在不断占用虚拟地址空间的过程中,可能会造成虚拟内存泄漏,从而导致app崩溃。但是,针对虚拟内存泄漏的问题,现有技术很难有效定位出导致虚拟内存泄漏的原因。技术实现要素:为了解决上述技术问题或者至少部分地解决上述技术问题,本公开实施例提供了一种内存泄漏的归因方法、装置、电子设备和存储介质。本公开实施例提供了一种内存泄漏的归因方法,所述方法包括:获取应用程序中目标进程的第一文件和第二文件,所述第一文件包括所述目标进程在崩溃时的相关信息,所述第二文件包括所述应用程序重新启动时所述目标进程的相关信息;在对所述第一文件和所述第二文件中的每个内存段进行第一遍历的过程中,分别对所述第一文件和所述第二文件中与栈空间匹配的内存段进行标记;在对所述第一文件和所述第二文件中的每个内存段进行第二遍历的过程中,根据所述第一文件和所述第二文件中未被标记的内存段的名称对所述未被标记的内存段进行标记;根据所述第一文件中每个内存段分别对应的标记结果、以及所述第二文件中每个内存段分别对应的标记结果,确定内存泄漏的归因类型。本公开实施例还提供了一种内存泄漏的归因装置,包括:获取模块,用于获取应用程序中目标进程的第一文件和第二文件,所述第一文件包括所述目标进程在崩溃时的相关信息,所述第二文件包括所述应用程序重新启动时所述目标进程的相关信息;第一遍历模块,用于对所述第一文件和所述第二文件中的每个内存段进行第一遍历;第二遍历模块,用于对所述第一文件和所述第二文件中的每个内存段进行第二遍历;标记模块,用于所述第一遍历模块在对所述第一文件和所述第二文件中的每个内存段进行第一遍历的过程中,分别对所述第一文件和所述第二文件中与栈空间匹配的内存段进行标记;在所述第二遍历模块对所述第一文件和所述第二文件中的每个内存段进行第二遍历的过程中,根据所述第一文件和所述第二文件中未被标记的内存段的名称对所述未被标记的内存段进行标记;确定模块,用于根据所述第一文件中每个内存段分别对应的标记结果、以及所述第二文件中每个内存段分别对应的标记结果,确定内存泄漏的归因类型。本公开实施例还提供了一种电子设备,所述电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序;当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如上所述的内存泄漏的归因方法。本公开实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如上所述的内存泄漏的归因方法。本公开实施例还提供了一种计算机程序产品,该计算机程序产品包括计算机程序或指令,该计算机程序或指令被处理器执行时实现如上所述的内存泄漏的归因方法。本公开实施例提供的技术方案与现有技术相比至少具有如下优点:本公开实施例提供的技术方案的实质是通过两次遍历进行内存段分类,基于分类结果进行内存泄露归因,最终可以将内存泄漏的归因类型给到开发人员,业务开发人员自己根据归因类型,定位问题。其所得到的内存泄漏的归因类型,是一个方向性的范围,具有指导意义,可以充分缩减业务开发人员的工作量。附图说明结合附图并参考以下具体实施方式,本公开各实施例的上述和其他特征、优点及方面将变得更加明显。贯穿附图中,相同或相似的附图标记表示相同或相似的元素。应当理解附图是示意性的,原件和元素不一定按照比例绘制。图1为本公开实施例提供的一种内存泄漏的归因方法的流程图;图2为本公开实施例提供的一种用于实现图1中s140的方法的流程图;图3为本公开实施例提供的一种用于实现图1中s120的方法的流程图;图4为本公开实施例中的一种内存泄漏的归因装置的结构示意图;图5为本公开实施例中的一种电子设备的结构示意图。具体实施方式为了能够更清楚地理解本公开的上述目的、特征和优点,下面将对本公开的方案进行进一步描述。需要说明的是,在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合。在下面的描述中阐述了很多具体细节以便于充分理解本公开,但本公开还可以采用其他不同于在此描述的方式来实施;显然,说明书中的实施例只是本公开的一部分实施例,而不是全部的实施例。图1为本公开实施例提供的一种内存泄漏的归因方法的流程图,本实施例可适用于终端中进行内存泄漏归因的情况,该方法可以由内存泄漏的归因装置执行,该装置可以采用软件和/或硬件的方式实现,该装置可配置于电子设备中,例如终端,具体包括但不限于智能手机、掌上电脑、平板电脑、带显示屏的可穿戴设备、台式机、笔记本电脑、一体机、智能家居设备等。或者,本实施例可适用于服务端中进行内存泄漏归因的情况,该方法可以由内存泄漏的归因装置执行,该装置可以采用软件和/或硬件的方式实现,该装置可配置于电子设备中,例如服务器。或者,本实施例可适用于服务端和终端配合进行内存泄漏归因的情况,该方法可以由内存泄漏的归因装置执行,该装置可以采用软件和/或硬件的方式实现,该装置可部分配置于终端中,部分配置于服务器中。示例性,该方法中s110由终端执行,s120-s140由服务器执行。如图1所示,该方法具体可以包括:s110、获取应用程序中目标进程的第一文件和第二文件,第一文件包括目标进程在崩溃时的相关信息,第二文件包括应用程序重新启动时目标进程的相关信息。目标进程,是指崩溃的进程。需要说明的是,在实际中,目标进程崩溃可能导致app崩溃,也可能不导致app崩溃。可选地,第一文件和第二文件均为maps文件。maps文件是/proc/[pid]/maps路径下的文件,进程通过mmap函数建立进行文件的物理磁盘地址与虚拟内存的映射,每次映射相关的信息都会保存在maps文件中作为一条数据,每条数据包括(从左到右):虚拟内存区域的起始地址、虚拟内存区域终止地址、虚拟内存区域访问权限、偏移量、设备信息、inode以及内存段名。可选地,将基于mmap函数所形成的每一条数据作为一个内存段,存储于maps文件中。在maps文件中,同一个内存段中的信息记录于同一行,不同内存段中的信息记录于不同行。本步骤的实现方法有多种,示例性地,若本步骤的执行主体为终端,本步骤的具体实现方法包括:终端在目标进程崩溃时记录目标进程的第一文件;终端在应用程序重新启动时获取目标进程的第二文件。若本步骤的执行主体为服务器,本步骤的具体实现方法包括:服务器从终端接收应用程序中目标进程的第一文件和第二文件,应用程序安装在终端中,第一文件是在目标进程崩溃时由终端记录的文件,第二文件是应用程序重新启动时由终端记录的文件。s120、在对第一文件和第二文件中的每个内存段进行第一遍历的过程中,分别对第一文件和第二文件中与栈空间匹配的内存段进行标记。在实际中,崩溃的那个进程可能包括一个或多个线程,每个线程对应一个栈空间,一个线程的栈空间为线程栈。一个线程的栈空间可能对应一个或多个内存段。并且如果一个线程的栈空间对应多个内存段,该多个内存段是连续的。本步骤中,“匹配”主要包括两种情况,情况一,内存段的地址范围与栈空间的地址范围相同;情况二,内存段的地址范围落入栈空间的地址范围。本步骤的实质,对第一文件和第二文件中的每个内存段进行第一遍历的过程中,确定各内存段与线程的的栈空间是否具有对应关系,并基于该对应关系对第一文件和第二文件中的内存段进行标记。示例性地,可以将对应于同一线程的栈空间的内存段给予相同的标记。对应于不同线程的栈空间的内存段给予不同的标记。或者,可以将对应于目标进程的所有线程的栈空间的内存段均给予相同的标记。s130、在对第一文件和第二文件中的每个内存段进行第二遍历的过程中,根据第一文件和第二文件中未被标记的内存段的名称对未被标记的内存段进行标记。由于在实际中,可能存在某些内存段与目标进程的所有线程的栈空间均不匹配的情况。本步骤的实质是,第一遍历的过程结束后,对未被标记的内存段进行标记,起到查漏补缺的作用,以实现第一文件和第二文件中所有内存段全部被标记的目的。其标记的方法是,根据内存段的名称进行标记。内存段的名称记录于内存段数据中。可选地,可以预先构建内存段的名称包括内容与标记的映射关系。示例性地,该映射关系如表1所示。在进行标记时,识别内存段的名称,根据内存段名称包括内容,以及预先构建的内存段的名称包括内容与标记的映射关系,为各内存段进行标记。具体地,可以根据内存段名称的前缀匹配、包含关系、后缀匹配中的一种或多种进行标记。表1内存段的名称包括内容标记-/datadata-/data/app/*.apkapk-/system、/vendor、/apexsystem-libc_malloc、bionic_alloc、linker_alloc、heapnativeheap-dalvik-、jit、cfishadowjavaruntime-tls、xxxstacksystem-/devdevices-/dev/ashmemashmem-/dev/ashmem/shared_memoryshared_memory-dmabufdmabuf-[anon:xxxanon示例性地,基于表1,若某内存段名前缀为/data/,标记为data。(其中,data表示应用数据相关的内存映射)。若某内存段名前缀为/system或/apex或/vendor,标记为system(其中,system表示系统数据相关的内存映射)。若某内存段名后缀是.apk—>标记为apk(其中,apk表示应用.apk文件的映射)。进一步地,还可以设置若第一文件或第二文件中任一未标记内存段的名称包括第一预设名称,且与任一未标记内存段的前一个内存段成映射关系的第三文件的名称包括第二预设名称,则将任一未标记内存段的标记结果设置为与前一个内存段相同的标记结果。这样设置的目的是,筛选出相邻的两个具有关联关系的内存段,并对所筛选出的内存段给予相同的标记,这样设置可以确保后续内存泄露归因的准确性。示例性地,第一预设名称为.bss。第二预设名称为.so.apk.dex.vdex.odex.oat以及.art中的任意一个。在具体实现时,若检测到内存段c(此处特指在第一遍历的过程中未被标记的内存段)名称包括.bss,判断与内存段c的前一个内存段d(此处特指在第一遍历的过程中未被标记的内存段)具有映射关系的文件(即第三文件)的名称中,是否包括.so.apk.dex.vdex.odex.oat以及.art中的任意一个,若是,将内存段c和内存段d给予相同的标记。s140、根据第一文件中每个内存段分别对应的标记结果、以及第二文件中每个内存段分别对应的标记结果,确定内存泄漏的归因类型。确定内存泄漏的归因类型是指,导致内存泄漏的类型。内存泄漏的归因类型可以是第一遍历的过程形成的标记结果和/或第二遍历的过程形成的标记结果中的一种或多种。由于s120和s130的实质是根据内存段的特征属性对内存段进行标记,其标记的目的是对内存段进行归类。本步骤的实质是,首先,针对第一文件和第二文件,分别基于标记结果(包括第一遍历的过程形成的标记结果和第二遍历的过程形成的标记结果),将所有内存段进行分类。同一类型中各内存段的标记结果相同,不同类型中各内存段的标记结果不同。然后,逐一对比同一类型所有内存段,第一文件中记录的属性特征与第二文件中记录的属性特征,确定哪个或哪些类型为内存泄漏的归因类型。可选地,第一文件分类结果中各类型的属性特征包括但不限于所对应总的虚拟内存的大小。可选地,在实际中,当需要输出内存泄漏的归因类型时,可以将内存泄漏的归因类型转化为同义或近义的文字描述信息,以便业务开发人员理解。示例性地,表2给出了几种内存泄漏的归因类型以及其对应的文字描述信息的对应关系。表2归因类型文字描述信息java_runtimejava运行时native_heapnative堆thread_stack线程栈data/data文件夹的文件映射apk.apk文件的映射system/system、/vendor、/apex系统文件映射devices设备文件映射gpugpu相关的映射ashmem设备文件映射shared_memory共享匿名内存dmabufdma相关anon匿名映射,属于已命名匿名映射nameless匿名映射,属于未命名匿名映射other其他映射目前,由于缺乏有效的自动化内存泄露归因方法,业务开发人员在解决内存泄露问题时,需要自行根据日志、各种崩溃文件去定位问题,致使完成内存泄露归因的工作量巨大。上述技术方案的实质是通过两次遍历进行内存段分类,基于分类结果进行内存泄露归因,最终可以将内存泄漏的归因类型给到开发人员,业务开发人员自己根据归因类型,定位问题。其所得到的内存泄漏的归因类型,是一个方向性的范围,具有指导意义,可以充分缩减业务开发人员的工作量。可选地,在上述技术方案的基础上,还可以将应用程序中目标进程的第一文件和第二文件以及内存泄漏的归因类型同时输出。这样可以进一步确保开发人员所获得的信息更全面,缩减业务开发人员的工作量,提高内存泄漏问题定位的效率和精度。在上述技术方案中,用于实现s140的方法有多种,示例性地,可以基于分类结果中各类型在第一文件以及第二文件中记录的属性特征,设置具体实现s140的方法。典型地,若设置属性特征为虚拟内存大小,图2为本公开实施例提供的一种用于实现图1中s140的方法的流程图。参见图2,该方法包括:s141、分别确定第一文件和第二文件中标记结果相同的内存段所对应的虚拟内存的总大小。通常,一个内存段对应一个虚拟内存区域。本步骤的实现方法包括:将第一文件中标记结果相同的内存段归为同一类型,将第一文件中标记结果不同的内存段归为不同类型,分别计算每种类型包含的一个或多个内存段分别对应的虚拟内存区域的大小的和。将第二文件中标记结果相同的内存段归为同一类型,将第一文件中标记结果不同的内存段归为不同类型,分别计算每种类型包含的一个或多个内存段分别对应的虚拟内存区域的大小的和。s142、根据同一标记结果在第一文件中对应的虚拟内存的总大小和同一标记结果在第二文件中对应的虚拟内存的总大小,确定内存泄漏的归因类型。可选地,在执行本步骤时,可以根据同一标记结果在第一文件中对应的虚拟内存的总大小和同一标记结果在第二文件中对应的虚拟内存的总大小,确定目标标记结果,内存泄漏的归因类型为目标标记结果。其中,目标标记结果是第一遍历的过程形成的标记结果和/或第二遍历的过程形成的标记结果中的一种或多种。其中,目标标记结果的确定方法有多种,示例性地,可以设置目标标记结果在第一文件中对应的虚拟内存的总大小和目标标记结果在第二文件中对应的虚拟内存的总大小之间的差值大于阈值。或者,目标标记结果在第一文件中对应的虚拟内存的总大小和目标标记结果在第二文件中对应的虚拟内存的总大小之间的差值最大。需要说明的是,在实际中,可能出现在第一文件中有类型b,在第二文件中没有类型b的情况。此种情况下,将第二文件中类型b的总虚拟内存大小视作为0。用第一文件中类型b的总虚拟内存大小减去0,求得二者的差值,基于该差值大小确定目标标记结果。由于在实际中,内存泄露是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,其最直接的后果是导致同一类型在第一文件中对应的虚拟内存的总大小和在第二文件中对应的虚拟内存的总大小差值较大,上述技术方案通过根据同一标记结果在第一文件中对应的虚拟内存的总大小和同一标记结果在第二文件中对应的虚拟内存的总大小,确定内存泄漏的归因类型,其可以实现快速、直接、简单、准确、有效地进行内存泄漏的归因。在上述技术方案中,用于实现图1中s120的方法有多种,图3为本公开实施例提供的一种用于实现图1中s120的方法的流程图。参见图3,该方法包括:s121、获取目标文件,目标文件包括目标进程中一个或多个线程的相关信息,每个线程的相关信息包括线程对应的栈空间的地址信息。示例性地,目标文件是与第一文件和第二文件均互相独立的文件。典型地,目标文件具体可以为pthread.txt文件,也可以为thread.txt文件。其中pthread.txt文件的存储路径为/proc/[pid]/pagemap。thread.txt文件的存储路径有两个,分别为/proc/[pid]/stat和/proc/[pid]/task/[tid]/stat。其中,/proc/[pid]/stat路径下的thread.txt文件存储进程里面的主线程的相关信息,而/proc/[pid]/task/[tid]/stat路径下的thread.txt文件存储进程里面的所有线程的相关信息。本步骤的实现方法有多种,示例性地,获取多个第四文件,多个第四文件中的每个第四文件包括目标进程中一个或多个线程的相关信息;从多个第四文件中获取目标文件,目标文件是多个第四文件中未被用于匹配的优先级最高的第四文件。示例性地,将pthread.txt文件和thread.txt文件均作为第四文件,由于通常情况下,pthread.txt文件中关于栈空间的地址信息比thread.txt文件中关于栈空间的地址信息更加详尽,设置pthread.txt文件的匹配的优先级高于thread.txt文件。在执行本步骤时,同时获取pthread.txt文件和thread.txt文件。若同时获取到pthread.txt文件和thread.txt文件,优先使用pthread.txt文件作为目标文件。可选地,若本步骤由服务器执行,在获取多个第四文件,包括:服务器从终端接收多个第四文件,多个第四文件是在目标进程崩溃时由终端记录的文件。s122、在对第一文件和第二文件中的每个内存段进行第一遍历的过程中,确定每个内存段的地址信息是否与目标文件中任一栈空间的地址信息匹配。假设使用pthread.txt文件作为目标文件。示例性地,pthread.txt文件包括一条记录:[tid:16963][routine:0xb3b3fb29][arg:0xa272d900][stack_base:0xa107b000][stack_size:0x104920][sigstack:0xa4a99000][no_present:0x0]这一条记录是一个栈空间的信息。在实际中,pthread.txt文件可以包括一条或多条记录。在上述记录中,stack_base是栈空间的起始地址,stack_size是栈空间的大小。在执行本步骤时,将第一文件和第二文件中所有的内存段的地址范围与pthread.txt文件中的每一条记录进行比较,如果内存段的地址范围与栈空间的地址范围相同或内存段的地址范围落入栈空间的地址范围,则匹配;否则,则不匹配。假设使用thread.txt文件作为目标文件。示例性地,thread.txt文件包括一条记录:12845(mple.crash.test)s65465400-110779528321411014979811441038380-205001954565446116872192283791844674407370955161537183056691237183059158454871097929654871095985600467211073779964100176000003718305955843718305969923725944913925487109810615487109811605487109811605487109856940这一条记录是一个栈空间的信息。在实际中,thread.txt文件可以包括一条或多条记录。在上述记录中,548710959856是栈顶部的地址。在执行本步骤时,由于每一条记录仅记录栈顶部的地址,需要结合多条记录,确定各栈空间的起始地址,以及各栈空间的大小(或者各栈空间的终止地址),即确定各栈空间的地址范围。将第一文件和第二文件中所有的内存段的地址范围与thread.txt文件中的每一条记录进行比较,如果内存段的地址范围与栈空间的地址范围相同或内存段的地址范围落入栈空间的地址范围,则匹配;否则,则不匹配。s123、当第一文件或第二文件中任一内存段的地址信息与目标文件中任一栈空间的地址信息匹配时,对该任一内存段进行标记。示例性地,若第一文件中内存段m的地址信息与目标文件中某一栈空间的地址信息匹配,将内存段m标记为thread_stack。若第一文件中内存段n的地址信息与目标文件中某一栈空间的地址信息不匹配,对内存段n不进行标记,留待执行s130时进行标记。上述技术方案给出了一种具体实现在第一遍历过程进行内存段标记的方法,其巧妙利用目标文件,实现第一轮标记,可以简化标记的难度,提高第一轮标记的速率。图4为本公开实施例中的一种内存泄漏的归因装置的结构示意图。本公开实施例所提供的内存泄漏的归因装置可以配置于客户端中,或者可以配置于服务端中,该内存泄漏的归因装置具体包括:获取模块410,用于获取应用程序中目标进程的第一文件和第二文件,所述第一文件包括所述目标进程在崩溃时的相关信息,所述第二文件包括所述应用程序重新启动时所述目标进程的相关信息;第一遍历模块420,用于对所述第一文件和所述第二文件中的每个内存段进行第一遍历;第二遍历模块430,用于对所述第一文件和所述第二文件中的每个内存段进行第二遍历;标记模块440,用于所述第一遍历模块在对所述第一文件和所述第二文件中的每个内存段进行第一遍历的过程中,分别对所述第一文件和所述第二文件中与栈空间匹配的内存段进行标记;在所述第二遍历模块对所述第一文件和所述第二文件中的每个内存段进行第二遍历的过程中,根据所述第一文件和所述第二文件中未被标记的内存段的名称对所述未被标记的内存段进行标记;确定模块450,用于根据所述第一文件中每个内存段分别对应的标记结果、以及所述第二文件中每个内存段分别对应的标记结果,确定内存泄漏的归因类型。进一步地,确定模块450,用于分别确定所述第一文件和所述第二文件中标记结果相同的内存段所对应的虚拟内存的总大小;根据同一标记结果在所述第一文件中对应的虚拟内存的总大小和所述同一标记结果在所述第二文件中对应的虚拟内存的总大小,确定内存泄漏的归因类型。进一步地,确定模块450,用于根据同一标记结果在所述第一文件中对应的虚拟内存的总大小和所述同一标记结果在所述第二文件中对应的虚拟内存的总大小,确定目标标记结果,所述内存泄漏的归因类型为所述目标标记结果。进一步地,所述目标标记结果在所述第一文件中对应的虚拟内存的总大小和所述目标标记结果在所述第二文件中对应的虚拟内存的总大小之间的差值大于阈值。进一步地,所述目标标记结果在所述第一文件中对应的虚拟内存的总大小和所述目标标记结果在所述第二文件中对应的虚拟内存的总大小之间的差值最大。进一步地,标记模块440,用于:获取目标文件,所述目标文件包括所述目标进程中一个或多个线程的相关信息,每个线程的相关信息包括所述线程对应的栈空间的地址信息;在对所述第一文件和所述第二文件中的每个内存段进行第一遍历的过程中,确定所述每个内存段的地址信息是否与所述目标文件中任一栈空间的地址信息匹配;当所述第一文件或所述第二文件中任一内存段的地址信息与所述目标文件中任一栈空间的地址信息匹配时,对所述任一内存段进行标记。进一步地,标记模块440,用于:获取多个第四文件,所述多个第四文件中的每个第四文件包括所述目标进程中一个或多个线程的相关信息;从所述多个第四文件中获取目标文件,所述目标文件是所述多个第四文件中未被用于所述匹配的优先级最高的第四文件。进一步地,标记模块440,用于:在所述第二遍历模块对所述第一文件和所述第二文件中的每个内存段进行第二遍历的过程中,若所述第一文件或所述第二文件中任一未标记内存段的名称包括第一预设名称,且与所述任一未标记内存段的前一个内存段成映射关系的第三文件的名称包括第二预设名称,则将所述任一未标记内存段的标记结果设置为与所述前一个内存段相同的标记结果。进一步地,获取模块,用于控制服务器从终端接收所述应用程序中目标进程的第一文件和第二文件,所述应用程序安装在所述终端中,所述第一文件是在所述目标进程崩溃时由所述终端记录的文件,所述第二文件是所述应用程序重新启动时由所述终端记录的文件。进一步地,标记模块,用于控制服务器从终端接收所述多个第四文件,所述多个第四文件是在所述目标进程崩溃时由所述终端记录的文件。进一步地,获取模块,用于控制终端在所述目标进程崩溃时记录所述目标进程的第一文件;以及控制所述终端在所述应用程序重新启动时获取所述目标进程的第二文件。本公开实施例提供的内存泄漏的归因装置,可执行本公开方法实施例所提供的内存泄漏的归因方法中客户端或服务端所执行的步骤,具备执行步骤和有益效果此处不再赘述。图5为本公开实施例中的一种电子设备的结构示意图。下面具体参考图5,其示出了适于用来实现本公开实施例中的电子设备1000的结构示意图。本公开实施例中的电子设备1000可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、pda(个人数字助理)、pad(平板电脑)、pmp(便携式多媒体播放器)、车载终端(例如车载导航终端)、可穿戴电子设备等等的移动终端以及诸如数字tv、台式计算机、智能家居设备等等的固定终端。图5示出的电子设备仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。如图5所示,电子设备1000可以包括处理装置(例如中央处理器、图形处理器等)1001,其可以根据存储在只读存储器(rom)1002中的程序或者从存储装置1008加载到随机访问存储器(ram)1003中的程序而执行各种适当的动作和处理以实现如本公开所述的实施例的内存泄漏的归因方法。在ram1003中,还存储有电子设备1000操作所需的各种程序和信息。处理装置1001、rom1002以及ram1003通过总线1004彼此相连。输入/输出(i/o)接口1005也连接至总线1004。通常,以下装置可以连接至i/o接口1005:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置1006;包括例如液晶显示器(lcd)、扬声器、振动器等的输出装置1007;包括例如磁带、硬盘等的存储装置1008;以及通信装置1009。通信装置1009可以允许电子设备1000与其他设备进行无线或有线通信以交换信息。虽然图5示出了具有各种装置的电子设备1000,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在非暂态计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码,从而实现如上所述的内存泄漏的归因方法。在这样的实施例中,该计算机程序可以通过通信装置1009从网络上被下载和安装,或者从存储装置1008被安装,或者从rom1002被安装。在该计算机程序被处理装置1001执行时,执行本公开实施例的方法中限定的上述功能。需要说明的是,本公开上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的信息信号,其中承载了计算机可读的程序代码。这种传播的信息信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、rf(射频)等等,或者上述的任意合适的组合。在一些实施方式中,客户端、服务器可以利用诸如http(hypertexttransferprotocol,超文本传输协议)之类的任何已知或未来研发的网络协议进行通信,并且可以与任意形式或介质的数字信息通信(例如,通信网络)互连。通信网络的示例包括局域网(“lan”),广域网(“wan”),网际网(例如,互联网)以及端对端网络(例如,adhoc端对端网络),以及任何已知或未来研发的网络。上述计算机可读介质可以是上述电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备:获取应用程序中目标进程的第一文件和第二文件,所述第一文件包括所述目标进程在崩溃时的相关信息,所述第二文件包括所述应用程序重新启动时所述目标进程的相关信息;在对所述第一文件和所述第二文件中的每个内存段进行第一遍历的过程中,分别对所述第一文件和所述第二文件中与栈空间匹配的内存段进行标记;在对所述第一文件和所述第二文件中的每个内存段进行第二遍历的过程中,根据所述第一文件和所述第二文件中未被标记的内存段的名称对所述未被标记的内存段进行标记;根据所述第一文件中每个内存段分别对应的标记结果、以及所述第二文件中每个内存段分别对应的标记结果,确定内存泄漏的归因类型。可选的,当上述一个或者多个程序被该电子设备执行时,该电子设备还可以执行上述实施例所述的其他步骤。可以以一种或多种程序设计语言或其组合来编写用于执行本公开的操作的计算机程序代码,上述程序设计语言包括但不限于面向对象的程序设计语言—诸如java、smalltalk、c++,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(lan)或广域网(wan)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。描述于本公开实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现。其中,单元的名称在某种情况下并不构成对该单元本身的限定。本文中以上描述的功能可以至少部分地由一个或多个硬件逻辑部件来执行。例如,非限制性地,可以使用的示范类型的硬件逻辑部件包括:现场可编程门阵列(fpga)、专用集成电路(asic)、专用标准产品(assp)、片上系统(soc)、复杂可编程逻辑设备(cpld)等等。在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom或快闪存储器)、光纤、便捷式紧凑盘只读存储器(cd-rom)、光学储存设备、磁储存设备、或上述内容的任何合适组合。需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。以上所述仅是本公开的具体实施方式,使本领域技术人员能够理解或实现本公开。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本公开的精神或范围的情况下,在其它实施例中实现。因此,本公开将不会被限制于本文所述的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1