CN113986739A - 用于网站内存泄露的监测方法、装置、存储介质及处理器 - Google Patents

用于网站内存泄露的监测方法、装置、存储介质及处理器 Download PDF

Info

Publication number
CN113986739A
CN113986739A CN202111272872.XA CN202111272872A CN113986739A CN 113986739 A CN113986739 A CN 113986739A CN 202111272872 A CN202111272872 A CN 202111272872A CN 113986739 A CN113986739 A CN 113986739A
Authority
CN
China
Prior art keywords
function
syntax tree
abstract syntax
type
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.)
Pending
Application number
CN202111272872.XA
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.)
CCB Finetech Co Ltd
Original Assignee
CCB Finetech 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 CCB Finetech Co Ltd filed Critical CCB Finetech Co Ltd
Priority to CN202111272872.XA priority Critical patent/CN113986739A/zh
Publication of CN113986739A publication Critical patent/CN113986739A/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/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)
  • Debugging And Monitoring (AREA)

Abstract

本申请实施例提供一种用于网站内存泄露的监测方法、装置、存储介质、处理器及计算机程序产品。方法包括:获取待监测网站的源执行文件;对所述源执行文件进行转换,以确定所述源执行文件对应的抽象语法树;根据目标文件对所述抽象语法树进行遍历;获取所述目标文件在所述抽象语法树中的待统计信息;对所述目标文件的待统计信息进行统计并保存,采用这种方式下,无需多余的插件来进行处理,也不需要进行代码的审查或检索,同时还保证了对网站端的内存泄露代码的全面监测,同时统计的信息也可以自行自定义,信息的统计更为灵活、丰富且适应于实际需求。

Description

