内存检测方法、装置、可读存储介质和电子装置与流程

文档序号:32312944发布日期:2022-11-23 13:16阅读:130来源:国知局
内存检测方法、装置、可读存储介质和电子装置与流程

1.本发明涉及计算机领域,具体而言,涉及一种内存检测方法、装置、可读存储介质和电子装置。


背景技术:

2.目前,主要通过侵入式对大型项目进行内存检测,但是,该方法通常需要在工程中重载内存申请和进行释放内存的操作,然后在重载的函数中对内存的使用状况进行统计,如果出现内存泄露,则难以定位问题所在,从而导致无法对所有内存调用进行统计,存在内存检测效率低的技术问题。
3.针对上述的问题,目前尚未提出有效的解决方案。


技术实现要素:

4.本发明至少部分实施例提供了一种内存检测方法、装置、可读存储介质和电子装置,以至少解决内存检测效率低的技术问题。
5.根据本发明其中一实施例,提供了一种内存检测方法。该方法包括:获取数据库中的原始函数,其中,原始函数用于请求为原始函数的调用对象分配原始内存;将原始函数转换为目标函数,其中,目标函数用于请求为调用对象分配目标内存,目标内存包括原始内存和扩展内存,扩展内存用于存储调用对象的地址信息;基于目标函数对调用对象所使用的内存进行检测,得到检测结果。
6.可选地,该方法可以包括:创建原始函数对应的父进程的子进程;在子进程中,对扩展内存和原始内存进行合并,得到目标内存。
7.可选地,对扩展内存和原始内存进行合并,得到目标内存,包括:将扩展内存合并至原始内存的内存段的尾部,得到目标内存。
8.可选地,该方法可以包括:创建原始函数对应的父进程的子进程;在子进程中,扫描为调用对象分配的原始内存。
9.可选地,基于目标函数对调用对象所使用的内存进行检测,得到检测结果,包括:在子进程中,基于目标函数对调用对象所使用的内存进行检测,得到检测结果,其中,子进程在得到检测结果之前处于启动状态或运行状态,在得到检测结果之后处于停止状态。
10.可选地,在子进程中,基于目标函数对调用对象所使用的内存进行检测,得到检测结果,包括:响应于子进程处于启动状态,基于目标函数调用第一文件信息,其中,第一文件信息包括在子进程处于启动状态时,为调用对象分配的原始内存和用于存储调用对象的地址信息的扩展内存;响应于子进程处于运行状态,基于目标函数调用第二文件信息,其中,第二文件信息包括在子进程处于运行状态时,为调用对象分配的原始内存和用于存储调用对象的地址信息的扩展内存;基于第一文件信息和第二文件信息,确定内存泄露信息,其中,内存泄露信息用于表示在子进程由启动状态进入启动状态时,调用对象所使用的内存是否发生了泄露。
11.可选地,基于第一文件信息和第二文件信息,确定内存泄露信息,包括:获取第一文件信息和第二文件信息二者之间的差异文件信息;基于差异文件信息确定内存泄露信息。
12.可选地,基于差异文件信息确定内存泄露信息,包括:将第二文件信息相对于第一文件信息的增量文件信息,确定为内存泄露信息,其中,差异文件信息包括增量文件信息,内存泄露信息用于表示在子进程由启动状态进入启动状态时,调用对象所使用的内存发生了泄露。
13.根据本发明其中一实施例,还提供了一种内存检测装置,该装置包括:获取单元,用于获取数据库中的原始函数,其中,原始函数用于请求为原始函数的调用对象分配原始内存;转换单元,用于将原始函数转换为目标函数,其中,目标函数用于请求为调用对象分配目标内存,目标内存包括原始内存和扩展内存,扩展内存用于存储调用对象的地址信息;检测单元,用于基于目标函数对调用对象所使用的内存进行检测,得到检测结果。
14.根据本发明其中一实施例,还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,其中,在计算机程序被处理器运行时控制计算机可读存储介质所在设备执行本发明实施例的内存检测方法。
15.根据本发明其中一实施例,还提供了一种电子装置,包括存储器和处理器,存储器中存储有计算机程序,处理器被设置为运行计算机程序以执行上述任一项中的内存检测方法。
16.在本发明至少部分实施例中,获取数据库中的原始函数,其中,原始函数用于请求为原始函数的调用对象分配原始内存;将原始函数转换为目标函数,其中,目标函数用于请求为调用对象分配目标内存,目标内存包括原始内存和扩展内存,扩展内存用于存储调用对象的地址信息;基于目标函数对调用对象所使用的内存进行检测,得到检测结果。也就是说,本发明实施例通过重写数据库中的原始函数,然后在重写后的原始函数中对调用对象所使用的内存进行检测,以达到无需编译代码对内存进行检测的目的,从而实现了提高内存检测效率的技术效果,进而解决了内存检测效率低的技术问题。
附图说明
17.此处所说明的附图用来提供对本发明的进一步理解,构成本技术的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
18.图1是本发明实施例的一种内存检测方法的移动终端的硬件结构框图;
19.图2是根据本发明实施例的一种内存检测方法的流程图;
20.图3是根据本发明实施例的一种中央处理器的使用率的示意图;
21.图4是根据本发明实施例的一种占用内存的示意图;
22.图5是根据本发明实施例的一种内存检测装置的示意图;
23.图6是根据本发明实施例的一种电子装置的示意图。
具体实施方式
24.为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是
本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
25.需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
26.根据本发明其中一实施例,提供了一种内存检测方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
27.该方法实施例可以在移动终端、计算机终端或者类似的运算装置中执行。以运行在移动终端上为例,该移动终端可以是智能手机(如android手机、ios手机等)、平板电脑、掌上电脑以及移动互联网设备(mobileinternetdevices,简称为mid)、pad、游戏机等终端设备。图1是本发明实施例的一种内存检测方法的移动终端的硬件结构框图。如图1所示,移动终端可以包括一个或多个(图1中仅示出一个)处理器102(处理器102可以包括但不限于中央处理器(cpu)、图形处理器(gpu)、数字信号处理(dsp)芯片、微处理器(mcu)、可编程逻辑器件(fpga)、神经网络处理器(npu)、张量处理器(tpu)、人工智能(ai)类型处理器等的处理装置)和用于存储数据的存储器104。可选地,上述移动终端还可以包括用于通信功能的传输设备106、输入输出设备108以及显示设备110。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述移动终端的结构造成限定。例如,移动终端还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。
28.存储器104可用于存储计算机程序,例如,应用软件的软件程序以及模块,如本发明实施例中的内存检测方法对应的计算机程序,处理器102通过运行存储在存储器104内的计算机程序,从而执行各种功能应用以及数据处理,即实现上述的内存检测方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至移动终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
29.传输设备106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括移动终端的通信供应商提供的无线网络。在一个实例中,传输设备106包括一个网络适配器(network interface controller,简称为nic),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输设备106可以为射频(radio frequency,简称为rf)模块,其用于通过无线方式与互联网进行通讯。
30.输入输出设备108中的输入可以来自多个人体学接口设备(human interface device,简称为hid)。例如:键盘和鼠标、游戏手柄、其他专用游戏控制器(如:方向盘、鱼竿、
跳舞毯、遥控器等)。部分人体学接口设备除了提供输入功能之外,还可以提供输出功能,例如:游戏手柄的力反馈与震动、控制器的音频输出等。
31.显示设备110可以例如平视显示器(hud)、触摸屏式的液晶显示器(lcd)和触摸显示器(也被称为“触摸屏”或“触摸显示屏”)。该液晶显示器可使得用户能够与移动终端的用户界面进行交互。在一些实施例中,上述移动终端具有图形用户界面(gui),用户可以通过触摸触敏表面上的手指接触和/或手势来与gui进行人机交互,此处的人机交互功能可选的包括如下交互:创建网页、绘图、文字处理、制作电子文档、游戏、视频会议、即时通信、收发电子邮件、通话界面、播放数字视频、播放数字音乐和/或网络浏览等、用于执行上述人机交互功能的可执行指令被配置/存储在一个或多个处理器可执行的计算机程序产品或可读存储介质中。
32.在一种可能的实施方式中,本发明实施例提供了一种内存检测方法。图2是根据本发明实施例的一种内存检测方法的流程图,如图2所示,该方法包括如下步骤:
33.步骤s202,获取数据库中的原始函数,其中,原始函数用于请求为原始函数的调用对象分配原始内存。
34.在本发明上述步骤s202提供的技术方案中,获取数据库中的原始函数,其中,数据库可以为内存分配器的数据库,该数据库不仅可以为传统的数据库,还可以为通过c++编程所得到的数据库,例如,数据库可以为tcmalloc、jemalloc和mimaloc,原始函数可以用于请求为原始函数的调用对象分配原始内存,原始内存可以为调用对象的数据所占用的内存大小,也就是说,原始函数可以是一个为调用对象申请内存的函数,例如,原始函数可以为malloc、callac、realloc、operatornew、operatornew[]、posix_memalign、aligned_alloc和valloc等,此处仅做举例说明,不做具体限定。
[0035]
步骤s204,将原始函数转换为目标函数,其中,目标函数用于请求为调用对象分配目标内存,目标内存包括原始内存和扩展内存,扩展内存用于存储调用对象的地址信息。
[0036]
在本发明上述步骤s204提供的技术方案中,将数据库中的原始函数进行重写,将重写后的函数确定为目标函数,通过目标函数请求为调用对象分配目标内存,其中,调用对象可以为需要对内存进行检测的对象,原始内存可以用于存储调用对象的文件信息,扩展内存可以用于存储调用对象的地址信息,例如,ip地址。
[0037]
可选地,将数据库中的原始函数进行重写可以包括将扩展内存合并至原始内存的内存段的尾部,例如,在重写malloc库中所有内存申请的函数时,可以首先获取调用者的ip地址,然后在64位操作系统下多申请8个字节的内存、在32位操作系统下多申请4个字节的内存,用来保存该ip地址,并将ip地址保存在内存的尾部,以达到不用考虑内存对齐,节省内存的目的,并且在合并的过程中,释放内存空间(例如,free)函数也无需做额外处理,从而实现了提高内存检测效率的技术效果。
[0038]
步骤s206,基于目标函数对调用对象所使用的内存进行检测,得到检测结果。
[0039]
在本发明上述步骤s206提供的技术方案中,在目标函数为调用对象分配目标内存之后,创建一个可以用于对对调用对象所使用的内存进行扫描函数(例如,memory_dump),该函数可以根据调用对象的ip地址,对调用对象的内存进行扫描,并将每个ip地址所使用的内存大小进行归类统计,得到检测结果,将检测结果输出到文件里。对目标函数为调用对象所分配的内存进行扫描的
[0040]
可选地,可以采用函数(例如,fork)创建一个与原始函数对应的父进程的子进程,在子进程中,目标函数为调用对象分配目标内存,并采用memory_dump函数对调用对象所使用的内存进行检测,以达到避免影响正常业务的响应速度,提高内存检测效率的技术效果。
[0041]
可选地,在基于目标函数对调用对象所使用的内存进行检测,得到检测结果之后,还可以通过离线解析工具对检测结果进行读取,并将检测结果解析为适合阅读的文件格式,该离线解析工具不仅可以用于检测调用对象所使用的内存大小,还可以用来检查调用对象的内存泄露,例如,在子进程启动时转存(dump)一份信息,在子进程运行期再dump一份信息,通过离线解析工具可以获取两个文件的内存差异(diff),内存diff中的增量部分可以为内存泄露的部分。
[0042]
通过本发明上述步骤s202至步骤s206,获取数据库中的原始函数,其中,原始函数用于请求为原始函数的调用对象分配原始内存;将原始函数转换为目标函数,其中,目标函数用于请求为调用对象分配目标内存,目标内存包括原始内存和扩展内存,扩展内存用于存储调用对象的地址信息;基于目标函数对调用对象所使用的内存进行检测,得到检测结果。也就是说,本发明实施例通过重写数据库中的原始函数,然后基于重写后的原始函数对调用对象所使用的内存进行检测,以达到无需编译代码对内存进行检测的目的,从而实现了提高内存检测效率的技术效果,进而解决了内存检测效率低的技术问题。
[0043]
下面对该实施例上述方法进行进一步介绍。
[0044]
作为一种可选的实施方式,该方法还可以包括,创建原始函数对应的父进程的子进程;在子进程中,对扩展内存和原始内存进行合并,得到目标内存。
[0045]
在该实施例中,由于子进程与父进程互不影响,在子进程中修改内存,不会对业务产生影响,因此可以采用函数(例如,fork)调用创建一个与原始函数对应的父进程的子进程,在子进程中,将扩展内存和原始内存进行合并,以得到目标内存,其中,子进程可以为由父进程所创建的进程。
[0046]
作为一种可选的实施方式,该方法还可以包括,对扩展内存和原始内存进行合并,得到目标内存,包括:将扩展内存合并至原始内存的内存段的尾部,得到目标内存。
[0047]
在该实施例中,将扩展内存和原始内存进行合并,得到目标内存的时候,可以将扩展内存合并至原始内存的内存段的尾部,从而在合并的时候可以不用考虑内存对齐,以达到节省内存的目的,并且在合并的过程中,释放内存空间(例如,free)函数也无需做额外处理,实现了提高内存检测效率的技术效果。
[0048]
举例而言,扩展内存可以为ip地址对应的内存,在64位操作系统下,很多编译器在申请超过32字节的内存时,首地址默认16字节对齐,如果我们将ip地址写在首部,则需要申请16个字节来保证对齐,浪费了8个字节。
[0049]
可选地,在一种相关技术中,可以使用平衡树或者哈希表将ip地址对应的内存块单独保存,但是相比较于本发明实施例中将扩展内存和原始内存进行合并的技术方案,所达到的效率并不高。
[0050]
作为一种可选的实施方式,该方法还可以包括,创建原始函数对应的父进程的子进程;在子进程中,扫描为调用对象分配的原始内存。
[0051]
在该实施例中,在对内存进行检测时,需要扫描所有进程为调用对象分配的原始内存,耗时较久,如果在父进程中进行该操作,会影响正常业务的响应速度,因此,在本发明
该实施例中可以创建一个与原始函数对应的父进程的子进程,并将该操作在子进程中进行,以达到避免影响正常业务的响应速度,提高内存检测效率的技术效果。
[0052]
作为一种可选的实施方式,该方法还可以包括,基于目标函数对调用对象所使用的内存进行检测,得到检测结果,包括:在子进程中,基于目标函数对调用对象所使用的内存进行检测,得到检测结果,其中,子进程在得到检测结果之前处于启动状态或运行状态,在得到检测结果之后处于停止状态。
[0053]
在该实施例中,在子进程中,目标函数为调用对象分配目标内存,为了对调用对象所使用的内存进行检测,可以创建一个memory_dump函数,然后利用操作系统的写时复制(copy-on-write,简称为cow)技术,基于调用对象的ip地址对目标函数为调用对象所分配的内存进行检测,得到检测结果,并输出至文件中,在得到检测结果之后,子进程停止运行,以达到避免耗时过久,影响内存检测效率的目的,其中,检测结果可以为调用对象所使用的内存大小,例如,每个ip地址所使用的内存大小。
[0054]
作为一种可选的实施方式,步骤s206,在子进程中,基于目标函数对调用对象所使用的内存进行检测,得到检测结果,包括:响应于子进程处于启动状态,基于目标函数调用第一文件信息,其中,第一文件信息包括在子进程处于启动状态时,为调用对象分配的原始内存和用于存储调用对象的地址信息的扩展内存;响应于子进程处于运行状态,基于目标函数调用第二文件信息,其中,第二文件信息包括在子进程处于运行状态时,为调用对象分配的原始内存和用于存储调用对象的地址信息的扩展内存;基于第一文件信息和第二文件信息,确定内存泄露信息,其中,内存泄露信息用于表示在子进程由启动状态进入启动状态时,调用对象所使用的内存是否发生了泄露。
[0055]
在该实施例中,在子进程处于启动状态时,基于目标函数调用第一文件信息,在子进程处于运行状态时,基于目标函数调用第二文件信息,通过分析工具将第一文件信息和第二文件信息进行对比,获取两个文件信息的内存差异(diff)信息,将内存差异信息中的增量部分确定为内存泄露信息,其中,第一文件信息可以为子进程启动时,将为调用对象分配的原始内存和用于存储调用对象的地址信息的扩展内存进行转存(dump),所得到的文件信息,第二文件信息可以为在子进程运行期间,将为调用对象分配的原始内存和用于存储调用对象的地址信息的扩展内存进行dump,所得到的文件信息。
[0056]
可选地,在子进程中,基于目标函数对调用对象所使用的内存进行检测,得到检测结果之后,还可以通过离线解析工具对检测结果进行读取,并将检测结果解析为适合阅读的文件格式,并进行输出,其中,离线解析工具是一个离线的工具,可以使用任何语言编写,输出格式也可以根据自定义的格式进行调整。
[0057]
作为一种可选的实施方式,该方法还可以包括,基于第一文件信息和第二文件信息,确定内存泄露信息,包括:获取第一文件信息和第二文件信息二者之间的差异文件信息;基于差异文件信息确定内存泄露信息。
[0058]
在该实施例中,通过分析工具将第一文件信息和第二文件信息进行对比,获取第一文件信息和第二文件信息二者之间的差异文件信息,基于差异文件信息确定内存泄露信息,其中,差异文件信息可以为将第一文件信息和第二文件信息进行比较分析所得到的内存差异(diff)。
[0059]
作为一种可选的实施方式,该方法还可以包括,基于差异文件信息确定内存泄露
信息,包括:将第二文件信息相对于第一文件信息的增量文件信息,确定为内存泄露信息,其中,差异文件信息包括增量文件信息,内存泄露信息用于表示在子进程由启动状态进入启动状态时,调用对象所使用的内存发生了泄露。
[0060]
在该实施例中,将第一文件信息和第二文件信息进行比较,得到第一文件信息和第二文件信息二者之间的差异文件信息,将差异文件信息中第二文件信息相对于第一文件信息的增量文件信息确定为内存泄露信息,其中,增量文件信息可以用于表征将第一文件信息和第二文件信息进行比较分析所得到的增量部分的内存。
[0061]
下面结合优选的实施方式对本发明实施例的技术方案进行进一步地举例介绍。
[0062]
目前,大型项目的内存监控非常困难,各个模块使用的内存很难统计,如果发生了内存泄露,也很难定位问题。
[0063]
在一种相关技术中,通常采用侵入式的方法在工程中重载内存申请和释放操作(例如,malloc、calloc、realloc、memalign、posix_memalign、new、new[]、free),然后在重载的函数中统计内存使用状况,但是,侵入式实现,需要编译带有统计功能的和正常版本的两份二进制代码(例如,开源软件中所定义的bson_malloc),难以统计所有内存调用。
[0064]
此外,现有的非侵入式的实现(例如,tcmalloc自带的profile工具),中央处理器(central processing unit,cpu)效率低,内存占用高,难以在生产环境部署。
[0065]
然而,本发明实施例提供了一种非侵入式的,无需项目修改和编译代码,即插即用的内存检测方法,下一步对该方法做进一步介绍。该方法可以包括以下几个步骤:
[0066]
第一步,重写数据库(例如,malloc)中所有内存申请的函数例如,malloc、callac、realloc、operator new、operator new[]、posix_memalign、aligned_alloc、valloc等,首先获取调用者的网络协议(internet protocol address,简称为ip)地址,此外,在64位下多申请8个字节的内存,32位下多申请4个字节的内存,用来保存这个地址。
[0067]
第二步,创建一个函数(例如,memory_dump),扫描所有分配出去的内存,取得所有调用者的地址,归类统计每个ip使用的内存大小,输出到文件里。
[0068]
第三步,实现一个离线解析工具,读取memory_dump输出的文件信息,输出适合阅读的模式。
[0069]
离线解析工具可以将不可读的文件解析为可读的文件格式,其原理可以为:根据内存地址(addr),在文件(例如,maps)中,找对应的内存段,然后算出偏移,通过linux命令(例如,addr2line)得出具体的函数名和行号。
[0070]
举例而言,memory_dump所输出的文件信息的格式可以如下所示:
[0071]“58688508000-558688531000r
‑‑
p 00000000 08:04 263079/usr/bin/vim.basic;558688531000 10 120 5000”[0072][0073]
其中,第一段为导出/proc/pid/maps的内存映射文件,其中,该内存映射文件是linux提供的,每个进程都有,第二段为每个函数的申请的内存大小,从左到右四个数值分别为函数的地址、分配次数、第一次分配的内存大小和分配的内存总大小。
[0074]
通过离线解析工具可以将上述文件解析为可读的文件格式,表1根据本发明实施例的一种离线解析工具解析后的文件格式,如表1所示,解析后的文件可以很直观的得到申请次数为10、第一次申请的大小为120、总大小为5000(4.8kb)、动态库位置为xxx.so
(0x234b)、函数名为function_name、函数所在的文件和行号为filename:lineno。
[0075]
表1一种离线解析工具解析后的文件格式
[0076][0077]
可选地,离线解析工具除了可以分析各个函数申请的内存大小,还可以用来查内存泄露,例如,在进程启动时转存(dump)一份信息,在程序运行期再dump一份信息,通过分析工具获取两个文件的内存差异(diff),增量部分可能是泄露的部分,可以重点分析。
[0078]
需要注意的是,离线解析工具是一个离线的工具,可以使用任何语言编写,输出格式也可以多种多样。
[0079]
下面对本发明实施例的内存检测方法进行进一步地举例介绍。
[0080]
第一步,将调用者的ip地址保存在内存尾部,以申请内存空间(malloc)举例,需要通过代码实现的内容可以包括:获取调用者的地址、分配器可以返回真实申请的内存的大小、多申请一个指针的内存(64位下8个字节,32位下4个字节)、把ip地址记录在这个内存段的尾部。
[0081]
ip地址只能保存在首部或者尾部,64位下很多编译器在申请超过32字节的内存时,首地址默认16字节对齐,如果把ip地址写在首部,则需要申请16个字节来保证对齐,浪费了8个字节,在本发明实施例中,将ip地址保存在尾部,其所带来的有益效果可以包括:释放内存空间(free)函数无需做额外处理,提升效率;不用考虑内存对齐,节省内存。
[0082]
第二步,memory_dump函数,首先调用函数(例如,fork)创建一个子进程,利用操作系统的写时复制(copy-on-write,简称为cow)技术,在子进程中做内存统计,统计结束之后,子进程停止运行。
[0083]
在子进程中做内存统计的原因可以包括:memory_dump需要扫描所有进程分配出去的内存,耗时较多,如果在父进程中做此操作,会影响正常业务的响应速度;多线程程序中,其中一个线程做memory_dump,其他线程还可以申请、释放内存,这会带来竞争,然而在子进程中做统计,不会有多线程竞争问题;由于子进程跟父进程互不影响,在子进程中,修改内存,不会对业务产生任何影响,并且实现成本更低。
[0084]
第三步,在memory_dump中,可以同时导出本进程的所有内存映射表(例如,/proc/self/maps),从而任意一个指针在映射表中可以查到对应的可执行文件的偏移,使用linux下的命令addr2line导出函数和文件名行号即可。
[0085]
图3是根据本发明实施例的一种中央处理器的使用率的示意图,如图3所示,纵坐标为内存检测工具的中央处理器的使用率,左边的柱形图为基于本发明实施例的内存检测方法所实现的工具版本,右边的柱形图为基于现有技术的内存检测方法所实现的工具版本,从图3可以看到,左边的柱形图的中央处理器的使用率较低,则表明基于本发明实施例的内存检测方法所实现的工具版本的处理能力较强。
[0086]
图4是根据本发明实施例的一种占用内存的示意图,如图4所示,纵坐标为内存检
测工具在运行过程中所占用的内存,左边的柱形图为基于本发明实施例的内存检测方法所实现的工具版本,右边的柱形图f为基于现有技术的内存检测方法所实现的工具版本,从图4可以看到,左边的柱形图在运行过程中所占用的内存较低,则表明基于本发明实施例的内存检测方法所实现的工具版本节省内存,可以在线部署。
[0087]
本发明实施例所带的有益效果可以包括:可以通过ld_preload在程序启动时预先加载,无需项目手动编译代码;可以对任意程序(例如,c/c++)进行内存统计和分析;可以在线使用,提高内存检测的效率;可以快速的适配大部分开源的malloc库(例如,jemalloc、tcmalloc、mimalloc、ptmalloc、glibc自带的malloc、linux默认malloc);不同开源库侧重点不同,不同产品可能会使用不同的malloc库,可以使用本发明实施例的技术方案快速改造项目所使用的malloc库。
[0088]
在本发明实施例中,通过重写数据库中所有内存申请的函数,获取调用者的ip地址,并通过在64位下多申请8个字节的内存(在32位下多申请4个字节的内存)保存该地址,通过memory_dump的函数,扫描所有分配出去的内存,取得所有调用者的地址,归类统计每个ip使用的内存大小,输出到文件里,通过离线分析工具,读取memory_dump输出的文件信息,以达到无需编译代码对内存进行检测的目的,从而实现了提高内存检测效率的技术效果,进而解决了内存检测效率低的技术问题。
[0089]
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(例如,rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
[0090]
在本实施例中还提供了一种用于执行图2所示实施例的内存检测装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“单元”、“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
[0091]
图5是根据本发明实施例的一种内存检测装置的示意图,如图5所示,该内存检测装置500包括:获取单元501、转换单元502和检测单元503。
[0092]
获取单元501,用于获取数据库中的原始函数,其中,原始函数用于请求为原始函数的调用对象分配原始内存。
[0093]
转换单元502,用于将原始函数转换为目标函数,其中,目标函数用于请求为调用对象分配目标内存,目标内存包括原始内存和扩展内存,扩展内存用于存储调用对象的地址信息。
[0094]
检测单元503,用于基于目标函数对调用对象所使用的内存进行检测,得到检测结果。
[0095]
可选地,该装置还可以包括:第一创建单元,用于创建原始函数对应的父进程的子进程;合并单元,用于在子进程中,对扩展内存和原始内存进行合并,得到目标内存。
[0096]
可选地,合并单元可以包括:合并子单元,用于将扩展内存合并至原始内存的内存段的尾部,得到目标内存。
[0097]
可选地,该装置还可以包括:第二创建单元,用于创建原始函数对应的父进程的子进程;扫描单元,用于在子进程中,扫描为调用对象分配的原始内存。
[0098]
可选地,检测单元503可以包括:检测子单元,用于在子进程中,基于目标函数对调用对象所使用的内存进行检测,得到检测结果,其中,子进程在得到检测结果之前处于启动状态或运行状态,在得到检测结果之后处于停止状态。
[0099]
可选地,检测子单元可以包括:第一调用模块,用于响应于子进程处于启动状态,基于目标函数调用第一文件信息,其中,第一文件信息包括在子进程处于启动状态时,为调用对象分配的原始内存和用于存储调用对象的地址信息的扩展内存;第二调用模块,用于响应于子进程处于运行状态,基于目标函数调用第二文件信息,其中,第二文件信息包括在子进程处于运行状态时,为调用对象分配的原始内存和用于存储调用对象的地址信息的扩展内存;确定模块,用于基于第一文件信息和第二文件信息,确定内存泄露信息,其中,内存泄露信息用于表示在子进程由启动状态进入启动状态时,调用对象所使用的内存是否发生了泄露。
[0100]
可选地,确定模块包括:获取子模块,用于获取第一文件信息和第二文件信息二者之间的差异文件信息;确定子模块,用于基于差异文件信息确定内存泄露信息。
[0101]
可选地,确定子模块包括:第一确定子模块,用于将第二文件信息相对于第一文件信息的增量文件信息,确定为内存泄露信息,其中,差异文件信息包括增量文件信息,内存泄露信息用于表示在子进程由启动状态进入启动状态时,调用对象所使用的内存发生了泄露。
[0102]
在该实施例的内存检测装置中,获取单元,用于获取数据库中的原始函数,其中,原始函数用于请求为原始函数的调用对象分配原始内存;转换单元,用于将原始函数转换为目标函数,其中,目标函数用于请求为调用对象分配目标内存,目标内存包括原始内存和扩展内存,扩展内存用于存储调用对象的地址信息;检测单元,用于基于目标函数对调用对象所使用的内存进行检测,得到检测结果,从而实现了提高内存检测效率的技术效果,进而解决了内存检测效率低的技术问题。
[0103]
需要说明的是,上述各个单元、模块是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述单元、模块均位于同一处理器中;或者,上述各个单元、模块以任意组合的形式分别位于不同的处理器中。
[0104]
本发明的实施例还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
[0105]
可选地,在本实施例中,上述计算机可读存储介质可以包括但不限于:u盘、只读存储器(read-only memory,简称为rom)、随机存取存储器(random access memory,简称为ram)、移动硬盘、磁碟或者光盘等各种可以存储计算机程序的介质。
[0106]
可选地,在本实施例中,上述计算机可读存储介质可以位于计算机网络中计算机终端群中的任意一个计算机终端中,或者位于移动终端群中的任意一个移动终端中。
[0107]
可选地,在本实施例中,上述计算机可读存储介质可以被设置为存储用于执行以下步骤的计算机程序:
[0108]
s1,获取数据库中的原始函数,其中,原始函数用于请求为原始函数的调用对象分
配原始内存;
[0109]
s2,将原始函数转换为目标函数,其中,目标函数用于请求为调用对象分配目标内存,目标内存包括原始内存和扩展内存,扩展内存用于存储调用对象的地址信息;
[0110]
s3,基于目标函数对调用对象所使用的内存进行检测,得到检测结果。
[0111]
可选地,上述计算机可读存储介质可以被设置为存储用于执行以下步骤的计算机程序:创建原始函数对应的父进程的子进程;在子进程中,对扩展内存和原始内存进行合并,得到目标内存。
[0112]
可选地,上述计算机可读存储介质可以被设置为存储用于执行以下步骤的计算机程序:将扩展内存合并至原始内存的内存段的尾部,得到目标内存。
[0113]
可选地,上述计算机可读存储介质可以被设置为存储用于执行以下步骤的计算机程序:创建原始函数对应的父进程的子进程;在子进程中,扫描为调用对象分配的原始内存。
[0114]
可选地,上述计算机可读存储介质可以被设置为存储用于执行以下步骤的计算机程序:在子进程中,基于目标函数对调用对象所使用的内存进行检测,得到检测结果,其中,子进程在得到检测结果之前处于启动状态或运行状态,在得到检测结果之后处于停止状态。
[0115]
可选地,上述计算机可读存储介质可以被设置为存储用于执行以下步骤的计算机程序:响应于子进程处于启动状态,基于目标函数调用第一文件信息,其中,第一文件信息包括在子进程处于启动状态时,为调用对象分配的原始内存和用于存储调用对象的地址信息的扩展内存;响应于子进程处于运行状态,基于目标函数调用第二文件信息,其中,第二文件信息包括在子进程处于运行状态时,为调用对象分配的原始内存和用于存储调用对象的地址信息的扩展内存;基于第一文件信息和第二文件信息,确定内存泄露信息,其中,内存泄露信息用于表示在子进程由启动状态进入启动状态时,调用对象所使用的内存是否发生了泄露。
[0116]
可选地,上述计算机可读存储介质可以被设置为存储用于执行以下步骤的计算机程序:获取第一文件信息和第二文件信息二者之间的差异文件信息;基于差异文件信息确定内存泄露信息。
[0117]
可选地,上述计算机可读存储介质可以被设置为存储用于执行以下步骤的计算机程序:将第二文件信息相对于第一文件信息的增量文件信息,确定为内存泄露信息,其中,差异文件信息包括增量文件信息,内存泄露信息用于表示在子进程由启动状态进入启动状态时,调用对象所使用的内存发生了泄露。
[0118]
在该实施例的计算机可读存储介质中,获取数据库中的原始函数,其中,原始函数用于请求为原始函数的调用对象分配原始内存;将原始函数转换为目标函数,其中,目标函数用于请求为调用对象分配目标内存,目标内存包括原始内存和扩展内存,扩展内存用于存储调用对象的地址信息;基于目标函数对调用对象所使用的内存进行检测,得到检测结果,从而实现了提高内存检测效率的技术效果,进而解决了内存检测效率低的技术问题。
[0119]
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本发明实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个计算机
可读存储介质(可以是cd-rom,u盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、终端装置、或者网络设备等)执行根据本发明实施方式的方法。
[0120]
在本技术的示例性实施例中,计算机可读存储介质上存储有能够实现本实施例上述方法的程序产品。在一些可能的实施方式中,本发明实施例的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当所述程序产品在终端设备上运行时,所述程序代码用于使所述终端设备执行本实施例上述“示例性方法”部分中描述的根据本发明各种示例性实施方式的步骤。
[0121]
根据本发明的实施方式的用于实现上述方法的程序产品,其可以采用便携式紧凑盘只读存储器(cd-rom)并包括程序代码,并可以在终端设备,例如个人电脑上运行。然而,本发明实施例的程序产品不限于此,在本发明实施例中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
[0122]
上述程序产品可以采用一个或多个计算机可读介质的任意组合。该计算机可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列举)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。
[0123]
需要说明的是,计算机可读存储介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、rf等等,或者上述的任意合适的组合。
[0124]
本发明的实施例还提供了一种电子装置,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。
[0125]
可选地,上述电子装置还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
[0126]
可选地,在本实施例中,上述处理器可以被设置为通过计算机程序执行以下步骤:
[0127]
s1,获取数据库中的原始函数,其中,原始函数用于请求为原始函数的调用对象分配原始内存;
[0128]
s2,将原始函数转换为目标函数,其中,目标函数用于请求为调用对象分配目标内存,目标内存包括原始内存和扩展内存,扩展内存用于存储调用对象的地址信息;
[0129]
s3,基于目标函数对调用对象所使用的内存进行检测,得到检测结果。
[0130]
可选地,上述处理器可以被设置为通过计算机程序执行以下步骤:创建原始函数对应的父进程的子进程;在子进程中,对扩展内存和原始内存进行合并,得到目标内存。
[0131]
可选地,上述处理器可以被设置为通过计算机程序执行以下步骤:将扩展内存合并至原始内存的内存段的尾部,得到目标内存。
[0132]
可选地,上述处理器可以被设置为通过计算机程序执行以下步骤:创建原始函数对应的父进程的子进程;在子进程中,扫描为调用对象分配的原始内存。
[0133]
可选地,上述处理器可以被设置为通过计算机程序执行以下步骤:在子进程中,基
于目标函数对调用对象所使用的内存进行检测,得到检测结果,其中,子进程在得到检测结果之前处于启动状态或运行状态,在得到检测结果之后处于停止状态。
[0134]
可选地,上述处理器可以被设置为通过计算机程序执行以下步骤:响应于子进程处于启动状态,基于目标函数调用第一文件信息,其中,第一文件信息包括在子进程处于启动状态时,为调用对象分配的原始内存和用于存储调用对象的地址信息的扩展内存;响应于子进程处于运行状态,基于目标函数调用第二文件信息,其中,第二文件信息包括在子进程处于运行状态时,为调用对象分配的原始内存和用于存储调用对象的地址信息的扩展内存;基于第一文件信息和第二文件信息,确定内存泄露信息,其中,内存泄露信息用于表示在子进程由启动状态进入启动状态时,调用对象所使用的内存是否发生了泄露。
[0135]
可选地,上述处理器可以被设置为通过计算机程序执行以下步骤:获取第一文件信息和第二文件信息二者之间的差异文件信息;基于差异文件信息确定内存泄露信息。
[0136]
可选地,上述处理器可以被设置为通过计算机程序执行以下步骤:将第二文件信息相对于第一文件信息的增量文件信息,确定为内存泄露信息,其中,差异文件信息包括增量文件信息,内存泄露信息用于表示在子进程由启动状态进入启动状态时,调用对象所使用的内存发生了泄露。
[0137]
在该实施例的电子装置中,获取数据库中的原始函数,其中,原始函数用于请求为原始函数的调用对象分配原始内存;将原始函数转换为目标函数,其中,目标函数用于请求为调用对象分配目标内存,目标内存包括原始内存和扩展内存,扩展内存用于存储调用对象的地址信息;基于目标函数对调用对象所使用的内存进行检测,得到检测结果,从而实现了提高内存检测效率的技术效果,进而解决了内存检测效率低的技术问题。
[0138]
图6是根据本发明实施例的一种电子装置的示意图。如图6所示,电子装置600仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
[0139]
如图6所示,电子装置600以通用计算设备的形式表现。电子装置600的组件可以包括但不限于:上述至少一个处理器610、上述至少一个存储器620、连接不同系统组件(包括存储器620和处理器610)的总线630和显示器640。
[0140]
其中,上述存储器620存储有程序代码,所述程序代码可以被处理器610执行,使得处理器610执行本技术实施例的上述方法部分中描述的根据本发明各种示例性实施方式的步骤。
[0141]
存储器620可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(ram)6201和/或高速缓存存储单元6202,还可以进一步包括只读存储单元(rom)6203,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。
[0142]
在一些实例中,存储器620还可以包括具有一组(至少一个)程序模块6205的程序/实用工具6204,这样的程序模块6205包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。存储器620可进一步包括相对于处理器610远程设置的存储器,这些远程存储器可以通过网络连接至电子装置600。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
[0143]
总线630可以为表示几类总线结构中的一种或多种,包括存储单元总线或者存储
单元控制器、外围总线、图形加速端口、处理器610或者使用多种总线结构中的任意总线结构的局域总线。
[0144]
显示器640可以例如触摸屏式的液晶显示器(lcd),该液晶显示器可使得用户能够与电子装置600的用户界面进行交互。
[0145]
可选地,电子装置600也可以与一个或多个外部设备600(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得用户能与该电子装置600交互的设备通信,和/或与使得该电子装置600能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(i/o)接口650进行。并且,电子装置600还可以通过网络适配器660与一个或者多个网络(例如局域网(lan),广域网(wan)和/或公共网络,例如因特网)通信。如图6所示,网络适配器660通过总线630与电子装置600的其它模块通信。应当明白,尽管图6中未示出,可以结合电子装置600使用其它硬件和/或软件模块,可以包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、raid系统、磁带驱动器以及数据备份存储系统等。
[0146]
上述电子装置600还可以包括:键盘、光标控制设备(如鼠标)、输入/输出接口(i/o接口)、网络接口、电源和/或相机。
[0147]
本领域普通技术人员可以理解,图6所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,电子装置600还可包括比图6中所示更多或者更少的组件,或者具有与图1所示不同的配置。存储器620可用于存储计算机程序及对应的数据,如本发明实施例中的内存检测方法对应的计算机程序及对应的数据。处理器610通过运行存储在存储器620内的计算机程序,从而执行各种功能应用以及数据处理,即实现上述的内存检测方法。
[0148]
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
[0149]
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
[0150]
在本技术所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
[0151]
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0152]
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0153]
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机
设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
[0154]
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1