CN114490440A - 内存对象引用分析方法、装置、设备和存储介质 - Google Patents

内存对象引用分析方法、装置、设备和存储介质 Download PDF

Info

Publication number
CN114490440A
CN114490440A CN202210133029.1A CN202210133029A CN114490440A CN 114490440 A CN114490440 A CN 114490440A CN 202210133029 A CN202210133029 A CN 202210133029A CN 114490440 A CN114490440 A CN 114490440A
Authority
CN
China
Prior art keywords
memory
memory object
information
query request
serialization
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
CN202210133029.1A
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.)
Shenzhen Tencent Domain Computer Network Co Ltd
Original Assignee
Shenzhen Tencent Domain Computer 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 Shenzhen Tencent Domain Computer Network Co Ltd filed Critical Shenzhen Tencent Domain Computer Network Co Ltd
Priority to CN202210133029.1A priority Critical patent/CN114490440A/zh
Publication of CN114490440A publication Critical patent/CN114490440A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/16Protection against loss of memory contents
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本申请涉及一种内存对象引用分析方法、装置、计算机设备、存储介质和计算机程序产品,方法可以在获取内存对象查询请求后,查找内存对象地址信息;根据内存对象地址信息,采用套接字连接方式访问内存监测对象;获取内存监测对象反馈的内存对象序列化信息;对内存对象序列化信息进行反序列化处理,获取内存对象查询请求对应的内存对象引用信息;根据内存对象引用信息生成内存对象引用分析信息。本申请的内存对象引用分析方法可以通过套接字连接从内存监测对象获取内存对象序列化信息,从而反序列化得到对应的内存对象引用关系,实现内存监测对象运行过程中的内存对象引用关系识别与展示,从而进行更深入的内存对象引用分析。

Description

