CN114490366A - Flutter内存泄漏的检测方法及装置 - Google Patents

Flutter内存泄漏的检测方法及装置 Download PDF

Info

Publication number
CN114490366A
CN114490366A CN202210051926.8A CN202210051926A CN114490366A CN 114490366 A CN114490366 A CN 114490366A CN 202210051926 A CN202210051926 A CN 202210051926A CN 114490366 A CN114490366 A CN 114490366A
Authority
CN
China
Prior art keywords
page
detected
thread
flutter
memory
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.)
Pending
Application number
CN202210051926.8A
Other languages
English (en)
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.)
Guangzhou Xinyu Network Technology Co ltd
Original Assignee
Guangzhou Xinyu Network Technology 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 Guangzhou Xinyu Network Technology Co ltd filed Critical Guangzhou Xinyu Network Technology Co ltd
Priority to CN202210051926.8A priority Critical patent/CN114490366A/zh
Publication of CN114490366A publication Critical patent/CN114490366A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Storage Device Security (AREA)

Abstract

本申请公开了一种Flutter内存泄漏的检测方法及装置,通过获取待检测页面的实例对象,以得到dart语言中的Expando类,再遍历所述实例对象中的第一目标字段,得到与待检测页面对应的data数组,以及通过遍历所述data数组中的第二目标字段是否为预设值,若所述第二目标字段不为预设值,则判定所述待检测页面存在内存泄漏,以利用Expando类包含data数组,而data数组中包含待检测页面的第二目标字段的特点,将待检测页面作为第二目标字段的值进行检测,从而实现对检测页面是否存在内存泄漏的检测,进而实现正确检测内存泄漏场景。

Description

Flutter内存泄漏的检测方法及装置
技术领域
本申请涉及信息安全技术领域,尤其涉及一种Flutter内存泄漏的检测方法及装置。
背景技术
Flutter是Google开源的用于构建用户界面(UI)的工具包,其基于dart语言开发,dart语言通过dart VM(Virtual Machine,虚拟机)的GC模块实现垃圾回收。
在一些场景下,对于本该被回收的对象,由于其被其他对象引用,GC模块无法将该对象检测为待回收对象,导致无法对该对象进行回收,从而导致该对象所占用的内存无法被重新分配,使得应用的可使用内存减少,即内存泄漏。若内存泄漏场景持续存在,则应用的可用内存会持续降低,而可用内存降低,又会引发dart VM频繁调用GC模块,从而导致应用卡顿甚至应用奔溃。
发明内容
本申请提供了一种Flutter内存泄漏的检测方法及装置,以解决Flutter内存泄漏场景无法被正确检测的技术问题。
为了解决上述技术问题,第一方面,本申请实施例提供了一种,Flutter内存泄漏的检测方法,包括:
获取待检测页面的实例对象;
遍历实例对象中的第一目标字段,得到与待检测页面对应的data数组;
遍历data数组中的第二目标字段是否为预设值;
若第二目标字段不为预设值,则判定待检测页面存在内存泄漏。
本实施例通过获取待检测页面的实例对象,以得到dart语言中的Expando类,再遍历实例对象中的第一目标字段,得到与待检测页面对应的data数组,以及通过遍历data数组中的第二目标字段是否为预设值,若第二目标字段不为预设值,则判定待检测页面存在内存泄漏,以利用Expando类包含data数组,而data数组中包含待检测页面的第二目标字段的特点,将待检测页面作为第二目标字段的值进行检测,从而实现对检测页面是否存在内存泄漏的检测,进而实现正确检测内存泄漏场景。
在一实施例中,获取待检测页面的实例对象,包括:
基于虚拟机服务器VmService,确定待检测页面的虚拟机VM对象;
确定VM对象的第一对象ID以及VM对象所在目标线程的线程ID;
根据线程ID和第一对象ID,获取待检测页面的实例对象。
本实施例通过VmService实现dart语言中实例对象的获取,为后续检测过程提供依据。
在一实施例中,确定VM对象的第一对象ID以及VM对象所在目标线程的线程ID,包括:
遍历VmService中的所有线程,匹配得到与VM对象对应的目标线程的线程ID;
基于预设的invoke顶层函数,获取VM对象的第一对象ID。
在一实施例中,根据线程ID和第一对象ID,获取待检测页面的实例对象,包括:
调用VmService的实例对象获取函数;
将线程ID和第一对象ID作为实例对象获取函数的输入参数,返回待检测页面的实例对象。
在一实施例中,若第二目标字段不为预设值,则判定待检测页面存在内存泄漏之后,还包括:
获取待检测页面的引用路径节点,引用路径节点为引用待检测页面的路径节点;
分析引用路径节点的节点信息,并对节点信息进行展示。
本实施例通过获取并分析引用路径节点,实现对产生内存泄漏问题代码的精确定位,以便于后续对内存泄漏进行处理。
在一实施例中,获取待检测页面的引用路径节点,包括:
获取VM对象所在目标线程的线程ID,VM对象为待检测页面对应在VmService中的VM对象;
确定VM对象的第二对象ID;
将线程ID和第二对象ID作为预设的引用路径获取函数的输入参数,返回待检测页面的引用路径节点。
在一实施例中,分析引用路径节点的节点信息,并对节点信息进行展示,包括:
确定引用路径节点的属性类型;
根据属性类型,分析引用路径节点的节点信息;
对节点信息进行展示。
第二方面,本申请实施例提供一种Flutter内存泄漏的检测装置,包括:
获取模块,用于获取待检测页面的实例对象;
第一遍历模块,用于遍历实例对象中的第一目标字段,得到与待检测页面对应的data数组;
第二遍历模块,用于遍历data数组中的第二目标字段是否为预设值;
判定模块,用于若第二目标字段不为预设值,则判定待检测页面存在内存泄漏。
第三方面,本申请实施例提供一种计算机设备,包括处理器和存储器,存储器用于存储计算机程序,计算机程序被处理器执行时实现如第一方面的Flutter内存泄漏的检测方法的步骤。
第四方面,本申请实施例提供一种计算机可读存储介质,其存储有计算机程序,计算机程序被处理器执行时实现如第一方面的Flutter内存泄漏的检测方法的步骤。
需要说明的是,上述第二方面至第四方面的有益效果请参见上述第一方面的相关描述,在此不再赘述。
附图说明
图1为本申请实施例提供的Flutter内存泄漏的检测方法的流程示意图;
图2为本申请实施例提供的Flutter内存泄漏的检测装置的结构示意图;
图3为本申请实施例提供的计算机设备的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
如相关技术记载,在一些场景下,对于本该被回收的对象,由于其被其他对象引用,GC模块无法将该对象检测为待回收对象,导致无法对该对象进行回收,从而导致该对象所占用的内存无法被重新分配,使得应用的可使用内存减少,即内存泄漏。若内存泄漏场景持续存在,则应用的可用内存会持续降低,而可用内存降低,又会引发dart VM频繁调用GC模块,从而导致应用卡顿甚至应用奔溃。
为此,本申请实施例提供一种Flutter内存泄漏的检测方法及装置,通过获取待检测页面的实例对象,以得到dart语言中的Expando类,再遍历所述实例对象中的第一目标字段,得到与待检测页面对应的data数组,以及通过遍历所述data数组中的第二目标字段是否为预设值,若所述第二目标字段不为预设值,则判定所述待检测页面存在内存泄漏,以利用Expando类包含data数组,而data数组中包含待检测页面的第二目标字段的特点,将待检测页面作为第二目标字段的值进行检测,从而实现对检测页面是否存在内存泄漏的检测,进而实现正确检测内存泄漏场景。
请参照图1,图1为本申请实施例提供的一种Flutter内存泄漏的检测方法的流程示意图。本申请实施例的Flutter内存泄漏的检测方法可应用于计算机设备,该计算机设备包括但不限于智能手机、笔记本电脑、平板电脑、桌上型计算机、物理服务器和云服务器等设备。如图1所示,本实施例的Flutter内存泄漏的检测方法包括步骤S101至步骤S104,详述如下:
步骤S101,获取待检测页面的实例对象。
在本步骤中,待检测页面为被引用的页面,例如,A页面通过push方式到B页面,再通过pop方式返回到A页面,则此时B页面为待检测页面。实例对象可以为待检测页面在虚拟机服务器VmService中的实例,例如instance实例。可选地,通过连接VmService以获取待检测页面的实例对象。
需要说明的是,相比于java语言通过弱引用WeakReference的方式进行内存泄漏的检测,dart语言没有WeakReference,所以无法采用java语言的方式实现dart语言的内存泄漏检测。而本实施例通过获取实例对象,得到dart语言的实例对象中的Expando类,该Expando类内部持有一个data数组,该data数组的item类型为WeakProperty,WeakProperty以弱引用的方式持有key,本实施例将待检测页面对象作为该key,从而实现dart语言的内存泄漏检测。
步骤S102,遍历所述实例对象中的第一目标字段,得到与待检测页面对应的data数组。
在本步骤中,第一目标字段为具有待检测页面特征的字段,例如dart语言中的fields字段。可选地,通过遍历实例对象的Expando类中的fields字段,以匹配到与待检测页面对应的data数组。
步骤S103,遍历所述data数组中的第二目标字段是否为预设值。
在本步骤中,第二目标字段为item字段,应理解,data数组中可以包含多个item字段。一般而言,item字段包含key和value,当待检测页面被引用时,则item字段中的key应当为相应的引用对象,当待检测页面没有被引用时,则item字段应当为预设值,如null值,所以遍历data数组中的每个item字段,判断item字段是否为预设值,以确定待检测页面是否被引用,即确定是否存在内存泄漏。
步骤S104,若所述第二目标字段不为预设值,则判定所述待检测页面存在内存泄漏。
在本步骤中,若item字段不为null值,则item字段的key为相应的引用对象,即待检测页面为引用对象引用,所以判定待检测页面存在内存泄漏,实现了dart语言的内存泄漏检测。
在一实施例中,在图1所示实施例的基础上,上述步骤S101,包括:
基于虚拟机服务器VmService,确定所述待检测页面的虚拟机VM对象;
确定所述VM对象的第一对象ID以及所述VM对象所在目标线程的线程ID;
根据所述线程ID和所述第一对象ID,获取所述待检测页面的实例对象。
在本实施例中,VmService是虚拟机内部的一套Web服务,其传输协议为JSON-RPC2.0,而flutter本身封装有一个软件开发工具包(SoftwareDevelopment Kit,SDK),所以使flutter可以利用VmServic实现获取实例对象。
可选地,通过socket方式连接到VmService,利用VmService扩展服务实时获取运行在dart VM中的VM对象,并通过VmService的方法函数确定与待检测页面对应的VM对象的第一对象ID和该VM对象所在目标线程的线程ID,以及利用第一对象ID和线程ID,获取待检测页面的实例对象。
可选地,所述确定所述VM对象的第一对象ID以及所述VM对象所在目标线程的线程ID,包括:遍历所述VmService中的所有线程,匹配得到与所述VM对象对应的目标线程的线程ID;基于预设的invoke顶层函数,获取所述VM对象的第一对象ID。
在本可选实施例中,对于线程ID,遍历VmService中的所有isolates(即线程),以匹配到与VM对象对应的目标线程main isolate,再利用findMainIsolate()方法函数获取到mainisolate在VmService中的引用ID,即isolateId。
对于第一对象ID,通过VmService中的invoke顶层函数获取。示例性地,通过vms.invoke顶层函数:generateKey获取keyRef,该keyRef包含keyId和valueAsString;再通过saveMap方法将VM对象object存到Map中,即saveMap(keyValue,object),其中keyValue为valueAsString;最后通过invoke顶层函数的keyToId方法获取到objRef,即利用keyToId(keyId)返回objRef,该objRef包含第一对象ID,即objectId。
可选地,所述根据所述线程ID和所述第一对象ID,获取所述待检测页面的实例对象,包括:调用所述VmService的实例对象获取函数;将所述线程ID和所述第一对象ID作为所述实例对象获取函数的输入参数,返回所述待检测页面的实例对象。
在本可选实施例中,将线程ID和第一对象ID作为实例对象获取函数的输入参数,则实例对象获取函数为vms.getObjct(isolateId,objectId),返回instance对象。
在相关技术记载中,通过对当前渲染页面所使用的节点个数与当前内存中存在的渲染节点的个数进行比对,当内存中的节点数大于当前渲染页面的节点数时,判定存在内存泄漏。但是,对于复杂的页面而言,最终生成的节点个数非常庞大,导致产生泄漏的源码位置难以精确定位。
为此,本申请实施例通过Expando间接实现弱引用的方式,结合VmService扩展服务实时获取运行中dart VM虚拟机中的泄漏对象,进而获取到引用链信息,以实现精确定位产生内存泄漏的问题代码。
在一实施例中,在图1所示实施例的基础上,上述步骤S104之后,还包括:
获取所述待检测页面的引用路径节点,所述引用路径节点为引用所述待检测页面的路径节点;
分析所述引用路径节点的节点信息,并对所述节点信息进行展示。
在本实施例中,通过预设接口调用预设的引用路径获取函数获取引用路径节点。可选地,所述获取所述待检测页面的引用路径节点,包括:获取VM对象所在目标线程的线程ID,所述VM对象为所述待检测页面对应在VmService中的VM对象;确定所述VM对象的第二对象ID;将所述线程ID和第二对象ID作为预设的引用路径获取函数的输入参数,返回所述待检测页面的引用路径节点。
示例性地,将线程ID和第二对象ID作为预设的引用路径获取函数的输入参数,则引用路径获取函数为vms.getRetainingPath(mainIsolateId,objId,limit),其中mainIsolateId为线程ID,objId为第二对象ID,limit为引用路径节点的节点信息。
需要说明的是,由于VmService中的ID最大值是8192,所以对象ID可能会存在失效的问题。因此,在检测到内存泄漏后,可以无需保存第一对象ID,而在获取引用路径节点时,再通过expando类获取一次对象ID,该次得到的对象ID即为第二对象ID,以避免ID失效。
可选地,所述分析所述引用路径节点的节点信息,并对所述节点信息进行展示,包括:确定所述引用路径节点的属性类型;根据所述属性类型,分析所述引用路径节点的节点信息;对所述节点信息进行展示。
在本可选实施例中,由于item字段中包含有key和value,所以对节点信息进行分析,也包含对key和value的分析。
示例性地,value一般为instanceRef类型,通过instanceRef.classRef.id参数,调用getObject方法得到class对象,即Class clazz;则通过field和clazz,遍历匹配field的引用,若未匹配到,则到field的父类中遍历,以得到feild对应的Script对象,并利用Script对象获取内存泄漏代码信息,该内存泄漏代码信息包括但不限于源码code、行号、列号和uri路径,以及持有该成员变量的对象的uri路径和名称。应理解,Class是VmService中对dartclass的一个描述,而dart语言中本身不存在该类型。
对节点信息进行展示,包括:若key为基本类型,则展示string或int;若key是应用类型,则展示引用类的类名,即引用对象的toString后的信息;若key是闭包Closure类型,则利用预设函数closureFunction.name和closureFunction.owner,获取真正引用的闭包信息,如future.delay等匿名函数的引用信息。
需要说明的是,每个任务会创建一个flutter引擎实现对dart的内存回收,而每个引擎会创建一个isolate,其名称均为main。而在测试阶段时,获取实例对象时用到isolateId,其在VmService未登录状态下通过匹配mainisolate得到,此时只有一个mainisolate,但是在应用上线阶段时,VmService处于登录状态,其有多个mainisolate,所以在VmService登录状态下获取到isolateId与未登录状态获取到的isolateId不同,使得实例对象无法被正确获取。为此,本实施例利用methodChannel支持双向通信的特点,在应用上线阶段时,删除单独创建引擎的代码,使得实例对象在应用阶段能够被正确获取。作为意外收获,由于去除多余的引擎创建代码,使得引擎对应的isolate占用内存降低,实现flutter内存泄漏检测过程的内存消耗。
为了执行上述方法实施例对应的Flutter内存泄漏的检测方法,以实现相应的功能和技术效果。参见图2,图2示出了本申请实施例提供的一种Flutter内存泄漏的检测装置的结构框图。为了便于说明,仅示出了与本实施例相关的部分,本申请实施例提供的Flutter内存泄漏的检测装置,包括:
获取模块201,用于获取待检测页面的实例对象;
第一遍历模块202,用于遍历所述实例对象中的第一目标字段,得到与待检测页面对应的data数组;
第二遍历模块203,用于遍历所述data数组中的第二目标字段是否为预设值;
判定模块204,用于若所述第二目标字段不为预设值,则判定所述待检测页面存在内存泄漏。
在一实施例中,上述获取模块201,包括:
第一确定子模块,用于基于虚拟机服务器VmService,确定所述待检测页面的虚拟机VM对象;
第二确定子模块,用于确定所述VM对象的第一对象ID以及所述VM对象所在目标线程的线程ID;
第一获取子模块,用于根据所述线程ID和所述第一对象ID,获取所述待检测页面的实例对象。
可选地,所述第二确定子模块,包括:
遍历单元,用于遍历所述VmService中的所有线程,匹配得到与所述VM对象对应的目标线程的线程ID;
获取单元,用于基于预设的invoke顶层函数,获取所述VM对象的第一对象ID。
可选地,所述获取子模块,包括:
调用单元,用于调用所述VmService的实例对象获取函数;
返回单元,用于将所述线程ID和所述第一对象ID作为所述实例对象获取函数的输入参数,返回所述待检测页面的实例对象。
在一实施例中,在图2所示实施例的基础上,上述装置,还包括:
第二获取模块,用于获取所述待检测页面的引用路径节点,所述引用路径节点为引用所述待检测页面的路径节点;
分析模块,用于分析所述引用路径节点的节点信息,并对所述节点信息进行展示。
可选地,所述第二获取模块,包括:
第二获取子模块,用于获取VM对象所在目标线程的线程ID,所述VM对象为所述待检测页面对应在VmService中的VM对象;
第三确定子模块,用于确定所述VM对象的第二对象ID;
返回子模块,用于将所述线程ID和第二对象ID作为预设的引用路径获取函数的输入参数,返回所述待检测页面的引用路径节点。
可选地,所述分析模块,包括:
第四确定子模块,用于确定所述引用路径节点的属性类型;
分析子模块,用于根据所述属性类型,分析所述引用路径节点的节点信息;
展示子模块,用于对所述节点信息进行展示。
上述的Flutter内存泄漏的检测装置可实施上述方法实施例的Flutter内存泄漏的检测方法。上述方法实施例中的可选项也适用于本实施例,这里不再详述。本申请实施例的其余内容可参照上述方法实施例的内容,在本实施例中,不再进行赘述。
图3为本申请一实施例提供的计算机设备的结构示意图。如图3所示,该实施例的计算机设备3包括:至少一个处理器30(图3中仅示出一个)处理器、存储器31以及存储在所述存储器31中并可在所述至少一个处理器30上运行的计算机程序32,所述处理器30执行所述计算机程序32时实现上述任意方法实施例中的步骤。
所述计算机设备3可以是智能手机、平板电脑、桌上型计算机和云端服务器等计算设备。该计算机设备可包括但不仅限于处理器30、存储器31。本领域技术人员可以理解,图3仅仅是计算机设备3的举例,并不构成对计算机设备3的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如还可以包括输入输出设备、网络接入设备等。
所称处理器30可以是中央处理单元(Central Processing Unit,CPU),该处理器30还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
所述存储器31在一些实施例中可以是所述计算机设备3的内部存储单元,例如计算机设备3的硬盘或内存。所述存储器31在另一些实施例中也可以是所述计算机设备3的外部存储设备,例如所述计算机设备3上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)等。进一步地,所述存储器31还可以既包括所述计算机设备3的内部存储单元也包括外部存储设备。所述存储器31用于存储操作系统、应用程序、引导装载程序(BootLoader)、数据以及其他程序等,例如所述计算机程序的程序代码等。所述存储器31还可以用于暂时地存储已经输出或者将要输出的数据。
另外,本申请实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述任意方法实施例中的步骤。
本申请实施例提供了一种计算机程序产品,当计算机程序产品在终端设备上运行时,使得终端设备执行时实现上述各个方法实施例中的步骤。
在本申请所提供的几个实施例中,可以理解的是,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意的是,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台终端设备执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述的具体实施例,对本申请的目的、技术方案和有益效果进行了进一步的详细说明,应当理解,以上所述仅为本申请的具体实施例而已,并不用于限定本申请的保护范围。特别指出,对于本领域技术人员来说,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

Claims (10)

1.一种Flutter内存泄漏的检测方法,其特征在于,包括:
获取待检测页面的实例对象;
遍历所述实例对象中的第一目标字段,得到与待检测页面对应的data数组;
遍历所述data数组中的第二目标字段是否为预设值;
若所述第二目标字段不为预设值,则判定所述待检测页面存在内存泄漏。
2.如权利要求1所述的Flutter内存泄漏的检测方法,其特征在于,所述获取待检测页面的实例对象,包括:
基于虚拟机服务器VmService,确定所述待检测页面的虚拟机VM对象;
确定所述VM对象的第一对象ID以及所述VM对象所在目标线程的线程ID;
根据所述线程ID和所述第一对象ID,获取所述待检测页面的实例对象。
3.如权利要求2所述的Flutter内存泄漏的检测方法,其特征在于,所述确定所述VM对象的第一对象ID以及所述VM对象所在目标线程的线程ID,包括:
遍历所述VmService中的所有线程,匹配得到与所述VM对象对应的目标线程的线程ID;
基于预设的invoke顶层函数,获取所述VM对象的第一对象ID。
4.如权利要求2所述的Flutter内存泄漏的检测方法,其特征在于,所述根据所述线程ID和所述第一对象ID,获取所述待检测页面的实例对象,包括:
调用所述VmService的实例对象获取函数;
将所述线程ID和所述第一对象ID作为所述实例对象获取函数的输入参数,返回所述待检测页面的实例对象。
5.如权利要求1至4任一项所述的Flutter内存泄漏的检测方法,其特征在于,所述若所述第二目标字段不为预设值,则判定所述待检测页面存在内存泄漏之后,还包括:
获取所述待检测页面的引用路径节点,所述引用路径节点为引用所述待检测页面的路径节点;
分析所述引用路径节点的节点信息,并对所述节点信息进行展示。
6.如权利要求5所述的Flutter内存泄漏的检测方法,其特征在于,所述获取所述待检测页面的引用路径节点,包括:
获取VM对象所在目标线程的线程ID,所述VM对象为所述待检测页面对应在VmService中的VM对象;
确定所述VM对象的第二对象ID;
将所述线程ID和第二对象ID作为预设的引用路径获取函数的输入参数,返回所述待检测页面的引用路径节点。
7.如权利要求5所述的Flutter内存泄漏的检测方法,其特征在于,所述分析所述引用路径节点的节点信息,并对所述节点信息进行展示,包括:
确定所述引用路径节点的属性类型;
根据所述属性类型,分析所述引用路径节点的节点信息;
对所述节点信息进行展示。
8.一种Flutter内存泄漏的检测装置,其特征在于,包括:
获取模块,用于获取待检测页面的实例对象;
第一遍历模块,用于遍历所述实例对象中的第一目标字段,得到与待检测页面对应的data数组;
第二遍历模块,用于遍历所述data数组中的第二目标字段是否为预设值;
判定模块,用于若所述第二目标字段不为预设值,则判定所述待检测页面存在内存泄漏。
9.一种计算机设备,其特征在于,包括处理器和存储器,所述存储器用于存储计算机程序,所述计算机程序被所述处理器执行时实现如权利要求1至7任一项所述的Flutter内存泄漏的检测方法的步骤。
10.一种计算机可读存储介质,其特征在于,其存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至7任一项所述的Flutter内存泄漏的检测方法的步骤。
CN202210051926.8A 2022-01-17 2022-01-17 Flutter内存泄漏的检测方法及装置 Pending CN114490366A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210051926.8A CN114490366A (zh) 2022-01-17 2022-01-17 Flutter内存泄漏的检测方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210051926.8A CN114490366A (zh) 2022-01-17 2022-01-17 Flutter内存泄漏的检测方法及装置

