一种内存泄露检测方法、装置、电子设备及存储介质与流程

文档序号:29856241发布日期:2022-04-30 09:26阅读:92来源:国知局
一种内存泄露检测方法、装置、电子设备及存储介质与流程

1.本发明涉及计算机应用技术领域,特别是涉及一种内存泄露检测方法、装置、电子设备及存储介质。


背景技术:

2.在做native(一个计算机函数)内存泄露监控分析时,通常需要通过hook(钩子函数)对内存分配函数进行拦截,在程序每次调用内存分配函数时,将获取到的分配函数调用栈信息(以下统称为内存栈信息)进行提取、存储、维护,以便在检测到内存泄露地址后,通过检测到的地址查找对应的内存栈信息位置。
3.目前,业界常用的内存栈存储、维护方案是通过全局map(查找表)和全局锁的方法,参见图1,将获取到的内存栈信息存储到全局map,并加上锁确保多线程安全。但此方法在多线程情况下会存在明显的性能问题,由于不同线程之间会相互抢占锁资源,导致部分线程甚至主线程短暂的停滞。在此情景下可能会影响用户正常使用app(应用程序),出现明显的操作卡顿、滑动不流畅等负面效果,影响用户体验,无法做到应用程序在线上进行无感知且高效率的内存泄露监控分析。
4.因此,如何提高内存泄露监控分析的效率是应用程序整体监控性能提升需要解决的重要问题。


技术实现要素:

