G06F11/36 G06F11/30
1.一种内存泄露的定位方法,其特征在于,包括:
检测到嵌入式设备发生内存泄露时,确定内存泄露的类型;
若所述类型为持续泄露,等待第一预设时长后遍历所述内存中所有内存块,以及在各个内存块的内存信息存储区中获取内存信息;其中,所述内存块包括数据存储区和所述内存信息存储区,所述内存信息包括开始标志位、结束标志位、内存大小信息、内存申请时间和内存申请函数信息;
根据内存信息获取各个内存块的内存大小和内存申请函数;
在所述所有内存块中查内存申请函数和内存大小相同的内存块数量超过预设数量的内存块,以及将查到的内存块作为目标内存块。
2.根据权利要求1所述的方法,其特征在于,还包括:
若所述类型为功能泄露,重启所述嵌入式设备;
基于所述嵌入式设备的开机时刻t0,在t1时刻开启所述目标代码中造成功能泄露的功能;其中,t1时刻和t0时间的时间间隔为第二预设时长;
遍历所述内存中所有内存块,以及在各个内存块的内存信息存储区中获取内存申请时间信息;
根据内存申请时间信息查各个内存块中在t1时刻之后申请的内存块,以及将查到的内存块作为目标内存块。
3.根据权利要求1或2所述的方法,其特征在于,所述内存信息存储区由内存开始标志存储区、内存大小信息存储区、内存申请时间信息存储区、内存申请函数信息存储区、数据存储区和内存结束标志存储区组成。
4.根据权利要求3所述的方法,其特征在于,根据预设的内存块分配记录表来遍历内存中所有内存块。
5.根据权利要求1或2或4所述的方法,其特征在于,所述确定内存泄露的类型,包括:
监测内存中空闲空间的大小变化情况;
在所述嵌入式设备开机时,若所述空闲空间逐渐减小至预设阈值,则确定所述类型为持续泄露;或
在开启所述嵌入式设备的功能时,若所述内存中的空闲空间逐渐减小至预设阈值,则确定所述类型为功能泄露。
6.根据权利要求5所述的方法,其特征在于,还包括:
获取所述目标内存块的数量、地址和ID,以及通过显示单元显示数量、地址和ID。
7.根据权利要求6所述的方法,其特征在于,所述检测到嵌入式设备发生内存泄露时,确定内存泄露的类型之前,还包括:
运行嵌入式设备中的目标代码;
在所述目标代码的运行过程中,在内存中为所述目标代码分配内存块或释放内存块。
8.一种内存泄露的定位装置,其特征在于,所述内存泄露的定位装置包括:
确定单元,用于检测到嵌入式设备发生内存泄露时,确定内存泄露的类型;
遍历单元,用于若所述类型为持续泄露,等待第一预设时长后遍历所述内存中所有内存块,以及在各个内存块的内存信息存储区中获取内存信息;其中,所述内存块包括数据存储区和所述内存信息存储区,所述内存信息包括开始标志位、结束标志位、内存大小信息、内存申请时间和内存申请函数信息;
获取单元,用于根据内存信息获取各个内存块的内存大小和内存申请函数;
查单元,用于在所述所有内存块中查内存申请函数和内存大小相同的内存块数量超过预设数量的内存块,以及将查到的内存块作为目标内存块。
9.一种计算机存储介质,其特征在于,所述计算机存储介质存储有多条指令,所述指令适于由处理器加载并执行如权利要求1~7任意一项的方法步骤。
10.一种电子设备,其特征在于,包括:处理器和存储器;其中,所述存储器存储有计算机程序,所述计算机程序适于由所述处理器加载并执行如权利要求1~7任意一项的方法步骤。
本申请存储控制领域,尤其涉及一种内存泄露的定位方法、装置、存储介质和电子设备。
嵌入式设备由于内存的限制,要求运行的代码更为紧凑和有效,在代码运行过程中,内存泄露时经常发生的异常之一,严重影响系统运行的稳定性需要对内存泄露的,因此需要对内存数据进行排查以快速排查和诊断代码的故障。在现有技术中,当代码发生内存泄露时,需要测试人员根据错误信息依次排查内存中已分配空间的内存数据,这种排查方法往往需要耗费大量时间,排查难度较大且效率较低。
本申请实施例提供了内存泄露的定位方法、装置、存储介质及电子设备,可以解决现有技术在发生内存泄露时定位发生故障的内存空间存在耗时长和效率低的问题。所述技术方案如下:
第一方面,本申请实施例提供了一种内存泄露的定位方法,包括:
检测到嵌入式设备发生内存泄露时,确定内存泄露的类型;
若所述类型为持续泄露,等待第一预设时长后遍历所述内存中所有内存块,以及在各个内存块的内存信息存储区中获取内存信息;其中,所述内存块包括数据存储区和所述内存信息存储区,所述内存信息包括开始标志位、结束标志位、内存大小信息、内存申请时间和内存申请函数信息;
根据内存信息获取各个内存块的内存大小和内存申请函数;
在所述所有内存块中查内存申请函数和内存大小相同的内存块数量超过预设数量的内存块,以及将查到的内存块作为目标内存块。
第二方面,本申请实施例提供了一种内存泄露的定位装置,包括:
确定单元,用于检测到嵌入式设备发生内存泄露时,确定内存泄露的类型;
遍历单元,用于若所述类型为持续泄露,等待第一预设时长后遍历所述内存中所有内存块,以及在各个内存块的内存信息存储区中获取内存信息;其中,所述内存块包括数据存储区和所述内存信息存储区,所述内存信息包括开始标志位、结束标志位、内存大小信息、内存申请时间和内存申请函数信息;
获取单元,用于根据内存信息获取各个内存块的内存大小和内存申请函数;
查单元,用于在所述所有内存块中查内存申请函数和内存大小相同的内存块数量超过预设数量的内存块,以及将查到的内存块作为目标内存块。
第三方面,本申请实施例提供一种计算机存储介质,所述计算机存储介质存储有多条指令,所述指令适于由处理器加载并执行上述的方法步骤。
第四方面,本申请实施例提供一种电子设备,可包括:处理器和存储器;其中,所述存储器存储有计算机程序,所述计算机程序适于由所述处理器加载并执行上述的方法步骤。
本申请一些实施例提供的技术方案带来的有益效果至少包括:
在检测到嵌入式设备发生内存泄露时,确定内存泄露的类型,然后遍历内存中各个内存块的内存信息,根据内存信息中的内存大小和内存申请函数定位目标内存块,以便用户内存目标内存块中的内存数据排除代码故障,相对于通过人工逐个排查定位内存空间来说,可以提高定位内存块的效率和速度,以便快速诊断代码故障。
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1是本申请实施例提供的电子设备的示意图;
图2是本申请实施例提供的内存泄露的定位方法的流程示意图;
图3是本申请实施例提供的内存块的结构示意图;
图4是本申请实施例提供的提取内存信息的示意图;
图5是本申请提供的一种内存泄露的定位装置的结构示意图;
图6是本申请提供的一种电子设备的结构示意图。
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施例方式作进一步地详细描述。
需要说明的是,本申请提供的内存的控制一般由内存泄露的定位装置101执行,相应的,内存泄露的定位装置101一般设置于电子设备10中。
图1示出了可以应用于本申请的电子设备的结构图。
电子设备10除包括壳体之外,还包括内存泄露的定位装置101(简称定位装置101)和内存102,闪存的数量可以为一个或多个,定位装置101和内存102之间相连。电子设备是具有显示屏的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携式计算机和台式计算机等等。例如:显示设备可以是阴极射线管显示器(cathode ray tube display,简称CR)、发光二极管显示器(light-emitting diode display,简称LED)、电子墨水屏、液晶显示屏(liquid crystal display,简称LCD)、等离子显示面板(plasma display panel,简称PDP)等。用户可以利用电子设备上的显示设备,来查看显示的文字、图片、视频等信息。
电子设备其上还可以安装摄像头,摄像头用于采集视频流。
下面将结合附图2,对本申请实施例提供的内存泄露的定位方法进行详细介绍。
请参见图2,为本申请实施例提供了一种内存泄露的定位方法的流程示意图。如图2所示,本申请实施例的所述方法可以包括以下步骤:
S201、检测到嵌入式设备发生内存泄露时,确定内存泄露的类型。
其中,内存泄露指内存中动态分配的内存长时间未释放或无法释放,造成内存浪费的现象。嵌入式设备开机后会运行目标代码,目标代码由主代码和用于执行特定功能的多个子代码组成,目标代码在运行过程中嵌入式设备会根据动态方式为目标代码分配内存块或释放内存块。在内存使用正常情况下,内存中空闲空间的大小较为稳定,即空闲空间的大小在指定范围内波动;在发生内存泄露时,内存中空闲空间的大小会逐渐减小。本申请的内存泄露的类型包括持续泄露和功能泄露,持续泄露指开机后内存中的空闲空间的大小逐渐减小,功能泄露表示触发某个功能导致内存中的空闲空间的大小逐渐减小。
在本申请实施例中,确定内存泄露的类型的方法包括:
监测内存中空闲空间的大小变化情况;
在所述嵌入式设备开机时,若所述空闲空间逐渐减小至预设阈值,则确定所述类型为持续泄露;或
在开启所述嵌入式设备的功能时,若所述内存中的空闲空间逐渐减小至预设阈值,则确定所述类型为功能泄露。
其中,嵌入式设备在开机时周期性的检测内存中空闲空间的大小,若在开机时监测到空闲空间逐渐减小至预设阈值,例如:预设阈值为8字节,则确定内存泄露的类型为持续泄露。在开启嵌入式设备的功能时,若内存中空闲空间逐渐减小至预设阈值,则确定内存泄露的类型为功能泄露。例如:目标代码在运行过程中,开启嵌入式设备的图形显示功能时,监测到内存中空闲空间逐渐减小至8字节,则确定内存泄露的类型为功能泄露。本申请的预设阈值一般大于0字节。
在一个或多个可能的实施例中,S201之前,还包括:
运行嵌入式设备中的目标代码,在目标代码的运行过程中,在内存中为目标代码分配内存块或释放内存块。
其中,本申请可以基于目标代码的内存分配请求分配一定大小的内存块,或者基于目标代码的内存释放请求释放对应的内存块,或者监测各个内存块的存在时间,在存在时间大于内存块的申请时间时,释放该内存块,以提高内存的空间利用率。
S202、若类型为持续泄露,等待第一预设时长后遍历内存中所有内存块,以及在各个内存块的内存信息存储器中获取内存信息。
其中,本申请采用内存块的方式为目标代码分配内存空间,某个时刻内存块的数量可能为多个,在目标代码不需要使用某个内存块时会释放该内存块。内存块包括数据存储区和内存信息存储区,数据存储区用于存储实际的数据,内存信息存储区用于存储内存块的内存信息,即内存块的属性信息,内存信息包括如下字段:内存开始标志位、内存结束标志位、内存大小信息、内存申请时间信息、内存申请函数信息,各个字段分别存储于内存块中的不同区域,各个区域的大小可以根据实际需求而定,本申请不作限制。内存开始标志位和内存结束标志位用于区分内存块的开始位置和结束位置,内存大小信息表示内存块中各个区域的大小,内存申请时间信息表示内存块申请的开始时刻和/或申请时长(即占用内存块的时长),内存申请函数信息表示申请内存块的函数的身份,例如:函数名或函数ID等。
在一个或多个可能的实施例中,参见图3所示的内存块的结构示意图,每个内存块包括:数据存储区和内存信息存储区,内存信息存储区的包括:内存开始标志存储区、内存大小信息存储区、内存申请时间信息存储区、内存申请函数存储区和内存结束标志存储区,内存开始标志存储区位于内存块的开头,内存结束标志存储区位于内存块的末尾。内存开始标志存储区用于存储内存开始标志位,内存结束标志存储区用于存储内存结束位置,例如:内存开始标志位和内存结束位置位的长度为1个字节,内存开始标志位的值为0x00,内存结束标志位的值为0xFF。内存大小信息存储区用于存储内存大小信息,内存申请时间存储区用于存储内存申请时间,内存申请函数存储区用于存储申请该内存块的函数的身份信息,数据存储区用于存储实际的内存数据。
在本申请中,若内存泄露的类型为持续泄露时,等待第一预设时长,第一预设时长可以根据实际需求而定,等待第一预设时长后确保内存中空闲空间的大小趋近于0字节。然后嵌入式设备在分配内存块后,会将内存块的ID和地址存储在内存块分配记录表中,因此可以根据内存块分配记录表遍历内存中所有的内存块,内存块的数量可能为多个,对于遍历到的各个内存块,在内存块中的内存信息存储区中获取内存大小信息、内存申请信息和内存函数信息。
例如:参见图4所示,内存中分配有N个内存块,N为大于或等于1的整数,提取内存块中内存信息存储区中的内存信息得到各个内存块的内存位置、标志位(开始标志位和结束标志位)、申请时间(单位为毫秒)和申请函数名称。本申请可以根据开始标志位的值和结束标志位的值是否为预设值进行校验,例如:开始标志位的预设值为0x00,结束标志位的预设值为0xFF,根据实际值和预设值进行比较得到校验结果。
S203、根据内存信息获取各个内存块的内存大小和内存申请函数。
S204、在所有内存块中查内存申请函数和内存大小相同的内存块数量超过预设数量的内存块,以及将查到的内存块作为目标内存块。
其中,预设数量为3个,在所有内存块中查内存申请函数和内存大小相同的内存块,统计满足上述条件的内存块的数量,在数量超过预设数量3个时,表明某个函数在重复请求分配内存块,这种内存分配情况时不正常的,将上述查到的多个内存块作为需要定位的目标内存块,以便用户对这些目标内存块中的内存数据进行排查,确定目标代码中的bug。进一步的,本申请可以在所有内存块中确定存在时间超过申请时间的内存块,将上述内存块进行释放,以增加内存的空闲空间。
进一步的,嵌入式设备获取所述目标内存块的数量、地址和ID,以及通过显示单元显示数量、地址和ID,以便用户通过显示单元上的信息快速定位目标内存块。
在一个或多个可能的实施例中,还包括:
若所述类型为功能泄露,嵌入式设备执行重启操作,成功重启后记录开机时刻t0;
基于所述嵌入式设备的开机时刻t0,在t1时刻开启所述目标代码中造成功能泄露的功能;其中,t1时刻和t0时间的时间间隔为第二预设时长,第二预设时长的大小可以根据实际需求而定,例如:造成功能泄露的功能为显示功能,那么在开始时刻之后的5秒后开启显示功能。
遍历所述内存中所有内存块,以及在各个内存块的内存信息存储区中获取内存申请时间信息;根据上面的实施例,根据根据内存块分配记录表遍历所有的内存块,内存申请时间信息包括内存申请时刻,即内存块分配的时刻。
根据内存申请时间信息查各个内存块中在t1时刻之后申请的内存块,以及将查到的内存块作为目标内存块,用户利用目标内存块中的内存数据进行排查,以便快速确定目标代码中的bug。
实施本申请的实施例,在检测到嵌入式设备发生内存泄露时,确定内存泄露的类型,然后遍历内存中各个内存块的内存信息,根据内存信息中的内存大小和内存申请函数定位目标内存块,以便用户内存目标内存块中的内存数据排除代码故障,相对于通过人工逐个排查定位内存空间来说,可以提高定位内存块的效率和速度,以便快速诊断代码故障。
下述为本申请装置实施例,可以用于执行本申请方法实施例。对于本申请装置实施例中未披露的细节,请参照本申请方法实施例。
请参见图5,其示出了本申请一个示例性实施例提供的内存泄露的定位装置的结构示意图,以下简称装置5。该装置5可以通过软件、硬件或者两者的结合实现成为电子设备的全部或一部分。装置5包括:确定单元501、遍历单元502、获取单元503、查单元504。
确定单元501,用于检测到嵌入式设备发生内存泄露时,确定内存泄露的类型;
遍历单元502,用于若所述类型为持续泄露,等待第一预设时长后遍历所述内存中所有内存块,以及在各个内存块的内存信息存储区中获取内存信息;其中,所述内存块包括数据存储区和所述内存信息存储区,所述内存信息包括开始标志位、结束标志位、内存大小信息、内存申请时间和内存申请函数信息;
获取单元503,用于根据内存信息获取各个内存块的内存大小和内存申请函数;
查单元504,用于在所述所有内存块中查内存申请函数和内存大小相同的内存块数量超过预设数量的内存块,以及将查到的内存块作为目标内存块。
在一个或多个可能的实施例中,查单元504还用于:
若所述类型为功能泄露,重启所述嵌入式设备;
基于所述嵌入式设备的开机时刻t0,在t1时刻开启所述目标代码中造成功能泄露的功能;其中,t1时刻和t0时间的时间间隔为第二预设时长;
遍历所述内存中所有内存块,以及在各个内存块的内存信息存储区中获取内存申请时间信息;
根据内存申请时间信息查各个内存块中在t1时刻之后申请的内存块,以及将查到的内存块作为目标内存块。
在一个或多个可能的实施例中,所述内存信息存储区由内存开始标志存储区、内存大小信息存储区、内存申请时间信息存储区、内存申请函数信息存储区、数据存储区和内存结束标志存储区组成。
在一个或多个可能的实施例中,根据预设的内存块分配记录表来遍历内存中所有内存块。
在一个或多个可能的实施例中,所述确定内存泄露的类型,包括:
监测内存中空闲空间的大小变化情况;
在所述嵌入式设备开机时,若所述空闲空间逐渐减小至预设阈值,则确定所述类型为持续泄露;或
在开启所述嵌入式设备的功能时,若所述内存中的空闲空间逐渐减小至预设阈值,则确定所述类型为功能泄露。
在一个或多个可能的实施例中,获取单元504还用于:
获取所述目标内存块的数量、地址和ID,以及通过显示单元显示数量、地址和ID。
在一个或多个可能的实施例中,还包括:
运行单元,用于运行嵌入式设备中的目标代码;
在所述目标代码的运行过程中,在内存中为所述目标代码分配内存块或释放内存块。
需要说明的是,上述实施例提供的装置5在执行内存泄露的定位方法时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成上述的全部或者部分功能。另外,上述实施例提供的内存泄露的定位装置与内存泄露的定位方法实施例属于同一构思,其体现实现过程详见方法实施例,这里不再赘述。
上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
本申请实施例还提供了一种计算机存储介质,所述计算机存储介质可以存储有多条指令,所述指令适于由处理器加载并执行如上述图2所示实施例的方法步骤,具体执行过程可以参见图2所示实施例的具体说明,在此不进行赘述。
本申请还提供了一种计算机程序产品,该计算机程序产品存储有至少一条指令,所述至少一条指令由所述处理器加载并执行以实现如上各个实施例所述的内存泄露的定位方法。
请参见图6,为本申请实施例提供了一种电子设备的结构示意图。如图6所示,所述电子设备600可以包括:至少一个处理器601,至少一个通信接口604,用户接口603,存储器605,至少一个通信总线602。
其中,通信总线602用于实现这些组件之间的连接通信。
可选的,电子设备还包括用户接口603,用于执行人机交互操作。例如:用户接口603可以包括显示屏(Display)、摄像头(Camera)。
其中,电子设备设置有通信接口604,用于与外部设备进行通信。相应的,通信接口604可以为无线接口,例如:包括WI-FI接口、蓝牙接口等。
其中,处理器601可以包括一个或者多个处理核心。处理器601利用各种接口和线路连接整个电子设备600内的各个部分,通过运行或执行存储在存储器605内的指令、程序、代码集或指令集,以及调用存储在存储器605内的数据,执行电子设备600的各种功能和处理数据。可选的,处理器601可以采用数字信号处理(Digital Signal Processing,DSP)、现场可编程门阵列(Field-Programmable GateArray,FPGA)、可编程逻辑阵列(ProgrammableLogic Array,PLA)中的至少一种硬件形式来实现。处理器601可集成中央处理器(CentralProcessing Unit,CPU)、图像处理器(Graphics Processing Unit,GPU)和调制解调器等中的一种或几种的组合。其中,CPU主要处理操作系统、用户界面和应用程序等;GPU用于负责显示屏所需要显示的内容的渲染和绘制;调制解调器用于处理无线通信。可以理解的是,上述调制解调器也可以不集成到处理器601中,单独通过一块芯片进行实现。
其中,存储器605可以包括随机存储器(RandomAccess Memory,RAM),也可以包括只读存储器(Read-Only Memory)。可选的,该存储器605包括非瞬时性计算机可读介质(non-transitory computer-readable storage medium)。存储器605可用于存储指令、程序、代码、代码集或指令集。存储器605可包括存储程序区和存储数据区,其中,存储程序区可存储用于实现操作系统的指令、用于至少一个功能的指令(比如触控功能、声音播放功能、图像播放功能等)、用于实现上述各个方法实施例的指令等;存储数据区可存储上面各个方法实施例中涉及到的数据等。存储器605可选的还可以是至少一个位于远离前述处理器601的存储装置。如图6所示,作为一种计算机存储介质的存储器605中可以包括操作系统、网络通信模块、用户接口模块以及应用程序。
在图6所示的电子设备600中,用户接口603主要用于为用户提供输入的接口,获取用户输入的数据;而处理器601可以用于调用存储器605中存储的应用程序,并具体执行如图2所示的方法,具体过程可参照图2所示,此处不再赘述。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体或随机存储记忆体等。
以上所揭露的仅为本申请较佳实施例而已,当然不能以此来限定本申请之权利范围,因此依本申请权利要求所作的等同变化,仍属本申请所涵盖的范围。
本文发布于:2023-04-13 23:24:50,感谢您对本站的认可!
本文链接:https://patent.en369.cn/patent/1/86803.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |