CN113268243B - 内存预测方法及装置、存储介质、电子设备 - Google Patents

内存预测方法及装置、存储介质、电子设备 Download PDF

Info

Publication number
CN113268243B
CN113268243B CN202110511788.2A CN202110511788A CN113268243B CN 113268243 B CN113268243 B CN 113268243B CN 202110511788 A CN202110511788 A CN 202110511788A CN 113268243 B CN113268243 B CN 113268243B
Authority
CN
China
Prior art keywords
memory
linked list
list
source code
code file
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
CN202110511788.2A
Other languages
English (en)
Other versions
CN113268243A (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.)
Netease Hangzhou Network Co Ltd
Original Assignee
Netease Hangzhou Network Co 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 Netease Hangzhou Network Co Ltd filed Critical Netease Hangzhou Network Co Ltd
Priority to CN202110511788.2A priority Critical patent/CN113268243B/zh
Publication of CN113268243A publication Critical patent/CN113268243A/zh
Application granted granted Critical
Publication of CN113268243B publication Critical patent/CN113268243B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4434Reducing the memory space required by the program code
    • G06F8/4435Detection or removal of dead or redundant code

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本公开关于一种内存预测方法及装置、存储介质、电子设备。其中,该方法包括:获取源代码文件;将上述源代码文件转换为目标数据结构,其中,上述目标数据结构中的各个叶子节点用于表征上述源代码文件中对应代码块的逻辑顺序和执行数据;基于上述目标数据结构预测上述源代码文件对内存的使用情况,得到预测结果。本公开解决了现有技术中的内存检测方案不适用于前期开发阶段的设计场景,难以基于内存泄漏问题辅助改善内存申请释放架构设计的技术问题。

Description