用于网站内存泄露的监测方法、装置、存储介质及处理器
技术领域
本申请涉及计算机技术领域,具体涉及一种用于网站内存泄露的监测方法、装置、存储介质、处理器及计算机程序产品。
背景技术
程序的运行需要内存,对于持续运行的程序必须及时释放不再用到的内存。否则,内存占用越来越高,导致程序运行速度减慢甚至系统崩溃等严重后果。JavaScript和C#,java的运行环境一样有垃圾回收机制,开发者无需手动跟踪释放内存。但是对于程序中全局变量、闭包、定时器函数、dom绑定事件等需要进行对应的处理,未做处理时容易导致内存泄露问题。
针对内存泄露的问题,在现有技术CN112463632A中,提供了一种内存泄露检测的方法和设备。该方法包括:遍历项目中包含的类,并记录可能存在内存泄露风险的类及类中存在风险的成员变量以形成风险类图;遍历项目中包含的所有函数,并根据函数之间的调用关系构造函数调用之间的链表以形成函数链表;基于风险类图和函数链表,检测项目中存在的内存泄露。通过使用该现有技术的方案,能够降低对内存泄露检测中的漏报和误报,提高扫描和审核内存泄露的质量和效率。
然而,这一现有技术所提供的技术方案针对的是后端应用中内存泄露的检测工作,而无法处理前端项目(网站)的内存泄露问题。
发明内容
本申请实施例的目的是提供一种用于网站内存泄露的监测方法、装置、存储介质、处理器及计算机程序产品。
为了实现上述目的,本申请第一方面提供一种用于网站内存泄露的监测方法,包括:
获取待监测网站的源执行文件;
对源执行文件进行转换,以确定源执行文件对应的抽象语法树;
根据目标文件对抽象语法树进行遍历;
获取目标文件在抽象语法树中的待统计信息;
对目标文件的待统计信息进行统计并保存。
在本申请实施例中,目标文件包括目标变量类型、目标函数和目标事件中的至少一者;待统计信息包括目标文件的名称和位置信息,位置信息包括目标文件在抽象语法树中所在的行数和列数。
在本申请实施例中,目标变量类型包括全局变量,获取目标文件在抽象语法树中的待统计信息包括:
获取抽象语法树中与全局变量对应的第一类型的表达式文件;
对第一类型的表达式文件进行统计,以确定全局变量的变量名称以及全局变量在抽象语法树中的位置信息。
在本申请实施例中,全局变量包括位于函数体内的全局变量和位于函数体外的全局变量中的至少一者。
在本申请实施例中,对第一类型的表达式文件进行统计,以确定全局变量的变量名称以及全局变量在抽象语法树中的位置信息包括:
获取第一类型的表达式文件包含的边缘属性中的名称属性的属性值;
将名称属性的属性值确定为全局变量的变量名称;
获取第一类型的表达式文件包含的表达属性中的第一开始属性;
将第一开始属性中的行属性的属性值确定为全局变量在抽象语法树中的行数,将第一开始属性中的列属性的属性值确定为全局变量在抽象语法树中的列数。
在本申请实施例中,对目标文件的待统计信息进行统计并保存包括:
将全部统计的全局变量的变量名称以及与每个全局变量对应的位置信息拼接成第一字符串;
将第一字符串发送至预设地址以保存。
在本申请实施例中,目标函数包括定时器函数,获取目标文件在抽象语法树中的待统计信息包括:
获取抽象语法树中与定时器函数对应的第二类型的表达式文件;
对第二类型的表达式文件进行统计,以确定定时器函数的函数名称以及定时器函数在抽象语法树中的位置信息。
在本申请实施例中,定时器函数包括单次定时器函数,单次定时器函数包括第一单次定时器函数和第二单次定时器函数,对第二类型的表达式文件进行统计,以确定定时器函数的函数名称以及定时器函数在抽象语法树中的位置信息包括:
获取第二类型的表达式文件包含的调用属性的第一属性值;
在第一属性值为标识符类型值的情况下,确定标识符类型值对应的函数为第一单次定时器函数;
在第一属性值为成员表达式类型值的情况下,确定成员表达式类型值对应的函数为第二单次定时器函数;
分别获取第一单次定时器函数和第二单次定时器函数的调用属性中的第二开始属性,并根据第二开始属性中的行属性和列属性的值分别确定第一单次定时器函数和第二单次定时器函数在抽象语法树中的行数和列数。
在本申请实施例中,定时器函数还包括循环定时器函数,对目标文件的待统计信息进行统计并保存包括:
分别将单次定时器函数和循环定时器函数的函数名称以及与每个定时器函数对应的位置信息拼接成对应的第二字符串和第三字符串;
将第二字符串和第三字符串发送至预设地址以保存。
在本申请实施例中,获取目标文件在抽象语法树中的待统计信息还包括:
在确定抽象语法树中包含有定时器函数的情况下,检测定时器函数是否存在对应的取消函数;
在检测到定时器函数存在对应的取消函数的情况下,获取取消函数对应的函数名称,以及取消函数所在的行数和列数。
在本申请实施例中,目标事件包括监听事件,获取目标文件在抽象语法树中的待统计信息包括:
获取抽象语法树中与监听事件对应的第三类型的表达式文件;
对第三类型的表达式文件进行统计,以确定监听事件的事件名称以及监听事件在抽象语法树中的位置信息。
在本申请实施例中,监听事件包括第一类型监听事件和第二类型监听事件;对第三类型的表达式文件进行统计,以确定监听事件的事件名称以及监听事件在抽象语法树中的位置信息包括:
获取第三类型的表达式文件包含的调用属性中的第三开始属性;
分别获取第一类型监听事件和第二类型监听事件对应的第三开始属性,并根据第三开始属性中的行属性和列属性的值分别确定第一类型监听事件和第二类型监听事件在抽象语法树中的行数和列数。
在本申请实施例中,对目标文件的待统计信息进行统计并保存包括:
分别将第一类型监听事件和第二类型监听事件的事件名称以及与每个监听事件对应的位置信息拼接成对应的第四字符串和第五字符串;
将第四字符串和第五字符串发送至预设地址以保存。
在本申请实施例中,获取目标文件在抽象语法树中的待统计信息还包括:
在确定抽象语法树中包含有监听事件的情况下,检测监听事件是否存在对应的解绑函数;
在检测到监听事件存在对应的解绑函数的情况下,获取解绑函数对应的函数名称,以及解绑函数所在的行数和列数。
在本申请实施例中,对源执行文件进行转换,以确定源执行文件对应的抽象语法树包括:
通过预设数据库将源执行文件转换为对应的抽象语法树。
本申请第二方面提供一种处理器,被配置成执行上述的用于网站内存泄露的监测方法。
本申请第三方面提供一种用于网站内存泄露的监测装置,包括上述的处理器。
本申请第四方面提供一种机器可读存储介质,该机器可读存储介质上存储有指令,该指令在被处理器执行时使得所述处理器被配置成执行上述的用于网站内存泄露的监测方法。
本申请第五方面提供一种计算机程序产品,包括计算机程序,该计算机程序在被处理器执行时实现根据上述的用于网站内存泄露的监测方法。
上述的用于网站内存泄露的监测方法,通过获取待监测网站的源执行文件,并对源执行文件进行转换,以得到源执行文件对应的抽象语法树,根据目标文件对抽象语法树进行遍历后,可以获取到目标文件在抽象语法树中的待统计信息,之后可以对目标文件的待统计信息进行统计并保存,采用这种方式下,无需多余的插件来进行处理,也不需要进行代码的审查或检索,同时还保证了对网站端的内存泄露代码的全面监测,同时统计的信息也可以自行自定义,信息的统计更为灵活、丰富且适应于实际需求。
本申请实施例的其它特征和优点将在随后的具体实施方式部分予以详细说明。
附图说明
附图是用来提供对本申请实施例的进一步理解,并且构成说明书的一部分,与下面的具体实施方式一起用于解释本申请实施例,但并不构成对本申请实施例的限制。在附图中:
图1示意性示出了根据本申请实施例的用于网站内存泄露的监测方法的应用环境示意图;
图2示意性示出了根据本申请实施例的内存泄露代码监测过程的示意图;
图3示意性示出了根据本申请实施例的计算机设备的内部结构图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,应当理解的是,此处所描述的具体实施方式仅用于说明和解释本申请实施例,并不用于限制本申请实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
需要说明,若本申请实施例中有涉及方向性指示(诸如上、下、左、右、前、后……),则该方向性指示仅用于解释在某一特定姿态(如附图所示)下各部件之间的相对位置关系、运动情况等,如果该特定姿态发生改变时,则该方向性指示也相应地随之改变。
另外,若本申请实施例中有涉及“第一”、“第二”等的描述,则该“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。另外,各个实施例之间的技术方案可以相互结合,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时应当认为这种技术方案的结合不存在,也不在本申请要求的保护范围之内。
图1示意性示出了根据本申请实施例的用于网站内存泄露的监测方法的流程示意图。如图1所示,在本申请一实施例中,提供了一种用于网站内存泄露的监测方法,本实施例主要以该方法应用于终端来举例说明,包括以下步骤:
步骤102,获取待监测网站的源执行文件。
步骤104,对源执行文件进行转换,以确定源执行文件对应的抽象语法树。
步骤106,根据目标文件对抽象语法树进行遍历。
步骤108,获取目标文件在抽象语法树中的待统计信息。
步骤110,对目标文件的待统计信息进行统计并保存。
本实施例中的源执行文件可以是指JavaScript文件,因此本方法可以针对网站页面的JavaScript文件进行内存泄露代码的监测。终端在获取到待监测的源执行文件后,可以对源执行文件进行转换,以得到与该源执行文件对应的抽象语法树。抽象语法树,其简称为AST(Abstract Syntax Tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。在一个实施例中,对源执行文件进行转换,以确定源执行文件对应的抽象语法树包括:通过预设数据库将源执行文件转换为对应的抽象语法树。在对源执行文件进行转换时,可使用babel技术对其进行转换。Babel是一个JavaScript编译器,可以对源执行文件进行语法解析并生成对应的AST语法树。具体地,可以使用babel/parser这一特定的数据库将源执行文件,即JavaScript文件转换为AST。
在确定出源执行文件对应的抽象语法树后,可以根据目标文件对抽象语法树进行遍历。其中,目标文件是预先根据需要统计的内存泄露维度所确定出的文件。目标文件中可以包括目标变量类型、目标函数和目标事件中的至少一者。技术人员也可以根据实际需求对需要统计的维度进行调整。在对抽象语法树进行遍历后,可以获取到目标文件在抽象语法树中的待统计信息,对目标文件的待统计信息进行统计并保存,并实现了对源执行文件中可能存在内存泄露的代码进行了监测,后续技术人员可以针对统计的信息进行监测并处理。待统计信息可以包括目标文件的名称和位置信息,位置信息包括目标文件在抽象语法树中所在的行数和列数。待统计信息中也可以包括其他更多的详细信息,可以根据技术人员的需求进行调整。
在一个实施例中,目标变量类型包括全局变量,获取目标文件在抽象语法树中的待统计信息包括:获取抽象语法树中与全局变量对应的第一类型的表达式文件;对第一类型的表达式文件进行统计,以确定全局变量的变量名称以及全局变量在抽象语法树中的位置信息。
变量类型包括全局变量和局部变量,本方案中针对的是全局变量。当一个变量使用var、let或者const声明时,变量作用域限制在其声明位置的上下文中,而非声明变量(即没有使用var、let和const声明变量)总是全局的,即为全局变量。在JavaScript和C#,java的运行环境下,存在垃圾回收机制,开发者无需手动跟踪释放内存。但是对于源执行文件中的全局变量、闭包、定时器函数以及dom绑定事件等代码需要做处理。例如,将全局变量修改为let、const或者var声明的变量;针对定时器函数,可以编写定时器清理函数;针对dom事件,可以增加解绑处理等。并且,由于全局变量无法被垃圾收集器收集,如果必须使用全局变量来存储数据,则需要确保使用完成后将其指定为null或重新分配该全局变量。当全局变量使用完成后未指定为null就会造成内存泄露,所以需要统计全局变量的使用情况。为了找出源执行文件中的全局变量,可以先获取到抽象语法树中与全局变量对应的第一类型的表达式文件,再对第一类型的表达式文件进行统计,以确定出全局变量的变量名称以及全局变量在抽象语法树中的位置信息。在一个实施例中,全局变量包括位于函数体内的全局变量和位于函数体外的全局变量中的至少一者。其中,第一类型的表达式文件可以是ExpressionStatement(表达式说明)类型。因为全局变量是一直表达式,所有的全局变量会在ExpressionStatement中。故,可以对抽象语法树中的ExpressionStatement类型进行统计,获取到每个全局变量的变量名称以及每个全局变量在抽象语法树中的位置信息。位置信息包括每个全局变量在抽象语法树中所在的行和列。
在一个实施例中,对第一类型的表达式文件进行统计,以确定全局变量的变量名称以及全局变量在抽象语法树中的位置信息包括:获取第一类型的表达式文件包含的边缘属性中的名称属性的属性值;将名称属性的属性值确定为全局变量的变量名称;获取第一类型的表达式文件包含的表达属性中的第一开始属性;将第一开始属性中的行属性的属性值确定为全局变量在抽象语法树中的行数,将第一开始属性中的列属性的属性值确定为全局变量在抽象语法树中的列数。
在抽象语法树中,可以获取到第一类型的表达式文件包含的边缘属性中的名称属性的属性值,即可以获取到ExpressionStatement中的expression属性的left属性的name属性,可以将name属性的属性值确定为全局变量的变量名称。进一步地,还可以获取到第一类型的表达式文件包含的表达属性中的第一开始属性,第一开始属性可以是指ExpressionStatement中expression属性的loc属性的start属性。可以将第一开始属性中的行属性的属性值确定为全局变量在抽象语法树中的行数,将第一开始属性中的列属性的属性值确定为全局变量在抽象语法树中的列数。
进一步地,在一个实施例中,对目标文件的待统计信息进行统计并保存包括:将全部统计的全局变量的变量名称以及与每个全局变量对应的位置信息拼接成第一字符串;将第一字符串发送至预设地址以保存。
在确定出抽象语法树中包括的每个全局变量的变量名称以及每个全局变量的位置信息后,即每个全局变量在抽象语法树中所在的行和列后,可以将全部的全局变量的变量名称以及与每个全局变量对应的位置信息拼接成第一字符串,再将第一字符串发送至预设地址以保存。如,可以将第一字符串发送至执行文件夹中,后续技术人员可以针对统计的数据进行分析与处理。
在一个实施例中,目标函数包括定时器函数,获取目标文件在抽象语法树中的待统计信息包括:获取抽象语法树中与定时器函数对应的第二类型的表达式文件;对第二类型的表达式文件进行统计,以确定定时器函数的函数名称以及定时器函数在抽象语法树中的位置信息。
定时器函数如果只有执行操作的代码,但是没有取消操作的代码时,则会造成内存的泄露。因此,为了找出源执行文件中的定时器函数,可以针对源执行文件对应的抽象语法树,先获取到抽象语法树中与定时器函数对应的第二类型的表达式文件。其中,第二类型的表达式文件可以是指CallExpression。同样地,可以对第二类型的表达式文件进行统计,以确定抽象树中包含的每个定时器函数的函数名称以及每个定时器函数在抽象语法树中的位置信息。在一个实施例中,定时器函数包括单次定时器函数和循环定时器函数。单次定时器函数是指setTimeout定时器函数,该定时器在定时器到期后执行一个函数或执行一段代码。循环定时器函数是指setInterval定时器函数,该方法重复调用一个函数或执行一端代码段,在每次调用之间具有固定的时间延迟。
进一步地,在一个实施例中,单次定时器函数包括第一单次定时器函数和第二单次定时器函数。对第二类型的表达式文件进行统计,以确定定时器函数的函数名称以及定时器函数在抽象语法树中的位置信息包括:获取第二类型的表达式文件包含的调用属性的第一属性值;在第一属性值为标识符类型值的情况下,确定标识符类型值对应的函数为第一单次定时器函数;在第一属性值为成员表达式类型值的情况下,确定成员表达式类型值对应的函数为第二单次定时器函数;分别获取第一单次定时器函数和第二单次定时器函数的调用属性中的第二开始属性,并根据第二开始属性中的行属性和列属性的值分别确定第一单次定时器函数和第二单次定时器函数在抽象语法树中的行数和列数。
单次定时器函数,即setTimeout定时器函数,包括两种,分别是第一单次定时器函数和第二单次定时器函数。第一单次定时器函数可以是直接定义调用的setTimeout,第二单次定时器函数可以是使用window对象调用的setTimeout。对于setTimeout直接定义和使用window对象调用时,CallExpression(第二类型的表达式文件)内部数据不一样,因此需要针对setTimeout直接定义和使用window对象调用两种分别处理。在使用这两种单次定时器函数时,CallExpression下的调用属性的值是不同的。具体地,CallExpression下的callee属性的第一属性值不同。setTimeout直接定义调用时,callee属性的第一属性值为标识符类型值,如Identifier。而使用window调用时,callee属性的第一属性值为成员表达式类型值,如MemberExpression。因此,在第一属性值为标识符类型值的情况下,可以确定标识符类型值对应的函数为第一单次定时器函数(setTimeout直接定义的调用函数)。在第一属性值为成员表达式类型值的情况下,可以确定成员表达式类型值对应的函数为第二单次定时器函数(使用window调用的函数)。然后,可以分别获取第一单次定时器函数和第二单次定时器函数的调用属性中的第二开始属性,将第一单次定时器函数的调用属性中的第二开始属性中的行属性和列属性的值确定为第一单次定时器函数在抽象语法树中的行数和列数,将第二单次定时器函数的调用属性中的第二开始属性的行属性和列属性的值确定为第二单次定时器函数在抽象语法树中的行数和列数。
在一个实施例中,对目标文件的待统计信息进行统计并保存包括:分别将单次定时器函数和循环定时器函数的函数名称以及与每个定时器函数对应的位置信息拼接成对应的第二字符串和第三字符串;将第二字符串和第三字符串发送至预设地址以保存。
针对两种类型的定时器函数,即单次定时器函数和循环定时器函数,可以将抽象语法树中包含的每个单次定时器函数的函数名称以及与每个单次定时器函数对应的位置信息拼接成对应的第二字符串,将抽象语法树中包含的每个循环定时器函数的函数名称以及与每个循环定时器函数对应的位置信息拼接成对应的第三字符串,并将第二字符串和第三字符串发送至预设地址以保存。
进一步地,在一个实施例中,获取目标文件在抽象语法树中的待统计信息还包括:在确定抽象语法树中包含有定时器函数的情况下,检测定时器函数是否存在对应的取消函数;在检测到定时器函数存在对应的取消函数的情况下,获取取消函数对应的函数名称,以及取消函数所在的行数和列数。
对于定时器函数来说,若只有执行定时的定时器函数,却没有对应的取消定时器的取消函数,那么定时器的执行进程会持续运行,导致内存泄露。因此,可以对没有对应的取消函数的定时器函数进行统计。具体地,在已经获取到每个定时器函数的函数名称和位置信息后,还可以继续检测每个定时器函数是否存在与之对应的取消函数。若有定时器函数存在对应的取消函数,可以获取到每个取消函数对应的函数名称,以及每个取消函数所在的行数和列数,以对每个定时器函数的执行代码和取消代码都进行详细的记录,以便后续技术人员进行更直观、准确地分析。
在一个实施例中,目标事件包括监听事件。获取目标文件在抽象语法树中的待统计信息包括:获取抽象语法树中与监听事件对应的第三类型的表达式文件;对第三类型的表达式文件进行统计,以确定监听事件的事件名称以及监听事件在抽象语法树中的位置信息。
在本实施例中,监听事件可以是指dom事件,具体可以是指JavaScript中使用的第一类型监听事件和第二类型监听事件。其中,第一类型监听事件可以是指addEventListener,addEventListener是将指定的监听器注册到EventTarget(目标事件)上,当该对象触发指定的事件时,指定的回调函数就会被执行。事件目标可以是一个文档上的元素Element,Document(文件)和Window(窗口)或者任何其他支持事件的对象(比如XMLHttpRequest,网页请求)。第二类型监听事件可以是指attachEvent,其工作原理是将实现EventListener(事件监听)的函数或对象添加到调用它的EventTarget(目标事件)上的指定事件类型的事件侦听器列表中。针对监听事件,当元素销毁时需要对元素上监听的事件进行解除绑定的操作,否则会造成内存的泄露。因此,在对源执行文件进行内存泄露的监测时,同样需要统计出源执行文件中所包含的监听事件的信息。针对源执行文件中的监听事件,可以先检测抽象语法树中是否存在与监听事件对应的第三类型的表达式文件。第三类型的表达式文件可以是CallExpression。若有,则可以获取到抽象语法树中的第三类型的表达式文件,然后对第三类型的表达式文件进行统计,确定出抽象语法树中包含的每一个监听事件的事件名称,以及每个监听事件在抽象语法树中的位置信息。
在一个实施例中,对第三类型的表达式文件进行统计,以确定监听事件的事件名称以及监听事件在抽象语法树中的位置信息包括:获取第三类型的表达式文件包含的调用属性中的第三开始属性;分别获取第一类型监听事件和第二类型监听事件对应的第三开始属性,并根据第三开始属性中的行属性和列属性的值分别确定第一类型监听事件和第二类型监听事件在抽象语法树中的行数和列数。
具体地,源执行文件中的第一类型监听事件和第二类型监听事件,在源执行文件转化为抽象语法树后,被解析成了CallExpression类型,即第三类型的表达式文件,从CallExpression中分别可以得到第一类型监听事件和第二类型监听事件的信息,即第一类型监听事件和第二类型监听事件的事件名称和位置信息。具体地,监听事件的位置信息在CallExpression中包含的调用属性中的第三开始属性下。如,监听事件的位置信息可以在CallExpression中的callee属性的property属性的loc属性start属性下。因此,可以分别获取到第一类型监听事件和第二类型监听事件对应的第三开始属性,并分别将第三开始属性中的行属性和列属性的值确定为第一类型监听事件和第二类型监听事件在抽象语法树中的行数和列数。进一步地,还可以将每个第一类型监听事件的事件名称和每个第一类型监听事件对应的位置信息拼接成对应的第四字符串,将每个第二类型监听事件的事件名称和每个第二类型监听事件对应的位置信息拼接成对应的第五字符串,然后同样可以将第四字符串和第五字符串发送至预设地址以保存,如发送至指定的文件夹以保存。
在一个实施例中,获取目标文件在抽象语法树中的待统计信息还包括:在确定抽象语法树中包含有监听事件的情况下,检测监听事件是否存在对应的解绑函数;在检测到监听事件存在对应的解绑函数的情况下,获取解绑函数对应的函数名称,以及解绑函数所在的行数和列数。
监听事件如果没有相对应的解绑函数,即没有对应的解绑操作时,会造成内存的泄露。因此,针对源执行文件中的监听事件,可以进一步对每个监听事件对应的解绑函数进行统计。具体地,在已经获取到每个监听事件的事件名称和位置信息后,还可以继续检测每个监听事件是否存在与之对应的解绑函数。若有监听事件存在对应的解绑函数,可以获取到每个解绑函数对应的函数名称,以及每个解绑函数所在的行数和列数,以对每个监听事件的监听代码和解绑代码都进行详细的记录,以便后续技术人员进行更直观、准确地分析。
上述的用于网站内存泄露的监测方法,通过获取待监测网站的源执行文件,并对源执行文件进行转换,以得到源执行文件对应的抽象语法树,根据目标文件对抽象语法树进行遍历后,可以获取到目标文件在抽象语法树中的待统计信息,之后可以对目标文件的待统计信息进行统计并保存,采用这种方式下,无需多余的插件来进行处理,也不需要进行代码的审查或检索,同时还保证了对网站端的内存泄露代码的全面监测,同时统计的信息也可以自行自定义,信息的统计更为灵活、丰富且适应于实际需求。
在一个实施例中,如图2所示,提供了一种内存泄露代码监测过程的示意图。首先,可以获取到插件参数,插件参数是指目标文件的获取,目标文件是预先根据需要统计的内存泄露维度所确定出的文件。目标文件中可以包括目标变量类型、目标函数和目标事件中的至少一者。技术人员也可以根据实际需求对需要统计的维度进行调整。因此,在获取到插件参数后,则可以进一步获取到参数中配置的内存泄露统计维度,即确定需要对源执行文件中的哪些类型的代码进行统计。在本实施例中,以目标文件包括目标变量类型、目标函数和目标事件为例。可以先对源执行文件进行转换,以得到源执行文件对应的抽象语法树。然后对抽象语法树进行遍历,并将获取到的目标文件在抽象语法树中的待统计信息进行统计与保存。具体地,如果内存泄露统计维度包括全局变量,则可以统计全局变量的待统计信息,即统计每个全局变量的变量名称以及每个全局变量在抽象语法树中的位置信息。同样地,如果内存泄露统计维度包括定时器函数和dom事件(监听事件),则可以同样分别统计出每个定时器函数的函数名称和每个定时器函数在抽象语法树中的位置信息,以及每个监听事件的事件名称和每个监听事件在抽象语法树中的位置信息。
图1和图2为一个实施例中用于网站内存泄露的监测方法的流程示意图。应该理解的是,虽然图1和图2的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1和图2中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
本申请实施例提供了一种存储介质,其上存储有程序,该程序被处理器执行时实现上述用于网站内存泄露的监测方法。
本申请实施例提供了一种处理器,所述处理器用于运行程序,其中,所述程序运行时执行上述的用于网站内存泄露的监测方法。
在一个实施例中,提供了一种用于网站内存泄露的监测装置,包括上述的处理器和存储器,可以由处理器执行存储在存储器中的程序以实现上述的用于网站内存泄露的监测方法。
处理器中包含内核,由内核去存储器中调取相应的程序单元。内核可以设置一个或以上,通过调整内核参数来实现用于网站内存泄露的监测方法。
存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM),存储器包括至少一个存储芯片。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图3所示。该计算机设备包括通过系统总线连接的处理器A01、网络接口A02、显示屏A04、输入装置A05和存储器(图中未示出)。其中,该计算机设备的处理器A01用于提供计算和控制能力。该计算机设备的存储器包括内存储器A03和非易失性存储介质A06。该非易失性存储介质A06存储有操作系统B01和计算机程序B02。该内存储器A03为非易失性存储介质A06中的操作系统B01和计算机程序B02的运行提供环境。该计算机设备的网络接口A02用于与外部的终端通过网络连接通信。该计算机程序被处理器A01执行时以实现一种用于网站内存泄露的监测方法。该计算机设备的显示屏A04可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置A05可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
本领域技术人员可以理解,图3中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
本申请实施例提供了一种设备,设备包括处理器、存储器及存储在存储器上并可在处理器上运行的程序,处理器执行程序时实现以下步骤:获取待监测网站的源执行文件;对源执行文件进行转换,以确定源执行文件对应的抽象语法树;根据目标文件对抽象语法树进行遍历;获取目标文件在抽象语法树中的待统计信息;对目标文件的待统计信息进行统计并保存。
在一个实施例中,目标文件包括目标变量类型、目标函数和目标事件中的至少一者;待统计信息包括目标文件的名称和位置信息,位置信息包括目标文件在抽象语法树中所在的行数和列数。
在一个实施例中,目标变量类型包括全局变量,获取目标文件在抽象语法树中的待统计信息包括:获取抽象语法树中与全局变量对应的第一类型的表达式文件;对第一类型的表达式文件进行统计,以确定全局变量的变量名称以及全局变量在抽象语法树中的位置信息。
在一个实施例中,全局变量包括位于函数体内的全局变量和位于函数体外的全局变量中的至少一者。
在一个实施例中,对第一类型的表达式文件进行统计,以确定全局变量的变量名称以及全局变量在抽象语法树中的位置信息包括:获取第一类型的表达式文件包含的边缘属性中的名称属性的属性值;将名称属性的属性值确定为全局变量的变量名称;获取第一类型的表达式文件包含的表达属性中的第一开始属性;将第一开始属性中的行属性的属性值确定为全局变量在抽象语法树中的行数,将第一开始属性中的列属性的属性值确定为全局变量在抽象语法树中的列数。
在一个实施例中,对目标文件的待统计信息进行统计并保存包括:将全部统计的全局变量的变量名称以及与每个全局变量对应的位置信息拼接成第一字符串;将第一字符串发送至预设地址以保存。
在一个实施例中,目标函数包括定时器函数,获取目标文件在抽象语法树中的待统计信息包括:获取抽象语法树中与定时器函数对应的第二类型的表达式文件;对第二类型的表达式文件进行统计,以确定定时器函数的函数名称以及定时器函数在抽象语法树中的位置信息。
在一个实施例中,定时器函数包括单次定时器函数,单次定时器函数包括第一单次定时器函数和第二单次定时器函数,对第二类型的表达式文件进行统计,以确定定时器函数的函数名称以及定时器函数在抽象语法树中的位置信息包括:获取第二类型的表达式文件包含的调用属性的第一属性值;在第一属性值为标识符类型值的情况下,确定标识符类型值对应的函数为第一单次定时器函数;在第一属性值为成员表达式类型值的情况下,确定成员表达式类型值对应的函数为第二单次定时器函数;分别获取第一单次定时器函数和第二单次定时器函数的调用属性中的第二开始属性,并根据第二开始属性中的行属性和列属性的值分别确定第一单次定时器函数和第二单次定时器函数在抽象语法树中的行数和列数。
在一个实施例中,定时器函数还包括循环定时器函数,对目标文件的待统计信息进行统计并保存包括:分别将单次定时器函数和循环定时器函数的函数名称以及与每个定时器函数对应的位置信息拼接成对应的第二字符串和第三字符串;将第二字符串和第三字符串发送至预设地址以保存。
在一个实施例中,获取目标文件在抽象语法树中的待统计信息还包括:在确定抽象语法树中包含有定时器函数的情况下,检测定时器函数是否存在对应的取消函数;在检测到定时器函数存在对应的取消函数的情况下,获取取消函数对应的函数名称,以及取消函数所在的行数和列数。
在一个实施例中,目标事件包括监听事件,获取目标文件在抽象语法树中的待统计信息包括:获取抽象语法树中与监听事件对应的第三类型的表达式文件;对第三类型的表达式文件进行统计,以确定监听事件的事件名称以及监听事件在抽象语法树中的位置信息。
在一个实施例中,监听事件包括第一类型监听事件和第二类型监听事件;对第三类型的表达式文件进行统计,以确定监听事件的事件名称以及监听事件在抽象语法树中的位置信息包括:获取第三类型的表达式文件包含的调用属性中的第三开始属性;分别获取第一类型监听事件和第二类型监听事件对应的第三开始属性,并根据第三开始属性中的行属性和列属性的值分别确定第一类型监听事件和第二类型监听事件在抽象语法树中的行数和列数。
在一个实施例中,对目标文件的待统计信息进行统计并保存包括:分别将第一类型监听事件和第二类型监听事件的事件名称以及与每个监听事件对应的位置信息拼接成对应的第四字符串和第五字符串;将第四字符串和第五字符串发送至预设地址以保存。
在一个实施例中,获取目标文件在抽象语法树中的待统计信息还包括:在确定抽象语法树中包含有监听事件的情况下,检测监听事件是否存在对应的解绑函数;在检测到监听事件存在对应的解绑函数的情况下,获取解绑函数对应的函数名称,以及解绑函数所在的行数和列数。
在一个实施例中,对源执行文件进行转换,以确定源执行文件对应的抽象语法树包括:通过预设数据库将源执行文件转换为对应的抽象语法树。
本申请还提供了一种计算机程序产品,当在数据处理设备上执行时,适于执行初始化有用于网站内存泄露的监测方法步骤的程序。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。存储器是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体,可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。
以上仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