Publications (1)

Publication Number Publication Date
CN114490366A true CN114490366A (zh) 2022-05-13

Family

ID=81511965

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210051926.8A Pending CN114490366A (zh) 2022-01-17 2022-01-17 Flutter内存泄漏的检测方法及装置

Country Status (1)

Country Link
CN (1) CN114490366A (zh)

Similar Documents

Publication Publication Date Title
CN110162296B (zh) 应用程序编程接口文档的生成方法、装置及终端设备
US20160342413A1 (en) Verification of backward compatibility of software components
US10318595B2 (en) Analytics based on pipes programming model
CN109308263B (zh) 一种小程序测试方法、装置及设备
CN110007920B (zh) 一种获取代码依赖关系的方法、装置及电子设备
US9026612B2 (en) Generating a custom parameter rule based on a comparison of a run-time value to a request URL
CN113987517B (zh) 基于物联网固件的漏洞挖掘方法、装置、设备及存储介质
US9652358B1 (en) Type widening for source code analysis
CN110826057A (zh) 数据处理路径的分析方法、计算机设备、存储介质
CN115186274A (zh) 基于iast的安全测试方法及装置
CN111949513A (zh) 一种配置文件加载方法、装置、电子设备和可读存储装置
CN113495728A (zh) 依赖关系确定方法、装置、电子设备及介质
US10831643B2 (en) Detecting potential class loader problems using the class search path sequence for each class loader
US20110321001A1 (en) Visualization of runtime analysis across dynamic boundaries
CN114428575A (zh) 一种界面元素探测识别方法、装置、存储介质及电子设备
US20100313190A1 (en) Determining target types for generic pointers in source code
CN111753330B (zh) 数据泄露主体的确定方法、装置、设备和可读存储介质
CN116432185B (zh) 一种异常检测方法、装置、可读存储介质及电子设备
CN114490366A (zh) Flutter内存泄漏的检测方法及装置
KR101858594B1 (ko) 안티리버싱 코드 검출 방법 및 그 장치
CN115618363A (zh) 漏洞路径的挖掘方法及相关设备
CN113110870B (zh) 一种资源打包管理方法、装置、设备及存储介质
CN114936368A (zh) 一种Java内存木马检测方法、终端设备及存储介质
CN115203060B (zh) 一种基于iast的安全测试方法及装置
CN112685305B (zh) 用户界面性能测试方法及装置、电子设备和可读存储介质

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