5.本发明实施例的目的在于提供一种内存泄露检测方法、装置、电子设备及存储介质,以实现提高内存泄露监控分析效率的目的。具体技术方案如下:
6.第一方面,本技术实施例提供了一种内存泄露检测方法,所述方法包括:
7.监控目标进程运行过程中调用的原生内存分配函数;
8.在所述原生内存分配函数分配待分配内存的过程中,获取所述待分配内存对应的内存栈信息,其中,所述内存栈信息包括内存分配的调用栈地址列表;
9.根据所述内存栈信息,分配数据内存区域及第一预设长度的预留内存区域,其中,所述数据内存区域为所述待分配内存对应的内存区域,所述第一预设长度的预留内存区域为用于存储所述内存栈信息预留的内存区域;
10.将所述内存栈信息存储在所述预留内存区域中;
11.在检测到泄露地址时,在所述泄露地址对应的预留内存区域中读取内存栈信息。
12.在一种可能的实施方式中,在所述原生内存分配函数分配待分配内存的过程中,获取所述待分配内存对应的内存栈信息,包括:
13.在检测到原生内存分配函数的内存栈信息时,在预设钩子函数中提取所述内存栈信息。
14.在一种可能的实施方式中,根据所述内存栈信息,分配数据内存区域及第一预设长度的预留内存区域,包括:
15.获取第一预设长度,根据所述内存栈信息及所述第一预设长度,回调所述原生内存分配函数,得到数据内存区域及预留内存区域,其中,所述预留内存区域为所述数据内存区域尾部后的第一预设长度的存储区域。
16.在一种可能的实施方式中,将所述内存栈信息存储在所述预留内存区域中,包括:
17.在所述预留内存区域中预留第二预设长度的预留空间,在所述预留内存区域的预留空间后存储所述内存栈信息;
18.在所述预留空间中写入第二预设长度的预设特征值,并在所述内存栈信息之后写入第二预设长度的预设特征值。
19.第二方面,本技术实施例提供了一种内存泄露检测装置,所述装置包括:
20.目标进程监控模块,用于在监控目标进程运行过程中调用的原生内存分配函数;
21.内存栈信息获取模块,用于在所述原生内存分配函数分配待分配内存的过程中,获取所述待分配内存对应的内存栈信息,其中,所述内存栈信息包括内存分配的调用栈地址列表;
22.内存分配模块,用于根据所述内存栈信息,分配数据内存区域及第一预设长度的预留内存区域,其中,所述数据内存区域为所述待分配内存对应的内存区域,所述第一预设长度的预留内存区域为用于存储所述内存栈信息预留的内存区域;
23.内存栈信息存储模块,用于将所述内存栈信息存储在所述预留内存区域中;
24.内存栈信息读取模块,用于在检测到泄露地址时,在所述泄露地址对应的预留内存区域中读取内存栈信息。
25.在一种可能的实施方式中,所述内存栈信息获取模块,具体用于:在检测到原生内存分配函数的内存栈信息时,在预设钩子函数中提取所述内存栈信息。
26.在一种可能的实施方式中,所述内存分配模块,具体用于:获取第一预设长度,根据所述内存栈信息及所述第一预设长度,回调所述原生内存分配函数,得到数据内存区域及预留内存区域,其中,所述预留内存区域为所述数据内存区域尾部后的第一预设长度的存储区域。
27.在一种可能的实施方式中,所述内存栈信息存储模块具体用于:在所述预留内存区域中预留第二预设长度的预留空间,在所述预留内存区域的预留空间后存储所述内存栈信息;
28.在所述预留空间中写入第二预设长度的预设特征值,并在所述内存栈信息之后写入第二预设长度的预设特征值。
29.第三方面,本技术实施例提供了一种电子设备,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;
30.存储器,用于存放计算机程序;
31.处理器,用于执行存储器上所存放的程序时,实现本技术中任一所述的内存泄露检测方法。
32.第四方面,本技术实施例提供了一种计算机可读存储介质,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现本技术中任一所述的内存泄露检测方法。
33.本技术实施例提供的内存泄露检测方法、装置、电子设备及存储介质,通过监控目
标进程运行过程中调用的原生内存分配函数;在所述原生内存分配函数分配待分配内存的过程中,获取所述待分配内存对应的内存栈信息,其中,所述内存栈信息包括内存分配的调用栈地址列表;根据所述内存栈信息,分配数据内存区域及第一预设长度的预留内存区域,其中,所述数据内存区域为所述待分配内存对应的内存区域,所述第一预设长度的预留内存区域为用于存储所述内存栈信息预留的内存区域;将所述内存栈信息存储在所述预留内存区域中;在检测到泄露地址时,在所述泄露地址对应的预留内存区域中读取内存栈信息。与现有技术相比,避免了全局map和全局锁带来的内存分配资源的消耗,无需额外的内存分配,将内存栈信息存储在预留内存区域中,在内存泄露监控分析时可以方便、快速、高效的查找出内存栈信息,从而实现了提高内存泄露监控分析的效率,进而提升了应用程序整体的监控性能。
34.当然,实施本技术的任一产品或方法并不一定需要同时达到以上所述的所有优点。
附图说明
35.为了更清楚地说明本技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍。
36.图1为相关技术中内存栈存储方法的一种示意图;
37.图2为本技术实施例的内存泄露检测方法的第一种示意图;
38.图3为本技术实施例的内存泄露检测方法的第二种示意图;
39.图4为本技术实施例的内存泄露检测方法的第三种示意图;
40.图5为本技术实施例的内存泄露检测方法的第四种示意图;
41.图6为本技术实施例的内存泄露检测方法的第五种示意图;
42.图7为本技术实施例的内存泄露检测方法的第六种示意图;
43.图8为本技术实施例的内存泄露检测方法的第七种示意图;
44.图9为本技术实施例的内存泄露检测装置的一种示意图;
45.图10为本技术实施例的电子设备的一种示意图。
具体实施方式
46.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员基于本技术所获得的所有其他实施例,都属于本技术保护的范围。
47.为了实现提高内存泄露监控分析的效率,本技术实施例提供了一种内存泄露检测方法,该方法包括:监控目标进程运行过程中调用的原生内存分配函数;在所述原生内存分配函数分配待分配内存的过程中,获取所述待分配内存对应的内存栈信息,其中,所述内存栈信息包括内存分配的调用栈地址列表;根据所述内存栈信息,分配数据内存区域及第一预设长度的预留内存区域,其中,所述数据内存区域为所述待分配内存对应的内存区域,所述第一预设长度的预留内存区域为用于存储所述内存栈信息预留的内存区域;将所述内存栈信息存储在所述预留内存区域中;在检测到泄露地址时,在所述泄露地址对应的预留内
存区域中读取内存栈信息。
48.本技术实施例中,将内存栈信息存储在预留内存区域中,无需额外的内存分配,可以方便、快速、高效的查找出内存栈信息,从而实现了提高内存泄露监控分析的效率。
49.下面进行具体说明,参见图2,图2为本技术实施例的一种内存泄露检测方法的示意图,该方法包括:
50.s10,监控目标进程运行过程中调用的原生内存分配函数。
51.在内存泄露监控分析过程中,需要对每个进程中的原生内存分配函数进行监控。
52.s11,在所述原生内存分配函数分配待分配内存的过程中,获取所述待分配内存对应的内存栈信息,其中,所述内存栈信息包括内存分配的调用栈地址列表。
53.本技术实施例中的内存栈存储方法可以通过计算机实现。其中,内存栈信息为内存分配函数被调用时生成的表征程序在运行时调用关系的地址列表,内存分配函数用于申请一块连续的指定大小的内存块区域,例如,malloc,calloc,realloc等,本技术中并不对内存分配函数进行限定。内存分配函数每次被调用时都会生成对应的地址列表。
54.s12,根据所述内存栈信息,分配数据内存区域及第一预设长度的预留内存区域,其中,所述数据内存区域为所述待分配内存对应的内存区域,所述第一预设长度的预留内存区域为用于存储所述内存栈信息预留的内存区域。
55.数据内存区域为内存分配函数被调用时申请的内存区域,例如,线程a需要申请1024kb的内存空间,则需要调用内存分配函数分配1024kb的内存区域,该1024kb的内存区域即为数据内存区域。第一预设长度的预留内存区域为用于存储对应的内存栈信息预留的内存区域,第一预设长度可根据内存栈信息所占用的内存空间大小设置,例如可以为16个字节或18个字节等。
56.s13,将所述内存栈信息存储在所述预留内存区域中。
57.s14,在检测到泄露地址时,在所述泄露地址对应的预留内存区域中读取内存栈信息。
58.一个例子中,可以利用内存泄露监控分析工具来检测发生内存泄露的地址,即泄露地址。内存泄露监控分析工具可以根据实际情况自定义选取,例如,可以选取malloc debug或leaktracer等常用的native内存泄露监控分析工具,本技术中并不对内存泄露监控分析工具的具体类型进行限定。
59.一个例子中,泄露地址包括发生泄露的内存区域的首地址和长度信息,根据首地址和长度信息确定内存区域的尾部地址,从泄露的内存尾部开始查找,可在泄露地址对应的预留内存区域中读取内存栈信息。
60.本技术实施例中,将内存栈信息存储在预留内存区域中,与现有技术相比,无需全局map和全局锁,因此避免了维护全局map和全局锁带来的内存资源的消耗,仅需在分配的数据内存区域后扩展出用于存储内存栈信息的存储空间,无需额外分配内存用于存储内存栈信息,在检测到泄露地址时,在泄露地址对应的预留内存区域中读取内存栈信息,由于预留内存区域仅为十几个字节,所以查找速度更快。
61.在一种可能的实施方式中,参见图3,上述s11,包括:
62.s111,在检测到原生内存分配函数的内存栈信息时,在预设钩子函数中提取所述内存栈信息。
63.预设钩子函数可以是hook函数,hook函数允许应用程序截获处理系统消息或特定事件,用于在原生内存分配函数被调用时捕获内存栈信息。
64.原生内存分配函数为应用程序底层内存分配函数,为了获取应用程序底层内存分配函数被调用时的内存栈信息,需要自定义一个内存分配函数,例如,应用程序底层内存分配函数malloc,自定义一个内存分配函数my_malloc。
65.在程序运行过程中,每次调用原生内存分配函数时,可以在钩子函数中获取对应的内存栈信息。
66.在一个例子中,参见图4,在程序每次调用原生内存分配函数malloc时,利用钩子函数将原生内存分配函数malloc的内存栈信息路由到自定义的内存分配函数my_malloc中,通过回调原生内存分配函数malloc实现内存分配。
67.本技术实施例中,通过钩子函数提取内存栈信息,为监控原生内存分配函数提供了技术手段。
68.在一种可能的实施方式中,参见图5,上述s12,包括:
69.s121,获取第一预设长度,根据所述内存栈信息及所述第一预设长度,回调所述原生内存分配函数,得到数据内存区域及预留内存区域,其中,所述预留内存区域为所述数据内存区域尾部后的第一预设长度的存储区域。
70.在程序每次调用原生内存分配函数时,可获取申请的数据内存区域,自定义内存分配函数利用钩子函数获取调用原生内存分配函数时对应的内存栈信息,在自定义内存分配函数回调原生内存分配函数接口时,根据内存栈信息占用的内存空间的大小,在数据内存区域尾部预留出用于存储内存栈信息所需要的存储空间。
71.本技术实施例中,利用预设钩子函数提取内存栈信息,并将内存栈信息存储在数据内存区域尾部,无需额外分配内存用于存储内存栈信息,同时也方便查找对应的内存栈信息。
72.在一种可能的实施方式中,参见图6,上述s13,包括:
73.s131,在所述预留内存区域中预留第二预设长度的预留空间,在所述预留内存区域的预留空间后存储所述内存栈信息。
74.s132,在所述预留空间中写入第二预设长度的预设特征值,并在所述内存栈信息之后写入第二预设长度的预设特征值。
75.预设特征值可以是magic(魔法)特征值,magic特征值为自定义的特征值,可将特征值设定为具有一定意义的或便于识别的特征值,在一个例子中,可将magic特征值设置为2个字节的数字或者字母,比如:1024或ab。
76.第二预设长度的预留空间用于存储magic特征值。在一个例子中,预留4个字节的内存空间存储magic特征值。
77.在预留内存区域中预留出用于存储magic特征值的预留空间,在预留内存区域的预留空间后存储内存栈信息,在预留空间中写入magic特征值,并在内存栈信息之后写入magic特征值。
78.在一个例子中,参见图7,将获取到的内存栈信息存储在预留内存区域中,并在内存栈信息的首部和尾部添加magic特征值。
79.在一个例子中,参见图8,将内存栈信息存储在预留内存区域中,并在内存栈信息
的首部和尾部添加magic特征值,根据泄露地址,从泄露的内存尾部开始查找,通过查找magic特征值,锁定内存栈信息的存储位置,提取内存栈信息。
80.本技术实施例中,在内存栈信息的首部和尾部添加magic特征值,利用magic特征值可以方便快捷的确定泄露地址对应预留内存区域中的内存栈信息,通过添加magic特征值,可以快速锁定内存栈信息的存储位置,并提取内存栈信息,通过内存栈信息能够确定发生内存泄露的位置。可以提高内存泄露监控分析效率,从而实现应用程序在线上进行无感知高效率内存泄漏监控分析。
81.本技术实施例还提供了一种内存泄露检测装置,参见图9,该装置包括:
82.目标进程监控模块30,用于在监控目标进程运行过程中调用的原生内存分配函数;
83.内存栈信息获取模块31,用于在所述原生内存分配函数分配待分配内存的过程中,获取所述待分配内存对应的内存栈信息,其中,所述内存栈信息包括内存分配的调用栈地址列表;
84.内存分配模块32,用于根据所述内存栈信息,分配数据内存区域及第一预设长度的预留内存区域,其中,所述数据内存区域为所述待分配内存对应的内存区域,所述第一预设长度的预留内存区域为用于存储所述内存栈信息预留的内存区域;
85.内存栈信息存储模块33,用于将所述内存栈信息存储在所述预留内存区域中;
86.内存栈信息读取模块34,用于在检测到泄露地址时,在所述泄露地址对应的预留内存区域中读取内存栈信息。
87.在一种可能的实施方式中,所述内存栈信息获取模块,具体用于:在检测到原生内存分配函数的内存栈信息时,在预设钩子函数中提取所述内存栈信息。
88.在一种可能的实施方式中,所述内存分配模块,具体用于:获取第一预设长度,根据所述内存栈信息及所述第一预设长度,回调所述原生内存分配函数,得到数据内存区域及预留内存区域,其中,所述预留内存区域为所述数据内存区域尾部后的第一预设长度的存储区域。
89.在一种可能的实施方式中,所述内存栈信息存储模块具体用于:在所述预留内存区域中预留第二预设长度的预留空间,在所述预留内存区域的预留空间后存储所述内存栈信息;
90.在所述预留空间中写入第二预设长度的预设特征值,并在所述内存栈信息之后写入第二预设长度的预设特征值。
91.本发明实施例还提供了一种电子设备,如图10所示,包括处理器51、通信接口52、存储器53和通信总线54,其中,处理器51,通信接口52,存储器53通过通信总线54完成相互间的通信,
92.存储器53,用于存放计算机程序;
93.处理器51,用于执行存储器53上所存放的程序时,实现上述实施例中任一所述的方法。
94.上述终端提到的通信总线可以是外设部件互连标准(peripheral component interconnect,简称pci)总线或扩展工业标准结构(extended industry standard architecture,简称eisa)总线等。该通信总线可以分为地址总线、数据总线、控制总线等。
为便于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
95.通信接口用于上述终端与其他设备之间的通信。
96.存储器可以包括随机存取存储器(random access memory,简称ram),也可以包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。可选的,存储器还可以是至少一个位于远离前述处理器的存储装置。
97.上述的处理器可以是通用处理器,包括中央处理器(central processing unit,简称cpu)、网络处理器(network processor,简称np)等;还可以是数字信号处理器(digital signal processor,简称dsp)、专用集成电路(application specific integrated circuit,简称asic)、现场可编程门阵列(field-programmable gate array,简称fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
98.在本发明提供的又一实施例中,还提供了一种计算机可读存储介质,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现上述实施例中任一所述的方法。
99.在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质(例如固态硬盘solid state disk(ssd))等。
100.需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
101.本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、电子设备、存储介质的实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
102.以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1