Claims (19)

1.一种用于网站内存泄露的监测方法,其特征在于,所述监测方法包括:
获取待监测网站的源执行文件;
对所述源执行文件进行转换,以确定所述源执行文件对应的抽象语法树;
根据目标文件对所述抽象语法树进行遍历;
获取所述目标文件在所述抽象语法树中的待统计信息;
对所述目标文件的待统计信息进行统计并保存。
2.根据权利要求1所述的监测方法,其特征在于,所述目标文件包括目标变量类型、目标函数和目标事件中的至少一者;所述待统计信息包括所述目标文件的名称和位置信息,所述位置信息包括所述目标文件在所述抽象语法树中所在的行数和列数。
3.根据权利要求2所述的监测方法,其特征在于,所述目标变量类型包括全局变量,所述获取所述目标文件在所述抽象语法树中的待统计信息包括:
获取所述抽象语法树中与所述全局变量对应的第一类型的表达式文件;
对所述第一类型的表达式文件进行统计,以确定所述全局变量的变量名称以及所述全局变量在所述抽象语法树中的位置信息。
4.根据权利要求3所述的监测方法,其特征在于,所述全局变量包括位于函数体内的全局变量和位于函数体外的全局变量中的至少一者。
5.根据权利要求4所述的监测方法,其特征在于,所述对所述第一类型的表达式文件进行统计,以确定所述全局变量的变量名称以及所述全局变量在所述抽象语法树中的位置信息包括:
获取所述第一类型的表达式文件包含的边缘属性中的名称属性的属性值;
将所述名称属性的属性值确定为所述全局变量的变量名称;
获取所述第一类型的表达式文件包含的表达属性中的第一开始属性;
将所述第一开始属性中的行属性的属性值确定为所述全局变量在所述抽象语法树中的行数,将所述第一开始属性中的列属性的属性值确定为所述全局变量在所述抽象语法树中的列数。
6.根据权利要求5所述的监测方法,其特征在于,所述对所述目标文件的待统计信息进行统计并保存包括:
将全部统计的全局变量的变量名称以及与每个全局变量对应的位置信息拼接成第一字符串;
将所述第一字符串发送至预设地址以保存。
7.根据权利要求2所述的监测方法,其特征在于,所述目标函数包括定时器函数,所述获取所述目标文件在所述抽象语法树中的待统计信息包括:
获取所述抽象语法树中与所述定时器函数对应的第二类型的表达式文件;
对所述第二类型的表达式文件进行统计,以确定所述定时器函数的函数名称以及所述定时器函数在所述抽象语法树中的位置信息。
8.根据权利要求7所述的监测方法,其特征在于,所述定时器函数包括单次定时器函数,所述单次定时器函数包括第一单次定时器函数和第二单次定时器函数,所述对所述第二类型的表达式文件进行统计,以确定所述定时器函数的函数名称以及所述定时器函数在所述抽象语法树中的位置信息包括:
获取所述第二类型的表达式文件包含的调用属性的第一属性值;
在所述第一属性值为标识符类型值的情况下,确定所述标识符类型值对应的函数为所述第一单次定时器函数;
在所述第一属性值为成员表达式类型值的情况下,确定所述成员表达式类型值对应的函数为所述第二单次定时器函数;
分别获取所述第一单次定时器函数和所述第二单次定时器函数的调用属性中的第二开始属性,并根据第二开始属性中的行属性和列属性的值分别确定所述第一单次定时器函数和所述第二单次定时器函数在所述抽象语法树中的行数和列数。
9.根据权利要求8所述的监测方法,其特征在于,所述定时器函数还包括循环定时器函数,所述对所述目标文件的待统计信息进行统计并保存包括:
分别将所述单次定时器函数和所述循环定时器函数的函数名称以及与每个定时器函数对应的位置信息拼接成对应的第二字符串和第三字符串;
将所述第二字符串和所述第三字符串发送至预设地址以保存。
10.根据权利要求7至9任意一项所述的监测方法,其特征在于,所述获取所述目标文件在所述抽象语法树中的待统计信息还包括:
在确定所述抽象语法树中包含有所述定时器函数的情况下,检测所述定时器函数是否存在对应的取消函数;
在检测到所述定时器函数存在对应的取消函数的情况下,获取所述取消函数对应的函数名称,以及所述取消函数所在的行数和列数。
11.根据权利要求2所述的监测方法,其特征在于,所述目标事件包括监听事件,所述获取所述目标文件在所述抽象语法树中的待统计信息包括:
获取所述抽象语法树中与所述监听事件对应的第三类型的表达式文件;
对所述第三类型的表达式文件进行统计,以确定所述监听事件的事件名称以及所述监听事件在所述抽象语法树中的位置信息。
12.根据权利要求11所述的监测方法,其特征在于,所述监听事件包括第一类型监听事件和第二类型监听事件;所述对所述第三类型的表达式文件进行统计,以确定所述监听事件的事件名称以及所述监听事件在所述抽象语法树中的位置信息包括:
获取所述第三类型的表达式文件包含的调用属性中的第三开始属性;
分别获取所述第一类型监听事件和第二类型监听事件对应的第三开始属性,并根据第三开始属性中的行属性和列属性的值分别确定所述第一类型监听事件和所述第二类型监听事件在所述抽象语法树中的行数和列数。
13.根据权利要求12所述的监测方法,其特征在于,所述对所述目标文件的待统计信息进行统计并保存包括:
分别将所述第一类型监听事件和所述第二类型监听事件的事件名称以及与每个监听事件对应的位置信息拼接成对应的第四字符串和第五字符串;
将所述第四字符串和所述第五字符串发送至预设地址以保存。
14.根据权利要求11至13任意一项所述的监测方法,其特征在于,所述获取所述目标文件在所述抽象语法树中的待统计信息还包括:
在确定所述抽象语法树中包含有所述监听事件的情况下,检测所述监听事件是否存在对应的解绑函数;
在检测到所述监听事件存在对应的解绑函数的情况下,获取所述解绑函数对应的函数名称,以及所述解绑函数所在的行数和列数。
15.根据权利要求1所述的监测方法,其特征在于,所述对所述源执行文件进行转换,以确定所述源执行文件对应的抽象语法树包括:
通过预设数据库将所述源执行文件转换为对应的抽象语法树。
16.一种处理器,其特征在于,被配置成执行根据权利要求1至15中任意一项所述的用于网站内存泄露的监测方法。
17.一种用于网站内存泄露的监测装置,其特征在于,包括根据权利要求16所述的处理器。
18.一种机器可读存储介质,该机器可读存储介质上存储有指令,其特征在于,该指令在被处理器执行时使得所述处理器被配置成执行根据权利要求1至15中任一项所述的用于网站内存泄露的监测方法。
19.一种计算机程序产品,包括计算机程序,其特征在于,所述计算机程序在被处理器执行时实现根据权利要求1至15中任一项所述的用于网站内存泄露的监测方法。
CN202111272872.XA 2021-10-29 2021-10-29 用于网站内存泄露的监测方法、装置、存储介质及处理器 Pending CN113986739A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111272872.XA CN113986739A (zh) 2021-10-29 2021-10-29 用于网站内存泄露的监测方法、装置、存储介质及处理器

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111272872.XA CN113986739A (zh) 2021-10-29 2021-10-29 用于网站内存泄露的监测方法、装置、存储介质及处理器