内存对象引用分析方法、装置、设备和存储介质
技术领域
本申请涉及计算机技术领域,特别是涉及一种内存对象引用分析方法、装置、计算机设备、存储介质和计算机程序产品。
背景技术
随着计算机技术的发展,面向对象的软件开发方法也随之出现并得到不断发展。通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。同时,面向对象能有效提高编程的效率,通过封装技术,消息机制可以像搭积木一样快速开发出一个全新的系统。面向对象是指一种程序设计范型,同时也是一种程序开发的方法。对象是类的具体化实现。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。例如在游戏开发领域,可以通过面向对象的游戏引擎作为开发工具来进行游戏应用的开发。
在目前的游戏应用开发中,针对内存对象资源的占用情况分析,一般可以通过引擎自带的控制台命令来输出内存报告,开发人员可以基于内存报告来分析游戏运行时内存占用详情数据。然而这种内存报告仅仅包含内存占用的相关数据,无法进行更为深入的内存分析。
发明内容
基于此,有必要针对上述技术问题,提供一种能够深入进行内存分析的内存对象引用分析方法、装置、计算机设备、存储介质和计算机程序产品。
第一方面,本申请提供了一种内存对象引用分析方法。所述方法包括:
获取内存对象查询请求,查找所述内存对象查询请求对应的内存对象地址信息;
激活预加载的编辑器工具应用,以根据所述内存对象地址信息,通过采用套接字连接方式从预加载的待监测应用中获取内存对象序列化信息;
对所述内存对象序列化信息进行反序列化处理,获取所述内存对象查询请求对应的内存对象引用信息;
根据所述内存对象引用信息生成内存对象引用分析信息。
第一方面,本申请提供了另一种内存对象引用分析方法。所述方法包括:
获取内存对象查询请求,查找所述内存对象查询请求对应的内存对象地址信息;
根据所述内存对象地址信息,采用套接字连接方式访问内存监测对象;
获取所述内存监测对象反馈的内存对象序列化信息;
对所述内存对象序列化信息进行反序列化处理,获取所述内存对象查询请求对应的内存对象引用信息;
根据所述内存对象引用信息生成内存对象引用分析信息。
第三方面,本申请还提供了一种内存对象引用分析装置。所述装置包括:
请求获取模块,用于获取内存对象查询请求,查找所述内存对象查询请求对应的内存对象地址信息;
对象访问模块,用于根据所述内存对象地址信息,采用套接字连接方式访问内存监测对象;
序列化信息获取模块,用于获取所述内存监测对象反馈的内存对象序列化信息;
反序列化处理模块,用于对所述内存对象序列化信息进行反序列化处理,获取所述内存对象查询请求对应的内存对象引用信息;
信息展示模块,用于根据所述内存对象引用信息生成内存对象引用分析信息。
第四方面,本申请还提供了一种计算机设备。所述计算机设备包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
获取内存对象查询请求,查找所述内存对象查询请求对应的内存对象地址信息;
根据所述内存对象地址信息,采用套接字连接方式访问内存监测对象;
获取所述内存监测对象反馈的内存对象序列化信息;
对所述内存对象序列化信息进行反序列化处理,获取所述内存对象查询请求对应的内存对象引用信息;
根据所述内存对象引用信息生成内存对象引用分析信息。
第五方面,本申请还提供了一种计算机可读存储介质。所述计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
获取内存对象查询请求,查找所述内存对象查询请求对应的内存对象地址信息;
根据所述内存对象地址信息,采用套接字连接方式访问内存监测对象;
获取所述内存监测对象反馈的内存对象序列化信息;
对所述内存对象序列化信息进行反序列化处理,获取所述内存对象查询请求对应的内存对象引用信息;
根据所述内存对象引用信息生成内存对象引用分析信息。
第六方面,本申请还提供了一种计算机程序产品。所述计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现以下步骤:
获取内存对象查询请求,查找所述内存对象查询请求对应的内存对象地址信息;
根据所述内存对象地址信息,采用套接字连接方式访问内存监测对象;
获取所述内存监测对象反馈的内存对象序列化信息;
对所述内存对象序列化信息进行反序列化处理,获取所述内存对象查询请求对应的内存对象引用信息;
根据所述内存对象引用信息生成内存对象引用分析信息。
上述内存对象引用分析方法、装置、计算机设备、存储介质和计算机程序产品,其中方法可以在获取内存对象查询请求后,查找内存对象查询请求对应的内存对象地址信息;根据内存对象地址信息,采用套接字连接方式访问内存监测对象;获取内存监测对象反馈的内存对象序列化信息;对内存对象序列化信息进行反序列化处理,获取内存对象查询请求对应的内存对象引用信息;根据内存对象引用信息生成内存对象引用分析信息。本申请的内存对象引用分析方法可以通过套接字连接从内存监测对象获取内存对象序列化信息,从而反序列化得到对应的内存对象引用关系,实现内存监测对象运行过程中的内存对象引用关系识别与展示,从而进行更深入的内存对象引用分析。
附图说明
图1为一个实施例中内存对象引用分析方法的流程示意图;
图2为另一个实施例中内存对象引用分析方法的流程示意图;
图3为一个实施例中获取内存对象序列化信息步骤的过程示意图;
图4为一个实施例中根据内存引用信息获取请求反馈内存对象序列化信息步骤的过程示意图;
图5为一个实施例中生成内存对象序列化信息步骤的过程示意图;
图6为一个实施例中对内存对象进行写在处理步骤的流程示意图;
图7为一个实施例中用户端使用内存对象引用分析方法的流程示意图;
图8为另一个实施例中内存对象引用分析方法的流程框图;
图9为一个实施例中内存对象引用分析装置的结构框图;
图10为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
在本文中,需要理解的是,所涉及的术语:
UE:虚幻引擎(Unreal Engine)是一款非常流行的游戏开发工具,可以用来开发端游、手游和主机游戏等不同类型的游戏。
编辑器工具:指集成于游戏引擎编辑器的工具,便于用户做资源操作、配置调整和数据分析等工作。
运行时:指游戏运行时的程序环境。
内存引用:指不同数据对象间的内存依赖关系。
UObject:UE管理的内存对象类型。
Lua:一个简洁、轻量、可扩展的脚本语言。
Socket:即套接字,是网络中不同机器进程间双向通信的端点。
序列化:将内存对象的信息转换为可存储或传输的形式的过程。
反序列化:序列化的逆过程
adb:全称为安卓调试桥(Android Debug Bridge),是一个用于调试Android设备的PC端命令行工具。
Json:是一种轻量级的数据交换格式,易于阅读,同时也易于解析和生成。
在一个实施例中,如图1所示,提供了一种内存对象引用分析方法,本实施例以该方法应用于终端进行举例说明,可以理解的是,该方法也可以应用于服务器,还可以应用于包括终端和服务器的系统,并通过终端和服务器的交互,或终端和终端的交互实现。当通过单一的终端实现时,该方法包括以下步骤:
步骤102,获取内存对象查询请求,查找内存对象查询请求对应的内存对象地址信息。
其中,内存对象查询请求由用户向终端提交,用于对查询指定的内存对象相关的引用关系信息。本申请的内存对象引用分析方法,具体应用于基于面向对象开发的待监测应用。面向对象是指一种程序设计范型,同时也是一种程序开发的方法。对象是类的具体化实现。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。本申请可以通过终端的操作页面显示待监测应用在运行过程的所有对象列表。用户可以通过点击页面内对象列表中的内存对象,来向终端发起该内存对象对应的内存对象查询请求。内存对象地址信息即是指内存对象在待检测应用中的内存地址。待检测应用可以根据内存对象地址信息查找到用户所请求的目标内存对象,而后识别出查找到的目标内存对象所对应的内存对象引用信息。在其中一个实施例中,本申请的内存对象引用分析方法可以用于展示终端上运行中游戏的内存对象应用关系。
具体地,本申请的内存对象引用分析方法通过在待监测应用的运行过程中,识别出待监测应用中每一个对象对应的引用关系,而后讲这些内存对象引用分析出来,用户可以根据展示的内存对象引用关系,对待监测应用运行过程中的对象内存进行更深入地分析,从而实现对待监测应用的优化处理。首先需要启动待监测应用,在待监测应用的运行过程中,可以在终端的显示器上显示待监测应用运行时的所有对象列表。用户可以在终端查询以及选定需要展示的目标内存对象,而后生成内存对象查询请求。终端接收到内存对象查询请求后,基于待监测应用的预设信息,查找到内存对象查询请求对应的内存对象地址信息。
步骤104,激活预加载的编辑器工具应用,以根据内存对象地址信息,通过采用套接字连接方式从预加载的待监测应用中获取内存对象序列化信息。
其中,编辑器工具应用是指用于展示内存对象引用关系信息的应用,终端上可以预加载编辑器工具应用与待监测应用,用户可以通过编辑器工具应用来对待检测应用的内存对象引用信息进行展示。待监测应用即为内存对象引用分析的目标内存对象所在的应用。本申请的内存对象引用分析方法可以在待监测应用运行过程中,通过编辑器工具应用展示待监测应用中的内存对象引用关系,从而帮助用户深入了解待监测应用在运行过程中的内存占用信息。套接字连接即Socket连接,套接字是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。内存对象序列化信息是指经过序列化处理后的内存对象引用信息,由于内存对象的信息在待监测应用中一般为不可移动,因此可以通过序列化将内存对象的信息转换为可存储或传输的形式。本申请的方案主要实现终端上预加载的编辑器工具应用与预加载的待监测应用之间的连接。其中编辑器工具应用与待监测应用可以在同一个终端上运行,也可以在不同终端上运行。而序列化就是指把内存对象转换为字节序列的过程,得到的内存对象序列化信息具体可以为JSON(JavaScript Object Notation,JS对象简谱)格式的文件,内存对象序列化信息中具体包括内存对象名称、类型、地址、路径以及引用信息等信息。序列化主要用于在传递和保存对象时,保证对象的完整性和可传递性。通过序列化将对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
具体地,在确定内存对象地址信息,终端可以控制预加载的编辑器工具应用基于内存对象地址信息生成相应的查询信息,而后通过套接字连接,将查询信息输入到预加载且正在运行的待监测应用中,从待监测应用中得到相应的内存对象序列化信息。在其中一个实施例中,本申请中的待监测应用具体为基于游戏引擎开发的游戏应用,此时编辑器工具应用可以集成在游戏引擎上,从而实现游戏开发过程中的内存对象引用监测。
步骤106,对内存对象序列化信息进行反序列化处理,获取内存对象查询请求对应的内存对象引用信息。
步骤108,根据内存对象引用信息生成内存对象引用分析信息。
其中,反序列化则与序列化相对,是指把字节序列恢复为内存对象的过程。反序列化可以根据内存对象序列化信息中保存的对象状态及描述信息,通过反序列化重建对象,得到内存对象引用信息。内存对象引用分析信息则具体是指将待监测应用中目标内存对象相关的引用关系,用比较直观的方式展示给用户,例如通过引用关系图或者文件夹树形结构的方式来展示内存对象的引用关系。
具体地,当从待监测应用中得到内存对象序列化信息后,为了将这些内存对象序列化信息展示出来,需要将这些序列化信息还原为内存对象引用信息。此时,可以对内存对象序列化信息进行反序列化处理,从而将内存对象序列化信息解析为可用的内存对象引用信息。而在得到内存对象引用信息后,为了更直观的向用户展示当前目标内存对象的引用信息,可以根据内存对象引用信息生成内存对象查询请求对应的内存对象引用分析信息,以内存对象引用分析信息的形式,来向用户展示该目标内存对象在待监测应用运行过程中涉及到的引用关系。
如上,终端上可以同时运行有预加载的内存监测对象以及预加载的编辑器工具应用。如内存监测对象为移动端游戏的情况,可以通过模拟器在电脑终端上运行该移动端游戏,同时在电脑终端上加载编辑器工具应用,而后建立预加载的编辑器工具应用与预加载的内存监测对象之间的套接字连接,基于套接字连接进行两个应用之间的通信。而在另一个实施例中,本申请的方案还可以通过终端之间的交互来实现,例如将编辑器工具应用运行在电脑端,而将待监测应用运行在手机端,而后通过套接字连接来实现两个终端之间的通信,此时,本申请的方法可以应用于电脑端,如图2所示,该方法包括以下步骤:
步骤201,获取内存对象查询请求,查找内存对象查询请求对应的内存对象地址信息。
步骤203,根据内存对象地址信息,采用套接字连接方式访问内存监测对象。
步骤205,获取内存监测对象反馈的内存对象序列化信息。
步骤207,对内存对象序列化信息进行反序列化处理,获取内存对象查询请求对应的内存对象引用信息。
步骤209,根据内存对象引用信息生成内存对象引用分析信息。
具体地,上述方法具体在电脑端,通过编辑器工具应用来实现,当移动终端上的待监测应用运行后,用户可以在预加载的编辑器工具应用中查询目标对象,也可以直接在编辑器工具应用的所有对象列表中点击目标应用。当点击后,编辑器工具应用获取到内存对象查询请求,而后查找内存对象查询请求对应的内存对象地址信息。并根据内存对象地址信息生成查询请求,通过套接字连接,访问内存监测对象即待监测应用,并将生成的查询请求发送到内存监测对象中,以从内存监测对象中获取内存对象序列化信息。而后对内存对象序列化信息进行反序列化处理,从而获取内存对象查询请求对应的内存对象引用信息;最终在根据内存对象引用信息生成内存对象查询请求对应的内存对象引用分析信息,加载该内存对象引用分析信息,将待监测应用运行过程中目标内容对象相关的内存对象引用分析给到用户。
上述内存对象引用分析方法,其中方法可以在获取内存对象查询请求后,查找内存对象查询请求对应的内存对象地址信息;根据内存对象地址信息,采用套接字连接方式访问内存监测对象;获取内存监测对象反馈的内存对象序列化信息;对内存对象序列化信息进行反序列化处理,获取内存对象查询请求对应的内存对象引用信息;根据内存对象引用信息生成内存对象引用分析信息。本申请的内存对象引用分析方法可以通过套接字连接从内存监测对象获取内存对象序列化信息,从而反序列化得到对应的内存对象引用关系,实现内存监测对象运行过程中的内存对象引用关系识别与展示,从而进行更深入的内存对象引用分析。
在其中一个实施例中,步骤103之前,还包括:构建预加载的编辑器工具应用与预加载的待监测应用的数据转发关系。基于数据转发关系构建套接字客户端。基于套接字客户端构建预加载的编辑器工具应用与预加载的待监测应用的套接字连接。
其中,为了建立预加载的编辑器工具应用与预加载的待监测应用之间的套接字连接,需要预先建立套接字客户端,通过套接字客户端来实现编辑器工具应用与待监测应用之间的数据转发关系。因此,在通过套接字连接从预加载的待监测应用获取内存对象序列化信息之前,需要预先构建起套接字客户端。而为了建立套接字客户端,还需要在待监测应用来监测套接字连接。
具体地,当待监测应用运行后,可以监测本地端口连接,确定是否存在套接字连接。而待监测应用运行后,如果要建立起编辑器工具应用与待监测应用之间的套接字连接,可以先建立构建预加载的编辑器工具应用与预加载的待监测应用的数据转发关系,应用之间的数据转发关系具体是指应用所在终端之间的数据转发关系,如待监测应用运行在移动终端A,而编辑器工具应用则运行在电脑终端B,当待监测应用在移动终端A上运行,并启动套接字连接监测后。终端可以在编辑器工具应用上构建起移动终端A的端口与电脑终端B的端口之间的数据转发关系。在其中一个实施例中,数据转发关系具体可以通过adb(AndroidDebug Bridge,安卓调试桥)forward建立。然后即可基于数据转发关系构建套接字客户端;从而构建预加载的编辑器工具应用与预加载的待监测应用的套接字连接。在一个具体的实施例中,本申请的编辑器工具应用集成于用于游戏开发的虚幻引擎上,虚幻引擎运行于电脑,而待监测应用具体可以为移动端游戏。当游戏开发人员需要确定移动端游戏的内存对象引用关系时,可以通过USB(Universal Serial Bus,通用串行总线)数据线将电脑与手机连接,手机启动该移动端游戏后,会监测本地端口连接。而在手机启用Socket监测后,编辑器工具应用通过adb forward建立电脑端口与手机端口的数据转发关系,然后通过虚幻引擎的Socket系统ISocketSubsystem建立Socket客户端,并连接到手机端的待监测应用。本实施例中,通过预先构建数据转发关系,进而出构建套接字客户端,从而可以有效实现预加载的编辑器工具应用与预加载的待监测应用的套接字连接,有利于保证内存对象序列化信息转发的效率。
在其中一个实施例中,如图3所示,步骤203包括:
步骤302,根据内存对象地址信息,生成内存引用信息获取请求。
步骤304,采用套接字连接方式发送内存引用信息获取请求至内存监测对象。
其中,内存引用信息获取请求在编辑器工具应用端生成,用于向内存监测对象请求内存引用信息。
具体地,在建立套接字客户端之后,即可以通过套接字连接来连接已经处于运行状态的内存监测对象以及编辑器工具应用。而当内存监测对象通过套接字连接得到内存引用信息获取请求后,即可从内存引用信息获取请求中提取得到内存对象地址信息,而后根据内存对象地址信息来查找对应的内存对象引用信息,并在对这些信息进行序列化后,通过套接字连接将得到的内存对象序列化信息反馈给编辑器工具应用,以便让编辑器工具应用可以根据内存对象序列化信息来进行后续过程的内存对象引用分析。本实施例中,通过生成内存引用信息获取请求的方式,来进行预加载的编辑器工具应用与预加载的内存监测对象的信息交流,可以有效地从预加载的内存监测对象中得到内存对象序列化信息,从而实现内存对象引用关系的展示。
在其中一个实施例中,如图4所示,内存对象序列化信息由内存监测对象通过以下方式得到:
步骤401,获取内存引用信息获取请求中的内存对象地址信息。
步骤403,查找内存对象地址数据所指向的目标内存对象。
步骤405,获取目标内存对象对应的内存对象引用信息。
步骤407,对内存对象引用信息进行序列化处理,获取内存对象序列化信息。
具体地,在目标内存对象端,其可以通过套接字连接来获取内存引用信息获取请求。而后提取出内存引用信息获取请求中的内存对象地址信息,基于内存对象地址信息,在运行中的内存监测对象内定位到该内存对象地址信息所指向的内存对象,并基于该内存对象来查找相应的内存对象引用信息,这些内存对象引用信息具体包括了内存对象之间的引用信息以及脚本引用内存对象的引用信息。当得到这些数据后,为了将这些数据转化出去,可以先将得到的内存对象引用信息进行序列化处理,例如将内存对象引用信息序列化处理为JSON数据,得到的JSON数据中主要包含内存对象名称、类型、地址、路径以及引用信息等内容。而后通过套接字连接将内存对象序列化信息发送到编辑器工具应用,而后由编辑器工具来对内存对象序列化信息进行进一步地处理。而终端可以直接得到处理得到的内存对象序列化信息。本实施例中,内存监测对象可以接收内存引用信息获取请求,从而查找到内存对象地址数据所指向的内存对象,并得到相应的内存对象引用信息,可以有效保证内存对象引用分析过程的顺利进行,保证内存对象引用分析的有效性。
在其中一个实施例中,内存对象引用信息包括内存对象间的第一引用关系信息以及脚本对内存对象的第二引用关系信息,目标内存对象对应的内存对象引用信息通过以下方式得到:通过预设查询接口,以多线程的方式,收集目标内存对象对应的第一引用关系信息;查找脚本环境中的表,并递归遍历脚本环境中的表,以获取目标内存对象对应的第二引用关系信息。
其中,预设查询接口具体是指由的内存监测对象的开发工具所提供的查询接口,用于进行内容查询。例如在其中一个实施例中,内存监测对象为基于虚幻引擎开发的移动端游戏,此时预设查询接口具体为FReferencerFinder::GetAllReferencers接口。它可以以多线程的方式收集内存对象间的引用关系信息。而递归遍历具体是指以递归的方式循环遍历对象。递归就是程序在运行的过程中调用自己。而遍历是指沿着某条搜索路线,依次对树(或图)中每个节点均做一次访问。访问结点所做的操作依赖于具体的应用问题,具体的访问操作可能是检查节点的值、更新节点的值等。不同的遍历方式,其访问节点的顺序是不一样的。遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。通过递归遍历可以有效地查询出脚本环境中的表内,脚本对内存对象的引用关系信息。脚本中的表即table,它是脚本中的一种数据结构,可以作为数组或者字典来使用。
具体地,在内存监测对象中收集内存对象引用信息时,具体可以将引用信息分为内存对象间的引用关系信息以及脚本对内存对象的引用关系信息两种数据来进行收集。其中,对于内存对象之间的引用关系信息,可以通过查询接口来获取,例如通过虚幻引擎提供的FReferencerFinder::GetAllReferencers接口,可以以多线程的方式收集内存对象间的引用关系信息。而对于脚本对内存对象的引用关系信息,这些数据一般会被保存在脚本的表中,因此可以通过递归遍历预加载的内存监测对象对应的脚本中的表,以获取内存对象地址数据所指向的内存对象对应的脚本对内存对象的引用关系信息。例如对于Lua的脚本环境。可以通过递归遍历Lua环境中的表,可以获取持有目标内存对象的所有表,从而得到Lua对内存对象的引用信息。本申请的实施例中,通过查询接口的方式来进行数据查询可以高效地得到内存对象间的引用关系信息,同时通过递归遍历来查找脚本中的表。可以高效地得到脚本对内存对象的引用关系信息。综合两者即可得到内存对象引用信息。
在其中一个实施例中,内存对象引用分析信息包括内存引用关系图。
如图5所示,步骤209具体包括:
步骤502,根据内存对象引用信息,获取内存对象查询请求对应目标内存对象,确定目标内存对象涉及的被引用内存对象、内存对象间的引用关系、以及引用关系图构造类。
步骤504,将目标内存对象作为根节点,根据内存对象间的引用关系识别被引用内存对象的节点类型。
步骤506,根据节点类型以及引用关系图构造类生成内存对象查询请求对应的内存引用关系图。
其中,内存引用关系图中通过节点来展示内存对象,每一个节点都代表一个内存对象,同时通过节点之间的连接来展示内容对象之间的引用关系。引用关系图构造类是指用于构造内存引用关系图的主要类,通过这些引用关系图构造类来实现包括节点的绘制,节点间的连线的绘制和关系图显示深度配置等在内的内存引用关系图构造。在其中一个具体的实施例中,内存监测对象具体位置基于虚幻引擎开发的移动端游戏,此时,引用关系图构造类具体包括一下几个类,UEdGraph_MemoryReferenceViewer:继承自UE的类UEdGraph,负责构造图的节点以及节点间的引用关系,同时也负责关系图节点布局的构造。UEdGraphNode_MemoryReference:继承自UE的类UEdGraphNode,负责描述图节点的数据结构,可以用于展示内存对象的信息。UMemoryReferenceViewerSchema:继承自UE的类UEdGraphSchema,负责描述图节点间连线的绘制方式、连线的操作行为以及节点的上下文操作菜单等。UMemoryReferenceSearchConfig:负责存储搜索配置的信息,比如忽略搜索的类型和搜索深度等,可用于关系图的构造。SMemoryReferenceNode:继承自UE的类SGraphNode,负责描述单个节点信息的展示布局。SMemoryReferenceViewer:负责描述整个内存引用关系分析工具窗口的UI整体布局,包括搜索配置、搜索列表和引用关系图等。
具体地,当通过反序列化得到内存对象引用信息后,可以进一步地根据这些内存对象引用信息,来构建内存引用关系图。当用户确定内存监测对象中的一个目标内存对象后,通过本申请的方法可以得到目标内存对象对应的内存对象引用信息。从而获取到内存对象引用涉及的被引用内存对象、内存对象间的引用关系以及引用关系图构造类。而后即可将用户选定的目标内存对象作为根节点,从根节点开始来构造内存引用关系图,基于内存对象间的引用关系来识别这些被引用内存对象的节点类型,确定他们是不是叶节点,在进行内存引用关系图的布局计算时,从选择的根节点开始,递归的计算每个节点的高度系数。如果该节点为叶子节点,那么高度系数为1,否则该节点的高度系数为其子节点的高度系数之和。同时,从选择的根节点开始,递归的构造内存引用关系的节点结构。节点的宽度位置根据所处的深度以一定系数做偏移,节点的高度偏移位置根据当前父节点的高度系数以及兄弟节点的高度系数累计值计算。其中,高度偏移位置为:(当前已计算的兄弟节点的高度系数累计值–(父节点高度系数/2))。本实施例中,通过内存引用关系图来展示基于目标内存对象的引用关系,可以有效地帮助用户进行内存监测对象运行过程中对象内存分析,保证内存分析的效果。
在其中一个实施例中,如图6所示,步骤108之后,还包括:
步骤601,获取根据内存对象引用分析信息识反馈的对象卸载信息。
步骤603,根据对象卸载信息生成对象卸载请求;
步骤605,发送对象卸载请求至内存监测对象。
具体地,在应用运行过程中,会出现一些内存占用较大,且理应卸载的内存对象,因为无法确定是哪些内存对象引用关系导致其没有被卸载,难以确定产生引用关系的原因,所以难以减少应用运行时内存占用。而通过本申请的内存对象引用分析方法,可以生成内存对象对应的引用信息,因此用户可以基于内存对象引用分析信息,更方便定位理应卸载的内存对象还存在于内存的原因,便于卸载不必要的内存对象,提高内存监测对象的运行效率。终端可以获取根据内存对象引用分析信息识反馈的对象卸载信息。而后根据对象卸载信息生成对象卸载请求;并发送对象卸载请求至内存监测对象。完成内存监测对象内的对象卸载处理。本实施例中,通过对象卸载信息对预加载的内存监测对象中的对应内存对象进行卸载处理,可以有效地提高预加载的内存监测对象的运行效率。
本申请还提供一种应用场景,该应用场景应用上述的内存对象引用分析方法。具体地,该内存对象引用分析方法该应用场景的应用如下:
当用户在通过虚幻引擎来开发移动端游戏时,为了保证游戏运行流畅性,可以在游戏运行过程中,通过本申请的内存对象引用分析方法来对内存对象之间。其中移动端游戏被设置于移动终端,移动端游戏内集成有数据收集模块,移动终端通过USB线与电脑端连接,电脑端上运行有编辑器工具模块,该编辑器工具模块被集成在游戏开发引擎上,本申请的内存对象引用分析方法可以通过数据收集模块与编辑器工具模块来实现。其整体的使用流程可以参照图7所示,首先,使用USB线将电脑端与移动终端连接,而后在移动终端上启动游戏,同时在电脑端启动编辑器工具模块,既可在编辑器工具模块的界面上显示游戏运行过程中的内存对象。用户可以在编辑器工具模块的页面上输入一个需要查询的内存对象,然后界面跳转到这个内存对象处,用户可以通过点击这个内存对象启动内存对象引用分析方法,而后本申请可以基于用户选定的内存对象查找相应的内存对象引用信息,并通过引用关系图来进行对象相关引用关系的展示。对于脚本Lua引用的对象,用户可以右键对象节点,选择ShowLuaReferences,便可以展示Lua表对内存对象的引用。其中对于内存对象引用分析的完整过程可以参照图8所示,首先,在移动端游戏运行之后,数据收集模块启用服务器监测套接字连接:(1)通过USB数据线将电脑端与移动终端连接,移动终端启动游戏后,启用数据收集模块监测本地端口连接。Socket的创建使用UE的Socket系统ISocketSubsystem。(2)编辑器工具模块发起套接字连接请求:在数据收集模块启用套接字监测后,编辑器工具模块通过adb forward建立电脑端口与手机端口的数据转发关系,然后通过UE的ISocketSubsystem建立套接字客户端,并连接到手机端的数据收集模块。(3)编辑器工具模块请求内存引用信息:当需要查询某个对象的内存引用信息时,编辑器工具模块负责发起数据请求,并带上对象的内存地址信息。(4)数据收集模块接受请求内存引用请求:通过套接字连接,数据收集模块可以接受到编辑器工具模块发起的内存引用信息查找请求,然后执行内存引用信息的收集工作。(5)数据收集模块将内存引用信息序列化为Json数据:当数据收集模块收集完内存引用信息后,需要将数据发送到编辑器工具模块,为此需要将收集的内存引用信息序列化为Json数据格式。Json数据主要包含内存对象名称、类型、地址、路径以及引用信息等。(6)数据收集模块将Json数据发送到编辑器工具模块:数据收集模块将已序列化的内存引用Json数据通过套接字连接发送到编辑器工具模块。(7)编辑器工具模块接受Json数据:通过套接字连接,编辑器工具模块可以接收到数据收集模块发送的Json数据。(8)编辑器工具模块将Json数据反序列化为内存引用信息:当编辑器工具接受完Json数据后,需要解析Json数据,并把数据反序列化为可用的内存数据,可用于编辑器工具模块中内存引用关系图的构建。
应该理解的是,虽然如上的各实施例所涉及的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,如上的各实施例所涉及的流程图中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
基于同样的发明构思,本申请实施例还提供了一种用于实现上述所涉及的内存对象引用分析方法的内存对象引用分析装置。该装置所提供的解决问题的实现方案与上述方法中所记载的实现方案相似,故下面所提供的一个或多个内存对象引用分析装置实施例中的具体限定可以参见上文中对于内存对象引用分析方法的限定,在此不再赘述。
在一个实施例中,如图9所示,提供了一种内存对象引用分析装置,包括:
请求获取模块902,用于获取内存对象查询请求,查找内存对象查询请求对应的内存对象地址信息。
对象访问模块904,用于根据内存对象地址信息,采用套接字连接方式访问内存监测对象。
序列化信息获取模块906,用于获取内存监测对象反馈的内存对象序列化信息。
反序列化处理模块908,用于对内存对象序列化信息进行反序列化处理,获取内存对象查询请求对应的内存对象引用信息。
信息展示模块910,用于根据内存对象引用信息生成内存对象引用分析信息。
上述内存对象引用分析装置,可以在获取内存对象查询请求后,查找内存对象查询请求对应的内存对象地址信息;根据内存对象地址信息,采用套接字连接方式访问内存监测对象;获取内存监测对象反馈的内存对象序列化信息;对内存对象序列化信息进行反序列化处理,获取内存对象查询请求对应的内存对象引用信息;根据内存对象引用信息生成内存对象引用分析信息。本申请的内存对象引用分析方法可以通过套接字连接从内存监测对象获取内存对象序列化信息,从而反序列化得到对应的内存对象引用关系,实现内存监测对象运行过程中的内存对象引用关系识别与展示,从而进行更深入的内存对象引用分析。
在其中一个实施例中,对象访问模块904具体用于:根据内存对象地址信息,生成内存引用信息获取请求;采用套接字连接方式发送内存引用信息获取请求至内存监测对象。
在其中一个实施例中,内存对象序列化信息由内存监测对象通过以下方式得到:获取内存引用信息获取请求中的内存对象地址信息,查找内存对象地址数据所指向的目标内存对象,获取目标内存对象对应的内存对象引用信息,对内存对象引用信息进行序列化处理,获取内存对象序列化信息。
在其中一个实施例中,内存对象引用信息包括内存对象间的第一引用关系信息以及脚本对内存对象的第二引用关系信息;目标内存对象对应的内存对象引用信息通过以下方式得到:通过预设查询接口,以多线程的方式,收集目标内存对象对应的第一引用关系信息;查找脚本环境中的表,并递归遍历所述脚本环境中的表,以获取目标内存对象对应的第二引用关系信息。
在其中一个实施例中,内存对象引用分析信息包括内存引用关系图;信息展示模块1110具体用于:根据内存对象引用信息,获取内存对象查询请求对应目标内存对象,确定目标内存对象涉及的被引用内存对象、内存对象间的引用关系、以及引用关系图构造类;将目标内存对象作为根节点,根据内存对象间的引用关系识别被引用内存对象的节点类型;根据节点类型以及引用关系图构造类生成内存对象查询请求对应的内存引用关系图。
在其中一个实施例中,还包括对象卸载模块,用于:根据对象卸载信息生成对象卸载请求;发送对象卸载请求至内存监测对象。
上述内存对象引用分析装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图10所示。该计算机设备包括通过系统总线连接的处理器、存储器、通信接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的通信接口用于与外部的终端进行有线或无线方式的通信,无线方式可通过WIFI、移动蜂窝网络、NFC(近场通信)或其他技术实现。该计算机程序被处理器执行时以实现一种内存对象引用分析方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
本领域技术人员可以理解,图10中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,还提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各方法实施例中的步骤。
需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-OnlyMemory,ROM)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(ReRAM)、磁变存储器(Magnetoresistive Random Access Memory,MRAM)、铁电存储器(Ferroelectric Random Access Memory,FRAM)、相变存储器(Phase Change Memory,PCM)、石墨烯存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器等。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic RandomAccess Memory,DRAM)等。本申请所提供的各实施例中所涉及的数据库可包括关系型数据库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本申请所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。

Claims (10)

1.一种内存分析方法,其特征在于,所述方法包括:
获取内存对象查询请求,查找所述内存对象查询请求对应的内存对象地址信息;
激活预加载的编辑器工具应用,以根据所述内存对象地址信息,通过采用套接字连接方式从预加载的待监测应用中获取内存对象序列化信息;
对所述内存对象序列化信息进行反序列化处理,获取所述内存对象查询请求对应的内存对象引用信息;
根据所述内存对象引用信息生成内存对象引用分析信息。
2.一种内存分析方法,其特征在于,所述方法包括:
获取内存对象查询请求,查找所述内存对象查询请求对应的内存对象地址信息;
根据所述内存对象地址信息,采用套接字连接方式访问内存监测对象;
获取所述内存监测对象反馈的内存对象序列化信息;
对所述内存对象序列化信息进行反序列化处理,获取所述内存对象查询请求对应的内存对象引用信息;
根据所述内存对象引用信息生成内存对象引用分析信息。
3.根据权利要求2所述的方法,其特征在于,所述根据所述内存对象地址信息,采用套接字连接方式访问内存监测对象包括:
根据所述内存对象地址信息,生成内存引用信息获取请求;
采用套接字连接方式发送所述内存引用信息获取请求至所述内存监测对象。
4.根据权利要求3所述的方法,其特征在于:所述内存对象序列化信息由所述内存监测对象通过以下方式得到:获取所述内存引用信息获取请求中的内存对象地址信息,查找所述内存对象地址数据所指向的目标内存对象,获取所述目标内存对象对应的内存对象引用信息,对所述内存对象引用信息进行序列化处理,获取内存对象序列化信息。
5.根据权利要求4所述的方法,其特征在于,所述内存对象引用信息包括内存对象间的第一引用关系信息以及脚本对内存对象的第二引用关系信息;
所述获取所述目标内存对象对应的内存对象引用信息包括:
通过预设查询接口,以多线程的方式,收集所述目标内存对象对应的第一引用关系信息;
查找脚本环境中的表,并递归遍历所述脚本环境中的表,以获取所述目标内存对象对应的第二引用关系信息。
6.根据权利要求2所述的方法,其特征在于,所述内存对象引用分析信息包括内存引用关系图;
所述根据所述内存对象引用信息生成内存对象引用分析信息包括:
根据所述内存对象引用信息,获取内存对象查询请求对应目标内存对象,确定所述目标内存对象涉及的被引用内存对象、所述内存对象间的引用关系、以及引用关系图构造类;
将所述目标内存对象作为根节点,根据所述内存对象间的引用关系识别所述被引用内存对象的节点类型;
根据所述节点类型以及所述引用关系图构造类生成所述内存对象查询请求对应的内存引用关系图。
7.根据权利要求2所述的方法,其特征在于,所述根据所述内存对象引用信息生成内存对象引用分析信息之后,还包括:
获取根据所述内存对象引用分析信息识反馈的对象卸载信息;
根据所述对象卸载信息生成对象卸载请求;
发送所述对象卸载请求至所述内存监测对象。
8.一种内存对象引用分析装置,其特征在于,所述装置包括:
请求获取模块,用于获取内存对象查询请求,查找所述内存对象查询请求对应的内存对象地址信息;
对象访问模块,用于根据所述内存对象地址信息,采用套接字连接方式访问内存监测对象;
序列化信息获取模块,用于获取所述内存监测对象反馈的内存对象序列化信息;
反序列化处理模块,用于对所述内存对象序列化信息进行反序列化处理,获取所述内存对象查询请求对应的内存对象引用信息;
信息展示模块,用于根据所述内存对象引用信息生成内存对象引用分析信息。
9.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至7中任一项所述的方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至7中任一项所述的方法的步骤。
CN202210133029.1A 2022-02-14 2022-02-14 内存对象引用分析方法、装置、设备和存储介质 Pending CN114490440A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210133029.1A CN114490440A (zh) 2022-02-14 2022-02-14 内存对象引用分析方法、装置、设备和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210133029.1A CN114490440A (zh) 2022-02-14 2022-02-14 内存对象引用分析方法、装置、设备和存储介质