内存预测方法及装置、存储介质、电子设备
技术领域
本公开涉及内存预测领域,具体而言,涉及一种内存预测方法及装置、存储介质、电子设备。
背景技术
针对现有技术中无法简单直接的定位到内存泄漏的源头的技术问题,一种一般的解决方案是在日常软件工程活动中对可能出现内存泄漏问题的场景进行加强测试,另一种技术性的解决方案是直接在功能代码中打桩,以小量降低运行效率的方式达到对内存申请和释放的掌控。
当软件出现内存申请时,改变程序流向,在实际申请内存的前后,执行一些用户预定义的动作包括但不限于内存申请的记录等。同理,当软件出现内存释放时,亦在实际释放的前后执行一些用户欲定义的动作包括但不限于内存释放的记录等。如下图1所示,现有技术解决了内存跟踪的问题,以牺牲效率的方式达成了对内存进行记录的目的。
但是,上述如图1所示的动态跟踪内存的实现方法,必须将代码编译完毕然后在实际运行过程中记录内存的申请与释放,对涉及内存申请释放架构的前期设计几乎是起不到帮助作用的,即上述现有技术中的内存检测方案更适用于调试场景,不适用于前期开发阶段的设计场景,难以基于内存泄漏问题辅助改善架构设计。
针对上述的问题,目前尚未提出有效的解决方案。
发明内容
本公开实施例提供了一种内存预测方法及装置、存储介质、电子设备,以至少解决现有技术中的内存检测方案不适用于前期开发阶段的设计场景,难以基于内存泄漏问题辅助改善内存申请释放架构设计的技术问题。
根据本公开实施例的一个方面,提供了一种内存预测方法,包括:获取源代码文件;将上述源代码文件转换为目标数据结构,其中,上述目标数据结构中的各个叶子节点用于表征上述源代码文件中对应代码块的逻辑顺序和执行数据;基于上述目标数据结构预测上述源代码文件对内存的使用情况,得到预测结果。
根据本公开实施例的另一方面,还提供了一种内存预测装置,包括:获取模块,用于获取源代码文件;转换模块,用于将上述源代码文件转换为目标数据结构,其中,上述目标数据结构中的各个叶子节点用于表征上述源代码文件中对应代码块的逻辑顺序和执行数据;预测模块,用于基于上述目标数据结构预测上述源代码文件对内存的使用情况,得到预测结果。
根据本公开实施例的另一方面,还提供了一种非易失性存储介质,上述非易失性存储介质包括存储的程序,其中,在上述程序运行时控制上述非易失性存储介质所在设备执行任意一项上述的内存预测方法。
根据本公开实施例的另一方面,还提供了一种电子设备,包括存储器和处理器,上述存储器中存储有计算机程序,上述处理器被设置为运行上述计算机程序以执行任意一项上述的内存预测方法。
在本公开实施例中,通过获取源代码文件;将上述源代码文件转换为目标数据结构,其中,上述目标数据结构中的各个叶子节点用于表征上述源代码文件中对应代码块的逻辑顺序和执行数据;基于上述目标数据结构预测上述源代码文件对内存的使用情况,得到预测结果,达到了在内存申请释放架构的前期设计过程中,预测源代码文件对内存的使用情况的目的,从而实现了基于内存泄漏问题辅助改善内存申请释放架构设计的技术效果,进而解决了现有技术中的内存检测方案不适用于前期开发阶段的设计场景,难以基于内存泄漏问题辅助改善内存申请释放架构设计的技术问题。
附图说明
此处所说明的附图用来提供对本公开的进一步理解,构成本申请的一部分,本公开的示意性实施例及其说明用于解释本公开,并不构成对本公开的不当限定。在附图中:
图1是根据现有技术的一种内存检测方法的流程图;
图2是根据本公开实施例的一种内存预测方法的流程图;
图3(a)是根据本公开实施例的一种可选的基于抽象语法树生成倒挂链表的表示意图;
图3(b)是根据本公开实施例的一种可选的筛选列表和选中列表的示意图;
图4是根据本公开实施例的一种可选的标记后链表的示意图;
图5(a)是根据本公开实施例的一种可选的遍历待定链表的示意图;
图5(b)是根据本公开实施例的一种可选的基于待定链表的遍历结果进行处理的流程图;
图6是根据本公开实施例的一种将抽象语法树转化为黑箱的示意图;
图7是根据本公开实施例的一种基于黑箱模拟得到内存申请与释放曲线的流程图;
图8是根据本公开实施例的一种内存预测装置的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本公开方案,下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分的实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本公开保护的范围。
需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、***、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
首先,为方便理解本公开实施例,下面将对本公开中所涉及的部分术语或名词进行解释说明:
内存泄漏:一个驻守进程正常运行的过程中,占用的内存持续增长,直至用完操作***的可分配内存。
抽象语法树:将代码源文件转换成一种具有逻辑的数据结构,它的各个叶子节点表达了源代码各个代码块的逻辑顺序和执行数据。
根据本公开实施例,提供了一种内存预测方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机***中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
该方法实施例的技术方案可以在移动终端、计算机终端或者类似的运算装置中执行。以运行在移动终端上为例,该移动终端可以是智能手机(如Android手机、iOS手机等)、平板电脑、掌上电脑以及移动互联网设备(Mobile Internet Devices,简称为MID)、PAD等终端设备。移动终端可以包括一个或多个处理器(处理器可以包括但不限于中央处理器(CPU)、图形处理器(GPU)、数字信号处理(DSP)芯片、微处理器(MCU)、可编程逻辑器件(FPGA)、神经网络处理器(NPU)、张量处理器(TPU)、人工智能(AI)类型处理器等的处理装置)和用于存储数据的存储器。可选地,上述移动终端还可以包括用于通信功能的传输设备、输入输出设备以及显示设备。本领域普通技术人员可以理解,上述结构描述仅为示意,其并不对上述移动终端的结构造成限定。例如,移动终端还可包括比上述结构描述更多或者更少的组件,或者具有与上述结构描述不同的配置。
存储器可用于存储计算机程序,例如,应用软件的软件程序以及模块,如本公开实施例中的内存预测方法对应的计算机程序,处理器通过运行存储在存储器内的计算机程序,从而执行各种功能应用以及数据处理,即实现上述的内存预测方法。存储器可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器可进一步包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至移动终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
传输设备用于经由一个网络接收或者发送数据。上述的网络具体实例可包括移动终端的通信供应商提供的无线网络。在一个实例中,传输设备包括一个网络适配器(Network Interface Controller,简称为NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输设备可以为射频(Radio Frequency,简称为RF)模块,其用于通过无线方式与互联网进行通讯。该方法实施例的技术方案可以应用于各种通信***,例如:全球移动通讯(Global System of Mobile communication,简称为GSM)***、码分多址(Code Division Multiple Access,简称为CDMA)***、宽带码分多址(Wideband Code Division Multiple Access,简称为WCDMA)***、通用分组无线业务(General Packet Radio Service,简称为GPRS)、长期演进(Long Term Evolution,简称为LTE)***、LTE频分双工(Frequency Division Duplex,简称为FDD)***、LTE时分双工(Time Division Duplex,简称为TDD)、通用移动通信***(Universal MobileTelecommunication System,简称为UMTS)、全球互联微波接入(WorldwideInteroperability for Microwave Access,简称为WiMAX)通信***或5G***等。可选地,多个移动终端之间可以进行设备到设备(Device to Device,简称为D2D)通信。可选地,5G***或5G网络又被称为新无线(New Radio,简称为NR)***或NR网络。
显示设备可以例如触摸屏式的液晶显示器(LCD)和触摸显示器(也被称为“触摸屏”或“触摸显示屏”)。该液晶显示器可使得用户能够与移动终端的用户界面进行交互。在一些实施例中,上述移动终端具有图形用户界面(GUI),用户可以通过触摸触敏表面上的手指接触和/或手势来与GUI进行人机交互,此处的人机交互功能可选的包括如下交互:创建网页、绘图、文字处理、制作电子文档、游戏、视频会议、即时通信、收发电子邮件、通话界面、播放数字视频、播放数字音乐和/或网络浏览等、用于执行上述人机交互功能的可执行指令被配置/存储在一个或多个处理器可执行的计算机程序产品或可读非易失性存储介质中。
图2是根据本公开实施例的一种内存预测方法的流程图,如图2所示,该方法包括如下步骤:
步骤S102,获取源代码文件;
步骤S104,将上述源代码文件转换为目标数据结构,其中,上述目标数据结构中的各个叶子节点用于表征上述源代码文件中对应代码块的逻辑顺序和执行数据;
步骤S106,基于上述目标数据结构预测上述源代码文件对内存的使用情况,得到预测结果。
在本公开实施例中,通过获取源代码文件;将上述源代码文件转换为目标数据结构,其中,上述目标数据结构中的各个叶子节点用于表征上述源代码文件中对应代码块的逻辑顺序和执行数据;基于上述目标数据结构预测上述源代码文件对内存的使用情况,得到预测结果,达到了在内存申请释放架构的前期设计过程中,预测源代码文件对内存的使用情况的目的,从而实现了基于内存泄漏问题辅助改善内存申请释放架构设计的技术效果,进而解决了现有技术中的内存检测方案不适用于前期开发阶段的设计场景,难以基于内存泄漏问题辅助改善内存申请释放架构设计的技术问题。
在一种可选的实施例中,上述源代码文件对上述内存的使用情况包括:上述源代码文件中部分源代码对上述内存的申请和/或释放,上述目标数据结构为抽象语法树。
可选的,上述源代码文件即操作***的功能代码文件,通过采用静态语法分析方法,直接分析上述源代码文件将代码转换成抽象语法树,获取抽象语法树中涉及内存申请释放的相关节点,建立一种输入/输出模型,并将输入节点的执行参数对外暴露可调,输出为预测的内存占用大小,进而达到预测内存的目的,从而帮助开发人员在前期设计阶段发现可疑的内存泄漏问题用以帮助改善架构设计。
可选的,上述目标数据结构中的各个叶子节点用于表征上述源代码文件中对应代码块(例如,静态代码块)的逻辑顺序和执行数据。
在一种可选的实施例中,上述基于上述目标数据结构预测上述源代码文件对上述内存的使用情况,得到上述预测结果包括:
步骤S202,遍历上述目标数据结构得到上述各个叶子节点的根节点;
步骤S204,依据上述各个叶子节点和上述各个叶子节点的根节点生成倒挂链表;
步骤S206,基于上述倒挂链表预测上述源代码文件对上述内存的使用情况,得到上述内存预测结果。
如图3(a)所示,通过将源代码文件转换成抽象语法树,遍历该抽象语法树得到各叶子节点的父节点,并将各个叶子节点倒挂根节点生成倒挂链表,可以保证后续组装/查询节点时快速溯源。采用本申请方案,可以帮助开发人员验证、暴露隐患代码文件,从而帮助开发人员更加科学地站在局部地角度上理解软件整体。
在一种可选的实施例中,在基于上述倒挂链表预测上述源代码文件对上述内存的使用情况,得到上述内存预测结果之前,上述方法还包括:
步骤S302,获取筛选列表和选中列表,其中,上述筛选列表包括:内存申请筛选列表和内存释放筛选列表,上述选中列表包括:内存申请选中列表和内存释放选中列表;
步骤S304,采用上述内存申请列表筛选出所有叶子节点中的第一叶子节点,并将上述第一叶子节点存储至上述内存申请选中列表;以及
步骤S306,采用上述内存释放列表筛选出所有叶子节点中的第二叶子节点,并将上述第二叶子节点存储至上述内存释放选中列表。
在本申请实施例中,如图3(b)所示,预先准备两个筛选列表(即内存申请筛选列表,用于筛选与内存申请相关的第一叶子节点,即内存增长;内存释放筛选列表,用于筛选与内存释放相关的第一叶子节点,即内存下降;符合筛选要求的叶子节点,将被分别标记为第一叶子节点和第二叶子节点,需要说明的是,标记与内存的申请和/或释放相关的实现操作,可以称为染色。
仍如图3(b)所示,内存申请筛选列表仅包含出现内存增长的第一叶子节点,如malloc;内存释放筛选列表仅包含出现内存释放的第二叶子节点,如free。
在本申请实施例中,符合各自筛选列表的叶子节点会分别被保存到对应的选中列表中,即将上述第一叶子节点存储至上述内存申请选中列表(图3(b)黑色实线框表示被染色为内存增长的第一叶子节点集合),以及将上述第二叶子节点存储至上述内存释放选中列表(如图3(b)黑色虚线框表示被染色为内存释放的第二叶子节点集合)。
在一种可选的实施例中,上述基于上述倒挂链表预测上述源代码文件对上述内存的使用情况,得到上述内存预测结果包括:
步骤S402,依据上述选中列表中存储的叶子节点的类型对上述倒挂链表进行标记处理,得到标记后链表,其中,上述标记后链表包括:内存申请链表、内存释放链表和待定链表;
步骤S404,递归遍历所有的上述待定链表,以确定上述待定链表是否与上述内存申请链表和/或上述内存释放链表存在公共交集,得到遍历结果;
步骤S406,基于上述遍历结果预测上述源代码文件对上述内存的使用情况,得到上述内存预测结果。
在本申请实施例中,依据上述选中列表中存储的叶子节点的类型,即存储的是第一叶子节点还是第二叶子节点,对上述倒挂链表进行标记处理,得到标记后链表,其中,上述标记后链表包括:内存申请链表、内存释放链表和待定链表。
可选的,在本申请实施例中,上述标记处理用于标记上述倒挂链表是否与上述内存的增长和/或释放相关,上述内存申请链表与上述内存的增长呈正相关,上述内存释放链表与上述内存的减少呈正相关,上述待定链表与上述内存的增长/减少暂时呈非直接相关。
作为一种可选的实施例,通过遍历获得的如图3(a)的倒挂链表,根据上述实施例中图3(b)所示的选中列表对倒挂链表进行标记处理,可以分别得到如图4所示的三类标记后链表,即仅与内存的增长/释放相关的两类链表:内存申请链表、内存释放链表,以及暂时与上述两类链表均无关或者均相关的待定链表。
需要明确的是,由于上述待定链表中可能包含与内存申请链表、内存释放链表均相关的链表,因此后续还需要重新处理上述待定链表,例如,通过递归遍历所有的上述待定链表,以确定上述待定链表是否与上述内存申请链表和/或上述内存释放链表存在公共交集,得到遍历结果;再基于上述遍历结果预测上述源代码文件对上述内存的使用情况,得到上述内存预测结果。
在一种可选的实施例中,至少通过如下方式,确定上述待定链表是否与上述内存申请链表和/或上述内存释放链表存在公共交集,得到上述遍历结果:
步骤S502,若确定上述待定链表与上述内存申请链表存在公共交集,则确定将上述待定链表归入上述内存申请链表,以及若确定上述待定链表与上述内存释放链表存在公共交集,则确定将上述待定链表归入上述内存释放链表;
步骤S504,若确定上述待定链表与上述内存申请链表或上述内存释放链表均不存在公共交集,则确定上述待定链表为无关链表,其中,上述无关链表用于表征上述待定链表对应的上述源代码文件与上述内存的申请和/或释放无关;
步骤S506,若确定上述待定链表与上述内存申请链表和上述内存释放链表均存在公共交集,则确定上述待定链表为相关链表,其中,上述相关链表用于表征上述待定链表对应的上述源代码文件与上述内存的申请和释放均相关。
作为一种可选的实施例,如图5(a)所示,通过逐一扫描待定链表集合,如果其与内存增长链表和内存释放链表中的某一类存在交集节点,例如,图5(a)所示c->a仅与内存增长链表存在交集;x->d->a仅与内存释放链表存在交集;y->e->c仅与内存增长链表存在交集,如图5(b)的实线和虚线框内所示,则将其划入对应类型的链表集合中;如果与内存增长链表和内存释放链表中任一类型链表皆不存在公共交集,则将其划入如图5(b)中点划线框内所示的无关链表,表明该待定链表与内存增减无关;如果与内存增长链表和内存释放链表皆存在公集,则将其划入如图5(b)中双点划线框所示的相关链表,表明该待定链表既包含内存的增长也包含内存的释放。
在一种可选的实施例中,上述基于上述遍历结果预测上述源代码文件对上述内存的使用情况,得到上述内存预测结果包括:若上述遍历结果指示上述待定链表归入上述内存申请链表,则基于上述内存申请链表预测与上述待定链表对应的源代码文件对上述内存的申请;若上述遍历结果指示上述待定链表归入上述内存释放链表,则基于上述内存释放链表预测与上述待定链表对应的源代码文件对上述内存的释放;若上述遍历结果指示上述待定链表为上述无关链表,则无需预测与上述待定链表对应的源代码文件对上述内存的使用情况。
在一种可选的实施例中,上述基于上述遍历结果预测上述源代码文件对上述内存的使用情况,得到上述内存预测结果还包括:
步骤S602,若确定上述待定链表为相关链表,则基于上述相关链表的头节点生成与上述相关链表对应的新的目标数据结构;
步骤S604,遍历上述新的目标数据结构中的所有叶子节点,确定每个上述叶子节点与上述内存的使用情况的相关关系;
步骤S606,基于上述相关关系确定与上述相关链表对应的内存预测结果。
在一种可选的实施例中,上述确定每个上述叶子节点与上述内存的使用情况的相关关系包括:如果遍历到上述叶子节点包含于上述内存申请链表中,则确定上述叶子节点与上述内存的申请呈正相关;如果遍历到上述叶子节点包含于上述内存释放链表中,则确定上述叶子节点与上述内存的释放呈正相关。
作为另一种可选的实施例,如图5(b)所示,按照链表的长短对相关链表进行排序,逐个暴露其节点涉及语法树的叶子节点的输入,即可根据可接收输入的叶子节点预测实际内存的增减;在相关链表集合中,选择一个链表后扫描其头节点生成对应的新的抽象语法树,遍历新的目标数据结构中的所有叶子节点,对每个上述叶子节点进行染色,如果该叶子节点被包含在内存增长链表中,则表示该叶子节点与内存增长有关,如图6中节点6a所示,如果该节点被包含在内存释放链表中,则表示该叶子节点与内存释放有关,如图6中节点6b所示,基于上述相关关系确定与上述相关链表对应的内存预测结果。
在一种可选的实施例中,上述方法还包括:
步骤S702,如果确定上述新的目标数据结构中的叶子节点无法在代码中溯源,则确定上述新的目标数据结构中的目标叶子节点,其中,上述目标叶子节点为上述新的目标数据结构的输入叶子节点;
步骤S704,根据上述目标叶子节点和上述新的目标数据结构,计算与上述内存的申请呈正相关的多个叶子节点的第一调用次数,以及与上述内存的释放呈正相关的多个叶子节点的第二调用次数;
步骤S706,基于上述第一调用次数和上述第二调用次数确定上述内存预测结果。
作为另一种可选的实施例,如果该叶子节点无法在代码中溯源,则对外暴露接受输入,如图6中节点6c所示。
可选的,在本申请实施例中,抽象语法树等效于可执行序列,通过对抽象语法树中可以接受输入的地方进行输入,对增长/释放处进行标记的地方进行监控即可作为输出。那么直接将这个可执行序列接受输入模拟执行,即可完成对黑箱的预测,即在本申请实施例中,通过将抽象语法树表示成为一个黑箱,可以根据节点6c的输入和语法树结构中携带的其他数据与逻辑计算出节点6a与节点6b的调用次数,进而预测内存的增减。
在一种可选的实施例中,上述方法还包括:
步骤S802,如果确定上述相关关系为不相关,则获取多个上述相关链表中的每个相关链表的输入信号;
步骤S804,对多个不同的上述输入信号进行排列组合,得到排列组合结果;
步骤S806,基于上述排列组合结果模拟得到内存申请与释放曲线;
步骤S808,依据上述内存申请与释放曲线定位上述源代码文件中与上述内存的使用情况相应的代码位置。
在本申请实施例中,如图7所示,上述抽象语法树等效于可执行序列,对抽象语法树中可以接受输入的地方进行输入信息,对增长/释放处进行标记的地方进行监控即可作为输出信息,则可以直接将这个可执行序列接受输入模拟执行,即可完成对黑箱的预测,得到排列组合结果。
在本申请实施例中,如果确定上述相关关系为不相关,则获取多个上述相关链表中的每个相关链表的输入信号,对多个不同的上述输入信号进行排列组合,得到排列组合结果,可以模拟得到内存申请与释放曲线,在内存申请与释放曲线中展示内存的申请和释放,进而根据该内存申请与释放曲线可以提前发现影响较大的相关引脚,并直接定位到具体的代码位置。
作为一种可选的实施例,如图5(b)所示的相关链表中的每一条链表对应一个黑箱,所有黑箱的组合,即可构成整个预测***,建立基本的输入信号后,即可根据不同信号的排列组合即可预测得到整体***的内存增减变化规律。
采用本申请方案,即可简单通过静态语法分析的办法预测(无法完全替代软件真实的运行情况)得到内存增减模型,当自动给予输入信号后,能够模拟出整个***的内存增减,对于软件架构涉及变更具有良好的辅助或指导作用,从源头上降低内存泄漏的风险,可以实现大幅降低了早期设计考虑不全面而造成后期调试排查难、迭代难的风险。
根据本公开实施例,还提供了一种用于实施上述内存预测方法的装置实施例,图8是根据本公开实施例的一种内存预测装置的结构示意图,如图8所示,上述内存预测装置,包括:获取模块80、转换模块82和预测模块84,其中:
获取模块80,用于获取源代码文件;转换模块82,用于将上述源代码文件转换为目标数据结构,其中,上述目标数据结构中的各个叶子节点用于表征上述源代码文件中对应代码块的逻辑顺序和执行数据;预测模块84,用于基于上述目标数据结构预测上述源代码文件对内存的使用情况,得到预测结果。
需要说明的是,上述各个模块是可以通过软件或硬件来实现的,例如,对于后者,可以通过以下方式实现:上述各个模块可以位于同一处理器中;或者,上述各个模块以任意组合的方式位于不同的处理器中。
此处需要说明的是,上述获取模块80、转换模块82和预测模块84对应于方法实施例中的步骤S102至步骤S106,上述模块与对应的步骤所实现的实例和应用场景相同,但不限于上述方法实施例所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在计算机终端中。
需要说明的是,本实施例的可选或优选实施方式可以参见方法实施例中的相关描述,此处不再赘述。
上述的内存预测装置还可以包括处理器和存储器,上述获取模块80、转换模块82和预测模块84等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。
处理器中包含内核,由内核去存储器中调取相应的程序单元,上述内核可以设置一个或以上。存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM),存储器包括至少一个存储芯片。
根据本申请实施例,还提供了一种非易失性存储介质实施例。可选地,在本实施例中,上述非易失性存储介质包括存储的程序,其中,在上述程序运行时控制上述非易失性存储介质所在设备执行上述任意一种内存预测方法。
可选地,在本实施例中,上述非易失性存储介质可以位于计算机网络中计算机终端群中的任意一个计算机终端中,或者位于移动终端群中的任意一个移动终端中,上述非易失性存储介质包括存储的程序。
可选地,在程序运行时控制非易失性存储介质所在设备执行以下功能:根据本公开实施例的一个方面,提供了一种内存预测方法,包括:获取源代码文件;将上述源代码文件转换为目标数据结构,其中,上述目标数据结构中的各个叶子节点用于表征上述源代码文件中对应代码块的逻辑顺序和执行数据;基于上述目标数据结构预测上述源代码文件对内存的使用情况,得到预测结果。
可选地,在程序运行时控制非易失性存储介质所在设备执行以下功能:上述源代码文件中部分源代码对上述内存的申请和/或释放,上述目标数据结构为抽象语法树。
可选地,在程序运行时控制非易失性存储介质所在设备执行以下功能:遍历上述目标数据结构得到上述各个叶子节点的根节点;依据上述各个叶子节点和上述各个叶子节点的根节点生成倒挂链表;基于上述倒挂链表预测上述源代码文件对上述内存的使用情况,得到上述内存预测结果。
可选地,在程序运行时控制非易失性存储介质所在设备执行以下功能:获取筛选列表和选中列表,其中,上述筛选列表包括:内存申请筛选列表和内存释放筛选列表,上述选中列表包括:内存申请选中列表和内存释放选中列表;采用上述内存申请列表筛选出所有叶子节点中的第一叶子节点,并将上述第一叶子节点存储至上述内存申请选中列表;以及采用上述内存释放列表筛选出所有叶子节点中的第二叶子节点,并将上述第二叶子节点存储至上述内存释放选中列表。
可选地,在程序运行时控制非易失性存储介质所在设备执行以下功能:依据上述选中列表中存储的叶子节点的类型对上述倒挂链表进行标记处理,得到标记后链表,其中,上述标记后链表包括:内存申请链表、内存释放链表和待定链表;递归遍历所有的上述待定链表,以确定上述待定链表是否与上述内存申请链表和/或上述内存释放链表存在公共交集,得到遍历结果;基于上述遍历结果预测上述源代码文件对上述内存的使用情况,得到上述内存预测结果。
可选地,在程序运行时控制非易失性存储介质所在设备执行以下功能:若确定上述待定链表与上述内存申请链表存在公共交集,则确定将上述待定链表归入上述内存申请链表,以及若确定上述待定链表与上述内存释放链表存在公共交集,则确定将上述待定链表归入上述内存释放链表;若确定上述待定链表与上述内存申请链表或上述内存释放链表均不存在公共交集,则确定上述待定链表为无关链表,其中,上述无关链表用于表征上述待定链表对应的上述源代码文件与上述内存的申请和/或释放无关;若确定上述待定链表与上述内存申请链表和上述内存释放链表均存在公共交集,则确定上述待定链表为相关链表,其中,上述相关链表用于表征上述待定链表对应的上述源代码文件与上述内存的申请和释放均相关。
可选地,在程序运行时控制非易失性存储介质所在设备执行以下功能:若上述遍历结果指示上述待定链表归入上述内存申请链表,则基于上述内存申请链表预测与上述待定链表对应的源代码文件对上述内存的申请;若上述遍历结果指示上述待定链表归入上述内存释放链表,则基于上述内存释放链表预测与上述待定链表对应的源代码文件对上述内存的释放;若上述遍历结果指示上述待定链表为上述无关链表,则无需预测与上述待定链表对应的源代码文件对上述内存的使用情况。
可选地,在程序运行时控制非易失性存储介质所在设备执行以下功能:若确定上述待定链表为相关链表,则基于上述相关链表的头节点生成与上述相关链表对应的新的目标数据结构;遍历上述新的目标数据结构中的所有叶子节点,确定每个上述叶子节点与上述内存的使用情况的相关关系;基于上述相关关系确定与上述相关链表对应的内存预测结果。
可选地,在程序运行时控制非易失性存储介质所在设备执行以下功能:如果遍历到上述叶子节点包含于上述内存申请链表中,则确定上述叶子节点与上述内存的申请呈正相关;如果遍历到上述叶子节点包含于上述内存释放链表中,则确定上述叶子节点与上述内存的释放呈正相关。
可选地,在程序运行时控制非易失性存储介质所在设备执行以下功能:如果确定上述新的目标数据结构中的叶子节点无法在代码中溯源,则确定上述新的目标数据结构中的目标叶子节点,其中,上述目标叶子节点为上述新的目标数据结构的输入叶子节点;根据上述目标叶子节点和上述新的目标数据结构,计算与上述内存的申请呈正相关的多个叶子节点的第一调用次数,以及与上述内存的释放呈正相关的多个叶子节点的第二调用次数;基于上述第一调用次数和上述第二调用次数确定上述内存预测结果。
可选地,在程序运行时控制非易失性存储介质所在设备执行以下功能:如果确定上述相关关系为不相关,则获取多个上述相关链表中的每个相关链表的输入信号;对多个不同的上述输入信号进行排列组合,得到排列组合结果;基于上述排列组合结果模拟得到内存申请与释放曲线;依据上述内存申请与释放曲线定位上述源代码文件中与上述内存的使用情况相应的代码位置。
根据本申请实施例,还提供了一种处理器实施例。可选地,在本实施例中,上述处理器用于运行程序,其中,上述程序运行时执行上述任意一种内存预测方法。
本申请实施例提供了一种电子设备,包括存储器和处理器,上述存储器中存储有计算机程序,上述处理器被设置为运行上述计算机程序以执行任意一项上述的内存预测方法。
本申请还提供了一种计算机程序产品,当在数据处理设备上执行时,适于执行初始化有任意一种上述的内存预测方法步骤的程序。
上述本公开实施例序号仅仅为了描述,不代表实施例的优劣。
在本公开的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取非易失性存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个非易失性存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的非易失性存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅是本公开的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本公开原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本公开的保护范围。

Claims (12)

1.一种内存预测方法,其特征在于,包括:
获取源代码文件;
将所述源代码文件转换为目标数据结构,其中,所述目标数据结构中的各个叶子节点用于表征所述源代码文件中对应代码块的逻辑顺序和执行数据;
基于所述目标数据结构预测所述源代码文件对内存的使用情况,得到内存预测结果;
其中,基于所述目标数据结构预测所述源代码文件对内存的使用情况,得到预测结果,包括:遍历所述目标数据结构得到的各个叶子节点的根节点;根据所述各个叶子节点和所述各个叶子节点的根节点生成倒挂链表;基于所述倒挂链表预测所述源代码文件对所述内存的使用情况,得到所述内存预测结果;
基于所述倒挂链表预测所述源代码文件对所述内存的使用情况,得到所述内存预测结果,包括:依据选中列表中存储的叶子节点的类型对所述倒挂链表进行标记处理,得到标记后链表,其中,所述标记后链表包括:内存申请链表、内存释放链表和待定链表;递归遍历所有的所述待定链表,以确定所述待定链表是否与所述内存申请链表和/或所述内存释放链表存在公共交集,得到遍历结果;基于所述遍历结果预测所述源代码文件对所述内存的使用情况,得到所述内存预测结果。
2.根据权利要求1所述的方法,其特征在于,所述源代码文件对所述内存的使用情况包括:所述源代码文件中部分源代码对所述内存的申请和/或释放,所述目标数据结构为抽象语法树。
3.根据权利要求1所述的方法,其特征在于,在基于所述倒挂链表预测所述源代码文件对所述内存的使用情况,得到所述内存预测结果之前,所述方法还包括:
获取筛选列表和所述选中列表,其中,所述筛选列表包括:内存申请筛选列表和内存释放筛选列表,所述选中列表包括:内存申请选中列表和内存释放选中列表;
采用所述内存申请列表筛选出所有叶子节点中的第一叶子节点,并将所述第一叶子节点存储至所述内存申请选中列表;以及
采用所述内存释放列表筛选出所有叶子节点中的第二叶子节点,并将所述第二叶子节点存储至所述内存释放选中列表。
4.根据权利要求1所述的方法,其特征在于,至少通过如下方式,确定所述待定链表是否与所述内存申请链表和/或所述内存释放链表存在公共交集,得到所述遍历结果:
若确定所述待定链表与所述内存申请链表存在公共交集,则确定将所述待定链表归入所述内存申请链表,以及若确定所述待定链表与所述内存释放链表存在公共交集,则确定将所述待定链表归入所述内存释放链表;
若确定所述待定链表与所述内存申请链表或所述内存释放链表均不存在公共交集,则确定所述待定链表为无关链表,其中,所述无关链表用于表征所述待定链表对应的所述源代码文件与所述内存的申请和/或释放无关;
若确定所述待定链表与所述内存申请链表和所述内存释放链表均存在公共交集,则确定所述待定链表为相关链表,其中,所述相关链表用于表征所述待定链表对应的所述源代码文件与所述内存的申请和释放均相关。
5.根据权利要求4所述的方法,其特征在于,所述基于所述遍历结果预测所述源代码文件对所述内存的使用情况,得到所述内存预测结果包括:
若所述遍历结果指示所述待定链表归入所述内存申请链表,则基于所述内存申请链表预测与所述待定链表对应的源代码文件对所述内存的申请;
若所述遍历结果指示所述待定链表归入所述内存释放链表,则基于所述内存释放链表预测与所述待定链表对应的源代码文件对所述内存的释放;
若所述遍历结果指示所述待定链表为所述无关链表,则无需预测与所述待定链表对应的源代码文件对所述内存的使用情况。
6.根据权利要求4所述的方法,其特征在于,所述基于所述遍历结果预测所述源代码文件对所述内存的使用情况,得到所述内存预测结果还包括:
若确定所述待定链表为相关链表,则基于所述相关链表的头节点生成与所述相关链表对应的新的目标数据结构;
遍历所述新的目标数据结构中的所有叶子节点,确定每个所述叶子节点与所述内存的使用情况的相关关系;
基于所述相关关系确定与所述相关链表对应的内存预测结果。
7.根据权利要求6所述的方法,其特征在于,所述确定每个所述叶子节点与所述内存的使用情况的相关关系包括:
如果遍历到所述叶子节点包含于所述内存申请链表中,则确定所述叶子节点与所述内存的申请呈正相关;
如果遍历到所述叶子节点包含于所述内存释放链表中,则确定所述叶子节点与所述内存的释放呈正相关。
8.根据权利要求6所述的方法,其特征在于,所述方法还包括:
如果确定所述新的目标数据结构中的叶子节点无法在代码中溯源,则确定所述新的目标数据结构中的目标叶子节点,其中,所述目标叶子节点为所述新的目标数据结构的输入叶子节点;
根据所述目标叶子节点和所述新的目标数据结构,计算与所述内存的申请呈正相关的多个叶子节点的第一调用次数,以及与所述内存的释放呈正相关的多个叶子节点的第二调用次数;
基于所述第一调用次数和所述第二调用次数确定所述内存预测结果。
9.根据权利要求6所述的方法,其特征在于,所述方法还包括:
如果确定所述相关关系为不相关,则获取多个所述相关链表中的每个相关链表的输入信号;
对多个不同的所述输入信号进行排列组合,得到排列组合结果;
基于所述排列组合结果模拟得到内存申请与释放曲线;
依据所述内存申请与释放曲线定位所述源代码文件中与所述内存的使用情况相应的代码位置。
10.一种内存预测装置,其特征在于,包括:
获取模块,用于获取源代码文件;
转换模块,用于将所述源代码文件转换为目标数据结构,其中,所述目标数据结构中的各个叶子节点用于表征所述源代码文件中对应代码块的逻辑顺序和执行数据;
预测模块,用于基于所述目标数据结构预测所述源代码文件对内存的使用情况,得到预测结果;
其中,所述预测模块用于通过如下步骤来基于所述目标数据结构预测所述源代码文件对内存的使用情况,得到预测结果:遍历所述目标数据结构得到的各个叶子节点的根节点;根据所述各个叶子节点和所述各个叶子节点的根节点生成倒挂链表;基于所述倒挂链表预测所述源代码文件对所述内存的使用情况,得到所述内存预测结果;
所述装置还用于通过如下步骤来基于所述倒挂链表预测所述源代码文件对所述内存的使用情况,得到所述内存预测结果:依据选中列表中存储的叶子节点的类型对所述倒挂链表进行标记处理,得到标记后链表,其中,所述标记后链表包括:内存申请链表、内存释放链表和待定链表;递归遍历所有的所述待定链表,以确定所述待定链表是否与所述内存申请链表和/或所述内存释放链表存在公共交集,得到遍历结果;基于所述遍历结果预测所述源代码文件对所述内存的使用情况,得到所述内存预测结果。
11.一种非易失性存储介质,其特征在于,所述非易失性存储介质包括存储的程序,其中,在所述程序运行时控制所述非易失性存储介质所在设备执行权利要求1至9中任意一项所述的内存预测方法。
12.一种电子设备,包括存储器和处理器,其特征在于,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行权利要求1至9中任意一项所述的内存预测方法。
CN202110511788.2A 2021-05-11 2021-05-11 内存预测方法及装置、存储介质、电子设备 Active CN113268243B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110511788.2A CN113268243B (zh) 2021-05-11 2021-05-11 内存预测方法及装置、存储介质、电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110511788.2A CN113268243B (zh) 2021-05-11 2021-05-11 内存预测方法及装置、存储介质、电子设备

Publications (2)

Publication Number Publication Date
CN113268243A CN113268243A (zh) 2021-08-17
CN113268243B true CN113268243B (zh) 2024-02-23

Family

ID=77230396

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110511788.2A Active CN113268243B (zh) 2021-05-11 2021-05-11 内存预测方法及装置、存储介质、电子设备

Country Status (1)

Country Link
CN (1) CN113268243B (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113778440B (zh) * 2021-08-18 2024-01-26 上海瑞家信息技术有限公司 一种数据处理方法、装置、电子设备及存储介质
CN115904859A (zh) * 2021-09-30 2023-04-04 中兴通讯股份有限公司 内存占用量预估方法、装置及存储介质
CN116450361B (zh) * 2023-05-23 2023-09-29 南京芯驰半导体科技有限公司 一种内存预测方法、装置及存储介质

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108153666A (zh) * 2016-12-06 2018-06-12 北京奇虎科技有限公司 一种静态检测安卓代码中的资源回收漏洞的方法和装置
CN109117633A (zh) * 2018-08-13 2019-01-01 百度在线网络技术(北京)有限公司 静态源码扫描方法、装置、计算机设备及存储介质
CN109783361A (zh) * 2018-12-14 2019-05-21 平安壹钱包电子商务有限公司 确定代码质量的方法和装置
CN110187967A (zh) * 2019-05-15 2019-08-30 南瑞集团有限公司 一种适用于依赖分析工具的内存预测方法及装置
CN110472411A (zh) * 2019-08-20 2019-11-19 杭州和利时自动化有限公司 一种内存溢出处理方法、装置、设备及可读存储介质
CN111966491A (zh) * 2020-08-04 2020-11-20 Oppo广东移动通信有限公司 统计占用内存的方法及终端设备
CN112667240A (zh) * 2020-12-23 2021-04-16 平安普惠企业管理有限公司 程序代码转换方法及相关设备

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9003240B2 (en) * 2012-08-28 2015-04-07 Nec Laboratories America, Inc. Blackbox memory monitoring with a calling context memory map and semantic extraction
US9176729B2 (en) * 2013-10-04 2015-11-03 Avaya Inc. System and method for prioritizing and remediating defect risk in source code
EP3155522B1 (en) * 2014-06-13 2020-10-21 Pivotal Software, Inc. Precisely tracking memory usage in multi-process computing environment
CN109710396B (zh) * 2017-10-26 2023-08-22 华为技术有限公司 一种信息采集及内存释放的方法及装置
US10783055B2 (en) * 2018-01-08 2020-09-22 Ozcode Ltd. Time travel source code debugger incorporating live coding ability

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108153666A (zh) * 2016-12-06 2018-06-12 北京奇虎科技有限公司 一种静态检测安卓代码中的资源回收漏洞的方法和装置
CN109117633A (zh) * 2018-08-13 2019-01-01 百度在线网络技术(北京)有限公司 静态源码扫描方法、装置、计算机设备及存储介质
CN109783361A (zh) * 2018-12-14 2019-05-21 平安壹钱包电子商务有限公司 确定代码质量的方法和装置
CN110187967A (zh) * 2019-05-15 2019-08-30 南瑞集团有限公司 一种适用于依赖分析工具的内存预测方法及装置
CN110472411A (zh) * 2019-08-20 2019-11-19 杭州和利时自动化有限公司 一种内存溢出处理方法、装置、设备及可读存储介质
CN111966491A (zh) * 2020-08-04 2020-11-20 Oppo广东移动通信有限公司 统计占用内存的方法及终端设备
CN112667240A (zh) * 2020-12-23 2021-04-16 平安普惠企业管理有限公司 程序代码转换方法及相关设备

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
基于源代码的内存泄漏静态分析方法;甘红星;金大海;宫云战;;内蒙古大学学报(自然科学版)(第05期);全文 *

Also Published As

Publication number Publication date
CN113268243A (zh) 2021-08-17

Similar Documents

Publication Publication Date Title
CN113268243B (zh) 内存预测方法及装置、存储介质、电子设备
CN109828903B (zh) 自动化测试方法、装置、计算机装置及存储介质
CN107133174A (zh) 测试用例代码自动生成装置与方法
CN106648556A (zh) 前后端集成开发测试的方法及装置
CN109344062A (zh) 页面跨域跳转测试的方法及终端设备
US10387124B2 (en) System and method for creating domain specific language
CN113590454A (zh) 测试方法、装置、计算机设备和存储介质
Lettner et al. Automated analysis of two-layered feature models with feature attributes
CN112527676A (zh) 模型自动化测试方法、装置及存储介质
CN106528429A (zh) 一种ui界面测试方法及装置
CN110598419A (zh) 一种区块链客户端漏洞挖掘方法、装置、设备及存储介质
WO2017095362A1 (en) Generating application flow entities
CN104991857B (zh) 跟踪调试方法及装置
FI20195472A1 (en) Method and system for integration testing
Romero et al. Integration of DevOps practices on a noise monitor system with CircleCI and Terraform
CN106776285A (zh) 网页前端调试方法及装置
WO2023273621A1 (zh) 脚本生成方法、装置、设备及介质
US8615744B2 (en) Methods and system for managing assets in programming code translation
CN108563578A (zh) Sdk兼容性检测方法、装置、设备及可读存储介质
CN115292178A (zh) 测试数据搜索方法、装置、存储介质以及终端
CN111210279B (zh) 一种目标用户预测方法、装置和电子设备
CN114357057A (zh) 日志分析方法、装置、电子设备及计算机可读存储介质
CN111124378B (zh) 代码生成方法和装置
CN109726550A (zh) 异常操作行为检测方法、装置及计算机可读存储介质
CN114385155A (zh) vue项目可视化工具生成方法、装置、设备及存储介质

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