Publications (1)

Publication Number Publication Date
CN113986739A true CN113986739A (zh) 2022-01-28

Family

ID=79744490

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111272872.XA Pending CN113986739A (zh) 2021-10-29 2021-10-29 用于网站内存泄露的监测方法、装置、存储介质及处理器

Country Status (1)

Country Link
CN (1) CN113986739A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117631597A (zh) * 2024-01-25 2024-03-01 山东科技大学 复杂工业系统下多控制器的柔性编程方法

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117631597A (zh) * 2024-01-25 2024-03-01 山东科技大学 复杂工业系统下多控制器的柔性编程方法
CN117631597B (zh) * 2024-01-25 2024-04-19 山东科技大学 复杂工业系统下多控制器的柔性编程方法

Similar Documents

Publication Publication Date Title
US9256517B1 (en) Display of aggregated stack traces in a source code viewer
CN106656536B (zh) 一种用于处理服务调用信息的方法与设备
CN110941528B (zh) 一种基于故障的日志埋点设置方法、装置及系统
CN107066519B (zh) 一种任务检测方法及装置
CN110162512B (zh) 一种日志检索方法、装置及存储介质
CN108038039B (zh) 记录日志的方法及微服务系统
WO2017107808A1 (zh) 针对混淆脚本语言的定位方法和系统
CN107147645B (zh) 网络安全数据的获取方法及装置
CN114968807A (zh) 代码检测方法、装置、电子设备及可读存储介质
US20120054724A1 (en) Incremental static analysis
CN117093224A (zh) 一种支持TypeScript智能感知的代码编辑方法、设备及介质
CN113986739A (zh) 用于网站内存泄露的监测方法、装置、存储介质及处理器
CN111314535A (zh) 手机质检过程记录方法及设备
CN109558548B (zh) 一种消除css样式冗余的方法及相关产品
CN113238737A (zh) 页面打包方法、装置、电子设备及存储介质
CN110045952B (zh) 代码调用方法与装置
CN111435327B (zh) 一种日志记录的处理方法、装置及系统
CN114895975B (zh) 一种服务端系统的预热方法及设备
US9424164B2 (en) Memory error tracking in a multiple-user development environment
CN110968500A (zh) 一种测试用例的执行方法及装置
CN115659045A (zh) 用户操作的识别方法、装置、存储介质以及电子设备
CN110750271B (zh) 服务聚合、聚合服务的执行方法、装置和电子设备
CN112162954A (zh) 用户操作日志生成、路径的定位方法、装置、设备及介质
CN110647473A (zh) 自动化回归测试的抗干扰方法、装置、计算机设备及存储介质
CN111488230A (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