Publications (1)

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

Family

ID=81480070

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210133029.1A Pending CN114490440A (zh) 2022-02-14 2022-02-14 内存对象引用分析方法、装置、设备和存储介质

Country Status (1)

Country Link
CN (1) CN114490440A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20220247583A1 (en) * 2019-06-14 2022-08-04 Ailia Sa Method for the execution of an instance of a smart contract by means of a blockchain

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20220247583A1 (en) * 2019-06-14 2022-08-04 Ailia Sa Method for the execution of an instance of a smart contract by means of a blockchain
US11991298B2 (en) * 2019-06-14 2024-05-21 Ailia Sa Method for the execution of an instance of a smart contract by means of a blockchain

Similar Documents

Publication Publication Date Title
US10506043B2 (en) Rapid client-side component processing based on component relationships
US10656935B2 (en) Maintaining and updating software versions via hierarchy
US9652220B2 (en) Zero down-time deployment of new application versions
CN104346153A (zh) 用于翻译应用程序的文本信息的方法和系统
CN111966633B (zh) 用于查询目录下子节点的方法、装置、电子设备及介质
CN105740330B (zh) 分页展示数据的方法及装置
CN109857723B (zh) 基于可扩容数据库集群的动态数据迁移方法及相关设备
CN111475376A (zh) 处理测试数据的方法、装置、计算机设备和存储介质
CN108509544A (zh) 思维导图的获取方法及装置、设备及可读存储介质
US9411618B2 (en) Metadata-based class loading using a content repository
CN114490440A (zh) 内存对象引用分析方法、装置、设备和存储介质
JP6329329B2 (ja) コード・キャッシング・システム
US9798746B2 (en) Dynamic map template discovery and map creation
CN114328097A (zh) 一种文件监控方法、装置、电子设备和存储介质
CN113468445A (zh) 请求处理方法、装置、电子设备和计算机可读介质
US12001458B2 (en) Multi-cloud object store access
CN111858339A (zh) 内存分析方法、设备和系统以及计算设备、计算机可读存储介质
CN114567571B (zh) 性能测试方法、装置、电子设备和计算机可读存储介质
CN111001157B (zh) 引用信息的生成方法和装置、存储介质及电子装置
CN111881220B (zh) 列表存储下的数据操作方法、装置、电子设备和存储介质
CN114297202A (zh) 一种服务器实体信息交互方法、装置、设备以及存储介质
CN112114871A (zh) 一种代码共享方法、装置、服务器、终端及介质
CN110647331A (zh) 开发工具的获取方法及装置、存储介质、电子设备
JP3884239B2 (ja) サーバ計算機
CN114328272B (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