CN110334031B - 内存分配代码检测方法、装置、计算机设备及存储介质 - Google Patents

内存分配代码检测方法、装置、计算机设备及存储介质 Download PDF

Info

Publication number
CN110334031B
CN110334031B CN201910642148.8A CN201910642148A CN110334031B CN 110334031 B CN110334031 B CN 110334031B CN 201910642148 A CN201910642148 A CN 201910642148A CN 110334031 B CN110334031 B CN 110334031B
Authority
CN
China
Prior art keywords
code
memory allocation
intermediate language
instruction
position information
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
CN201910642148.8A
Other languages
English (en)
Other versions
CN110334031A (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.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen 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 Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201910642148.8A priority Critical patent/CN110334031B/zh
Publication of CN110334031A publication Critical patent/CN110334031A/zh
Application granted granted Critical
Publication of CN110334031B publication Critical patent/CN110334031B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

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/3624Software debugging by performing operations on the source code, e.g. via a compiler
    • 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
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

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)
  • Stored Programmes (AREA)

Abstract

本申请公开了一种内存分配代码检测方法、装置、计算机设备及存储介质,在该方案中,计算机设备在获取到待检测应用程序代码的中间语言代码后,在待检测中间语言代码中确定指令码为目标指令码的目标中间语言代码,最后通过确定目标中间语言代码对应的源码在待检测应用程序代码中的位置信息,即可确定内存分配代码在待检测应用程序代码中的位置信息。可见,该方案通过目标中间语言代码即可确定待检测应用程序中内存分配代码的位置信息。而且本申请提供的内存分配代码检测方法无需运行应用程序,也无需穷尽应用程序的每种操作情况,因此操作简便,也可以避免内存分配代码检测不全面的问题。

Description

内存分配代码检测方法、装置、计算机设备及存储介质
技术领域
本申请涉及数据处理技术领域,尤其涉及一种内存分配代码检测方法、装置、计算机设备及存储介质。
背景技术
应用程序在运行时通常会使用内存来存储数据,当被存储的数据不再被使用时,GC(Garbage Collection,垃圾回收)机制会将这些数据所占用的内存空间释放,以使这部分内存空间可以继续被使用。
在应用程序运行的过程中,如果内存分配操作过多或者过于频繁,就会触发垃圾回收,而垃圾回收会造成运行卡顿等不佳的表现,因此,如何在应用程序代码中检测出内存分配代码,是本领域技术人员需要解决的技术问题。
发明内容
有鉴于此,本申请提供了一种内存分配代码检测方法、装置、计算机设备及存储介质,以在在应用程序代码中检测出内存分配代码。
为实现上述目的,一方面,本申请提供了一种内存分配代码检测方法,包括:
获取待检测中间语言代码,所述待检测中间语言代码为对待检测应用程序代码进行编译得到的中间语言代码;
在所述待检测中间语言代码中确定指令码为目标指令码的目标中间语言代码;所述目标指令码为对应内存分配代码的指令码;
利用所述目标中间语言代码确定内存分配代码位置信息,所述内存分配代码位置信息为内存分配代码在所述待检测应用程序代码中的位置信息。
可选地,所述利用所述目标中间语言代码确定内存分配代码在所述待检测应用程序代码中的内存分配代码位置信息之后,还包括:
利用所述内存分配代码位置信息确定最后修改账号,所述最后修改账号为最后修改每行内存分配代码的账号;
向每个所述最后修改账号对应的代码编辑***发送相应的内存分配代码位置信息和内存分配代码修改指令,以使所述代码编辑***对所述内存分配代码进行修改。
可选地,所述向每个所述最后修改账号对应的代码编辑***发送内存分配代码修改指令与对应的内存分配代码位置信息,包括:
利用预设任务分发***的API向每个所述最后修改账号对应的代码编辑***发送内存分配代码修改指令与对应的内存分配代码位置信息。
可选地,所述利用所述目标中间语言代码确定内存分配代码位置信息,包括:
利用所述目标中间语言代码确定内存分配代码在所述待检测应用程序代码中的行号与所属的函数名。
又一方面,本申请提供了一种内存分配代码检测***,包括:
待检测中间语言代码获取模块,用于获取待检测中间语言代码;所述待检测中间语言代码为对待检测应用程序代码进行编译得到的中间语言代码;
目标中间语言代码确定模块,用于在所述待检测中间语言代码中确定指令码为目标指令码的目标中间语言代码;所述目标指令码为对应内存分配代码的指令码;
位置信息确定模块,用于利用所述目标中间语言代码确定内存分配代码位置信息,所述内存分配代码位置信息为内存分配代码在所述待检测应用程序代码中的位置信息。
又一方面,本申请还提供了一种计算机设备,包括:
处理器和存储器;
其中,所述处理器用于执行所述存储器中存储的程序;
所述存储器用于存储程序,所述程序至少用于:
获取待检测中间语言代码;其中,所述待检测中间语言代码为对待检测应用程序代码进行编译得到的中间语言代码;
在所述待检测中间语言代码中确定指令码为目标指令码的目标中间语言代码;其中,所述目标指令码为对应内存分配代码的指令码;
利用所述目标中间语言代码确定内存分配代码位置信息,所述内存分配代码位置信息为内存分配代码在所述待检测应用程序代码中的位置信息。
又一方面,本申请还提供了一种存储介质,所述存储介质中存储有计算机可执行指令,所述计算机可执行指令被处理器加载并执行时,实现本申请任一实施例的内存分配代码检测方法。
可见,在本申请中,首先获取待检测应用程序代码编译后得到的待检测中间语言代码,由于中间语言代码中包括能够反映机器实际操作内容的指令码,因此,通过匹配指令码的方式,即可确定内存分配操作对应的目标中间语言代码,又由于中间语言代码是由应用程序代码编译得到,二者之间存在对应关系,从而通过目标中间语言代码即可确定待检测应用程序中内存分配代码的位置信息。而且本申请实施例提供的内存分配代码检测方法无需运行应用程序,也无需穷尽应用程序的每种操作情况,因此操作简便,也可以避免内存分配代码检测不全面的问题。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1示出了本申请实施例的一种内存分配代码检测方法所适用的硬件组成框架示意图;
图2示出了本申请实施例的一种内存分配代码检测方法的一种流程示意图;
图3示出了本申请实施例的一种内存分配代码检测方法的一种流程示意图;
图4示出了本申请实施例的一种内存分配代码位置信息的确定流程示意图;
图5示出了本申请实施例的一种内存分配代码检测方法的一种流程示意图;
图6示出了本申请实施例的一种内存分配代码检测方法的一种流程示意图;
图7示出了本申请实施例的一种应用场景实施例对应的***示意图;
图8示出了本申请实施例的一种内存分配代码检测***的一个实施例的组成结构示框图;
图9示出了本申请实施例的一种计算机设备的一个实施例的组成结构示意图。
具体实施方式
在应用程序运行的过程中,如果内存分配操作过多或者过于频繁,就会触发垃圾回收,而垃圾回收会造成运行卡顿等不佳的表现,因此,如何在应用程序代码中检测出内存分配代码,是本领域技术人员需要解决的技术问题。目前,由于包括内存分配代码的源码都是由高级语言编写的,而使用高级语言实现一种功能,如实现内存分配操作,其对应的代码编写规则十分多样化,而且同一种代码编写规则可能也适用多种不同的功能,此外一种功能的实现甚至会通过调用各种封装包的形式,使源码部分并没有实际的功能代码,即,实际实现功能的代码并没有直接显现出来,所以目前无法直接从源码中检测到内存分配代码。
现有的内存分配代码检测方法通常是采用动态的检测方式,将应用程序运行起来,通过尝试各种运行状态,穷尽所有能够对应用程序进行的操作,找到出现内存分配操作的情况,并根据出现内存分配操作的情况找到对应的源码,但这种方式依赖于应用程序的运行状态,以及已尝试的操作情况,测试工作量十分大,而且如果尝试的不够全面,则不能检测出所有的内存分配代码。而本方案提供一种内存分配代码检测方法,即可方便检测所有的内存分配代码。
为了便于理解,先对本申请的内存分配方法对应的方案所适用的硬件组成框架进行介绍。可以参见图1,其中,图1示出了本申请一种内存分配代码检测方法所适用的硬件组成框架示意图。
请参考图1,由图1可知,该硬件组成框架可以包括:第一计算机设备101与第二计算机设备102,其中第一计算机设备101为用来实现内存分配代码检测功能的设备,可以有一个或一个以上,第二计算机设备102为编写待检测应用程序代码的设备,同样可以有一个或一个以上。第一计算机设备101与第二计算机设备102之间通过网络103实现通信连接。
可以理解的是,本申请实施例中并不对计算机设备的数量进行限定,其可以是多个计算机设备共同协作完成内存分配代码检测功能,例如,一个应用程序的代码被分为多个项目或模块,一个计算机设备负责一个项目或模块的内存分配代码的检测功能。在一种可能的情况中,请参考图1,由图1可知,该硬件组成框架可以包括:第一计算机设备101与第二计算机设备102,其中第一计算机设备101为用来实现内存分配代码检测功能的设备,可以有一个或一个以上,第二计算机设备102为编写待检测应用程序代码的设备,同样可以有一个或一个以上。第一计算机设备101与第二计算机设备102之间通过网络103实现通信连接。
在一种可能的情况中,该硬件组成框架也可以仅包括一台第一计算机设备101,第一计算机设备101既具有内存分配代码检测功能,又具有待检测应用程序编写功能,或者第一计算机设备101预先存储有待检测应用程序。
在另一种可能的情况中,该硬件组成框架可以仅包括多台第一计算机设备101,而不包括第二计算机设备102,多台第一计算机设备101可以通过网络互连,相互传输待检测应用程序代码,并对接收到的待检测应用程序进行内存分配代码检测操作。
在本申请实施例中,以同时包括第一计算机设备101和第二计算机设备102的框架为例进行介绍,可以理解为本实施例中具有两个计算机设备,两者进行数据交互,实现内存分配代码功能。进一步,本申请实施例中并不对网络103的形式进行限定,如,网络103可以是无线网络(如WIFI、蓝牙等),也可以是有线网络;既可以是互联网,也可以是局域网,出于数据传输安全的考虑,优选为局域网。
其中,第一计算机设备101和第二计算机设备102可以是同一种计算机设备,如第一计算机设备101和第二计算机设备102均为服务器;也可以是不同类型的计算机设备,如,第一计算机设备101可以是服务器设备,第二计算机设备102可以终端设备。在又一种可能的情况中,可以利用计算能力强的服务器作为第一计算机设备101来提高数据处理效率及可靠性,从而一台第一计算机设备可以对多台第二计算机设备的待检测应用程序代码进行检测。
举例说明,请参考图2,第二计算机设备102在获取待检测应用程序代码后,将其发送至第一计算机设备101,第一计算机设备101对待检测应用程序代码进行编译得到待检测中间语言代码,在待检测中间语言代码中确定指令码为目标指令码的目标中间语言代码,最后通过确定目标中间语言代码对应的源码在待检测应用程序代码中的位置信息,即可确定内存分配代码在待检测应用程序代码中的位置信息。
在一种可能的情况中,第一计算机设备101在确定内存分配代码的位置信息后,可以将位置信息发送至第二计算机设备102,以使第二计算机设备102修改相应位置的内存分配代码。从而使内存分配代码不仅能够被方便、全面的检测出来,也能够使内存分配代码可以被及时的修改。
结合以上共性,参见图3,其示出了本申请一种内存分配代码检测方法一个实施例的流程图,本实施例的方法可以包括:
S101,获取待检测中间语言代码,所述待检测中间语言代码为对待检测应用程序代码进行编译得到的中间语言代码。
其中,中间语言代码(Intermediate Language,IL)是通过特定的编译工具对高级语言源码(如C#、VB、F#的源码)进行编译得到的代码。中间语言代码更接近机器执行的机器代码,能够从中间语言代码确定机器需要执行的具体操作,也就是说,相比于高级语言源码来说,中间语言代码更能直接的反映代码对应的实际操作。
本申请实施例获取的待检测中间语言代码是对待检测应用程序代码进行编译得到的中间语言代码。
在一种可能的情况中,编译工具选用mono.cecil,mono.cecil是一个开源库,可以对高级语言代码进行翻译,得到对应的中间语言代码。待检测应用程序代码以dll文件的格式存储,通过mono.cecil对待检测应用程序代码的dll文件进行编译,即可生成与待检测应用程序代码对应的待检测中间语言代码。
待检测应用程序代码即为高级语言源码,编译操作可以通过本机进行,即,可以是执行内存分配代码检测方法的设备进行,也可以通过其他设备进行,并通过通信接口或输入单元保存至本机中。
S102,在所述待检测中间语言代码中确定指令码为目标指令码的目标中间语言代码;所述目标指令码为对应内存分配代码的指令码。
中间语言代码包括指令码(OpCodes),指令码对应机器执行的实际操作标识。例如,指令码为BOX的中间语言代码,其对应的操作内容为将值类转换为对象引用(O类型)。通过中间语言代码的指令码,即可确定每行中间语言代码对应的实际操作内容。
在本方案中,预先确定对应内存分配操作的指令码,即,确定目标指令码。目标中间语言代码即待检测中间语言代码中,对应内存分配操作的代码。
可选地,目标指令码包括box指令对应的指令码、newarr指令对应的指令码、和newobj指令对应的指令码,也就是说,指令码为box或newarr或newobj的中间语言,被机器执行的结果为内存分配操作。
在一种可能的情况中,通过列表的方式保存目标指令码,保存目标指令码的列表作为匹配列表。在中间语言代码中确定目标中间语言代码时,依次将中间语言代码中的每个指令码与匹配列表中的目标指令码进行匹配,并确定匹配中的指令码对应的中间语言代码,该中间语言代码即为目标中间语言代码。
需要说明的是,目标指令码也可以根据实际需求增加、删除或修改,即,可根据实际情况修改列表。
在实施例中,对应用程序不做具体限定,例如可以是游戏,待检测应用程序代码可以是基于unity引擎并利用C#语言开发的游戏代码。
S103,利用所述目标中间语言代码确定内存分配代码位置信息,所述内存分配代码位置信息为内存分配代码在所述待检测应用程序代码中的位置信息。
由于中间语言代码是对应用程序代码进行编译得到的代码,因此,中间语言代码与应用程序代码之间存在对应关系,内存分配操作对应的目标中间语言代码,其对应的应用程序代码即为内存分配代码。在本方案中利用中间语言代码即可确定待检测应用程序代码中内存分配代码的位置。
在一种可能的情况下,本申请实施例可以利用待检测应用程序代码对应的符号文件来确定与目标中间语言代码对应的内存分配代码的位置信息。符号文件(Symbol Files)是一个数据信息文件,在Windows***中,符号文件以.pdb为扩展名。符号文件包含了应用程序的二进制文件(比如EXE、DLL等)调试信息,专门用作调试,应用程序中所有的变量信息都记录在这个文件中。通过符号文件可以跟踪到应用程序的内部,也可以根据符号文件来确定目标中间语言代码对应的内存分配代码在应用程序代码中的位置信息。
在本申请实施例中,首先获取待检测应用程序代码编译后得到的待检测中间语言代码,由于中间语言代码中包括能够反映机器实际操作内容的指令码,因此,通过匹配指令码的方式,即可确定内存分配操作对应的目标中间语言代码,又由于中间语言代码是由应用程序代码编译得到,二者之间存在对应关系,从而通过目标中间语言代码即可确定待检测应用程序中内存分配代码的位置信息。而且本申请实施例提供的内存分配代码检测方法无需运行应用程序,也无需穷尽应用程序的每种操作情况,因此操作简便,也可以避免内存分配代码检测不全面的问题。
在一种可能的情况中,目标指令码所对应的目标中间语言代码,并不完全是内存分配代码对应的中间语言代码,即,存在一种情况是,用来实现非内存分配功能的中间语言代码,其指令码也为目标指令码,如将此类非内存分配功能的中间语言代码作为目标中间语言代码,则其对应的待检测应用程序代码被作为内存分配代码被检测出来,则内存分配代码的确定范围过大,不够准确,加大了后期修改内存分配代码的工作。为解决该问题,本申请实施例对内存分配代码位置信息的确定做出进一步的限定与说明。
请参见图4,本实施例内存分配代码位置信息的确定流程如下:
S201,在所述目标中间语言代码中确定包括内存分配指令的目标中间语言代码。
其中,每行中间语言代码中既包括指令码,又包括指令内容,为了更准确的匹配出内存分配代码对应的目标中间语言代码,本申请实施例在根据指令码匹配到目标中间语言代码后,还需要根据目标中间语言代码的实际指令信息匹配包括内存分配指令的目标中间语言。
S202,利用所述包括内存分配指令的目标中间语言代码确定内存分配代码位置信息。
本申请实施例中可以通过在目标中间语言中进一步通过指令内容匹配包括内存分配指令的目标中间语言代码,从而根据此类目标中间语言代码确定对应内存分配代码位置信息,会使结果更加准确。
在一种可能的情况中,为了能够使检测到的内存分配代码及时的被修改,在本申请实施例中,可以通过确定内存分配代码的最后修改账号,并根据最后修改账号向对应的代码编辑***发送代码修改指令以及内存分配代码位置信息,从而使相应的修改者及时修改内存分配代码。
请参见图5,其示出了一种内存分配代码其示出了本申请一种内存分配代码检测方法又一实施例的流程示意图,本实施例的方法可以包括:
S301,获取待检测中间语言代码,所述待检测中间语言代码为对待检测应用程序代码进行编译得到的中间语言代码。
S302,在所述待检测中间语言代码中确定指令码为目标指令码的目标中间语言代码;所述目标指令码为对应内存分配代码的指令码。
S303,利用所述目标中间语言代码确定内存分配代码位置信息,所述内存分配代码位置信息为内存分配代码在所述待检测应用程序代码中的位置信息。
S304,利用所述内存分配代码位置信息确定最后修改账号,所述最后修改账号为最后修改每行内存分配代码的账号。
在本方案中,通过代码编写者的账号建立代码与编写者之间的对应关系,通过内存分配代码位置信息确定对应每行内存分配代码的最后修改账号,其中,最后修改账号即为最后修改内存分配代码的账号。
对应关系可以通过指定的数据形式保存,例如采用键值对的方式保存在数据库表中,键为位置信息,值为对应的最后修改账号。
以静态方式保存位置信息与最后修改账号之间的对应关系,需要在每次最后修改者更换时,就及时手动更新对应关系,维护成本较高。为此,在一种具体的实施方式中,最后修改账号的查找可以通过现有或预设的版本控制***来实现。
版本控制***是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更进行管理的***,如,CVS(Concurrent Versions System)、SVN(Subversion)、RCS(Revision Control System)、GIT(Georgia Institute of Technology)为均为版本控制***。版本控制***可自动记录并更新已编写的应用程序代码的位置信息与其最后修改账号之间的对应关系。
在一种可能的情况中,利用版本控制***的API向版本控制***发送用于获取最后修改账号的请求和内存分配代码位置信息,并获取版本控制***返回的与内存分配代码位置信息对应的最后修改账号。
在本方案中,为了能够使用版本控制***来获取与内存分配代码位置信息对应的最后修改账号,需要利用版本控制***提供的API(应用程序编程接口)来实现。不同的版本控制***会提供不同的API,通过调用版本控制***的API即可使用版本控制***的功能。
需要说明的是,版本控制***可以是任一种版本控制***,API需要与版本控制***对应,即,如果版本控制***选用SVN,则API就需要是SVN提供的API,如果版本控制***选用GIT,则API就需要是GIT提供的API。更进一步的,如采用SVN作为版本控制***获取最后修改账号,即可调用SVN的svn_blame接口实现,即,SVN提供的API为svn_blame。
S305,向每个所述最后修改账号对应的代码编辑***发送相应的内存分配代码位置信息和内存分配代码修改指令,以使所述代码编辑***对所述内存分配代码进行修改。
其中,每个最后修改账号均对应有代码编辑***,代码编辑***即为用来编辑应用程序代码的***。
需要说明的是,每个最后修改账号对应有代码编辑***,每个修改账号又对应有不同的内存分配代码位置信息,本步骤需要根据最后修改账号与代码编辑***的对应关系,以及最后修改账号与内存分配代码位置信息的对应关系,确定内存分配代码位置信息与代码编辑***的对应关系,并向代码编辑***发送与其对应的内存分配代码位置信息与内存分配代码修改指令。
在一种可能的情况中,可以预先设定最后修改账号与代码编辑***的通信信息之间的对应关系,在向代码编辑***发送内存分配代码位置信息和内存分配代码修改指令时,通过最后该对应关系确定代码编辑***的通信信息,并通过通信信息与代码编辑***建立通信连接,完成内存分配代码位置信息和内存分配代码修改指令的发送。其中,通信信息例如可以是IP地址。
在一种可能的情况中,利用预设任务分发***的API向每个所述最后修改账号对应的代码编辑***发送内存分配代码修改指令与对应的内存分配代码位置信息。
其中,任务分发***是在软件开发过程中,用来管理每个用户开发任务等信息的***,通过任务分发***可以自动向用户***分发与其对应的任务通知。任务分发***的选择在本方案中并不做具体限定,例如,可以为TAPD(Tencent Agile ProductDevelopment,腾讯敏捷产品研发平台)。
任务分发***采用TAPD,可通过TAPD***的add_sub_story接口实现向最后修改账号的代码编辑***发送需求单,需求单包括内存分配代码修改指令与对应的内存分配代码位置信息。需要说明的是,为了方便对同一最后修改账号的需求单进行管理,可将对应同一最后修改账号的所有内存分配代码修改指令与对应的内存分配代码位置信息作为同一需求单进行下发。
通过调用任务分发***的API即可使用任务分发***的功能,从而即可通过调用API的方式,通过任务分发***来向各个代码编辑***发送对应的内存分配代码修改指令与内存分配代码位置信息,无需再维护最后修改账号与代码编辑***的通信信息之间的对应关系,使指令与位置信息的发送更加快捷、方便。
需要说明的是,任务分发***与版本控制***同理,任务分发***也可以是任一种版本控制***,API需要与任务分发***对应。
本申请实施例可以通过确定内存分配代码的最后修改账号,并根据最后修改账号向对应的***发送代码修改指令以及内存分配代码位置信息,从而使相应的修改者及时修改内存分配代码,避免内存分配代码对应用程序的运行造成影响。
请参见图6,其示出了一种内存分配代码其示出了本申请一种内存分配代码检测方法又一实施例的流程示意图,本实施例的方法可以包括:
S401,获取待检测中间语言代码,所述待检测中间语言代码为对待检测应用程序代码进行编译得到的中间语言代码。
S402,在所述待检测中间语言代码中确定指令码为目标指令码的目标中间语言代码;所述目标指令码为对应内存分配代码的指令码。
S403,利用所述目标中间语言代码确定内存分配代码位置信息,所述内存分配代码位置信息为内存分配代码在所述待检测应用程序代码中的位置信息。
S404,判断所述目标中间语言代码的条数是否大于预设阈值。若是,执行S405,若否,不进行操作。
在一种可能的情况中,可以灵活设定每个待检测应用程序允许出现内存分配操作的最大次数,其中,S404中的预设阈值即表明对于待检测应用程序代码来说,能够存在的内存分配操作的最大次数值。如果目标中间语言代码的条数大于预设阈值,则表示待检测应用程序代码中的内存分配代码量超出上限,需要做出修改,则继续执行S405,否则不需要被修改,停止操作。
S405,利用所述内存分配代码位置信息确定最后修改账号,所述最后修改账号为最后修改每行内存分配代码的账号。
S406,向每个所述最后修改账号对应的代码编辑***发送相应的内存分配代码位置信息和内存分配代码修改指令,以使所述代码编辑***对所述内存分配代码进行修改。
S407,接收所述代码编辑***发送的修改完成指令;执行所述S401。
在一种可能的情况中,可以通过迭代的方式,自动完成对内存分配代码的修改与检测。即,当接收到代码编辑***发送的修改完成指令后,执行S401,再次对待检测应用程序代码的中间语言代码进行检测,重复上述步骤,直至目标中间语言代码的条数小于或等于预设阈值。
本申请实施例通过迭代的方式自动完成对内存分配代码的检测与修改,使内存分配代码检测、修改的过程更加简单、方便。
为了便于理解,请参考图7,结合本方案的一种应用场景进行介绍。
第一计算机设备为本申请实施例用于执行内存分配代码检测操作的计算机设备,第二计算机设备为运行代码编辑***的计算机设备。
第二计算机设备通过代码编辑***生成待检测应用程序代码,待检测应用程序代码具体为基于unity引擎并利用C#语言开发的游戏代码。
第二计算机设备通过网络将游戏代码的相关信息上传至SVN***,相关信息以SVN***的管理规则确定,例如,具体可以包括账号信息、游戏代码等需要被SVN***管理的信息。在本实施例中,账号信息具体为user。
第一计算机设备获取游戏代码对应的dll文件,可以从SVN***获取该dll文件,也可以从第二计算机设备获取该dll文件。
第一计算机设备利用mono.cecil工具对dll文件进行编译,得到与游戏代码对应的待检测中间语言代码。
第一计算机设备确定目标指令码,包括box、newarr、newobj,将每行待检测中间语言代码分别与目标指令码进行匹配,确定匹配上的目标指令码。
例如,游戏代码为:
Unitiy.EventSystem.Publish(“ui_camera_mode”,”ui”,shezhiController.Instan ce.IsGame3DCamera)
进行编译后在待检测中间语言代码中的呈现方式为:
box[mscorlib]System.boolean
其中box为此行待检测中间语言代码的指令码,且box为目标指令码,则确定“box[mscorlib]System.boolean”为目标中间语言代码。
第一计算机设备通过与dll文件对应的符号文件确定每行目标中间语言代码在游戏代码中的实际位置信息,即,内存分配代码位置信息,该位置信息包括函数名和行号。
第一计算机设备通过SVN提供的API,即svn_blame接口查出对应每个内存分配代码位置信息的最后修改账号,本实施例中,最后修改账号以user为例。
第一计算机设备通过TAPD提供的API,即add_sub_story,向账号为user的代码编辑***发送内存分配代码修改指令与对应的内存分配代码位置信息。
账号为user的代码编辑***(也即第二计算机设备)完成修改后,按照上述步骤向SVN***上传更新后的游戏代码的相关信息,并向第一计算机设备发送修改完成指令,第一计算机设备继续对更新后的游戏代码进行内存分配代码检测操作,具体操作可以参见上述步骤,不再赘述。
利用中间语言代码来检测游戏代码中的内存分配代码,无需将游戏运行,再穷尽各种操作,就可以确定出游戏代码中的内存分配代码,并可以通过SVN***确定内存分配代码对应的最后修改账号,利用TAPD可以自动为最后修改账号对应的下发内存分配代码修改指令以及内存分配代码位置信息,通过不断的迭代循环,即可将内存分配代码的数量做到最小化,减少内存分配操作对游戏运行效果的影响。
另一方面,本申请还提供了一种内存分配代码检测***。参见图8,本申请实施例提供的一种内存分配代码检测***,包括:
待检测中间语言代码获取模块501,用于获取待检测中间语言代码;所述待检测中间语言代码为对待检测应用程序代码进行编译得到的中间语言代码;
目标中间语言代码确定模块502,用于在所述待检测中间语言代码中确定指令码为目标指令码的目标中间语言代码;所述目标指令码为对应内存分配代码的指令码;
位置信息确定模块503,用于利用所述目标中间语言代码确定内存分配代码位置信息,所述内存分配代码位置信息为内存分配代码在所述待检测应用程序代码中的位置信息。
可选地,所述位置信息确定模块503包括:
目标中间语言代码确定单元,用于在所述目标中间语言代码中确定包括内存分配指令的目标中间语言代码;
内存分配代码位置信息确定单元,用于利用所述包括内存分配指令的目标中间语言代码确定内存分配代码位置信息。
可选地,该***还包括:
最后修改账号确定模块,用于利用所述内存分配代码位置信息确定最后修改账号,所述最后修改账号为最后修改每行内存分配代码的账号;
指令发送模块,用于向每个所述最后修改账号对应的代码编辑***发送相应的内存分配代码位置信息和内存分配代码修改指令,以使所述代码编辑***对所述内存分配代码进行修改。
可选地,该***还包括:
判断模块,用于判断所述目标中间语言代码的条数是否大于预设阈值;若是,调用所述待检测中间语言代码获取模块501。
可选地,该***还包括:
指令接收模块,用于接收所述代码编辑***发送的修改完成指令。
可选地,最后修改账号确定模块包括:
请求发送单元,用于利用版本控制***的API向所述版本控制***发送用于获取最后修改账号的请求和内存分配代码位置信息;
最后修改账号获取单元,用于获取所述版本控制***返回的与内存分配代码位置信息对应的最后修改账号。
可选地,指令发送模块具体用于利用预设任务分发***的API向每个所述最后修改账号对应的代码编辑***发送内存分配代码修改指令与对应的内存分配代码位置信息。
可选地,位置信息确定模块503具体用于利用所述目标中间语言代码确定内存分配代码在所述待检测应用程序代码中的行号与所属的函数名。
可选地,所述目标指令码包括:
box指令对应的指令码、newarr指令对应的指令码、和newobj指令对应的指令码。
进一步地,本申请实施例还提供了一种计算机设备。图9示出了本申请一种内存分配代码检测方法所适用的计算机设备示意图。
由图9可知,该计算机设备10可以包括:处理器11、存储器12、通信接口13、输入单元14和显示器15和通信总线16。
处理器11、存储器12、通信接口13、输入单元14、显示器15、均通过通信总线16完成相互间的通信。
在本申请实施例中,该处理器11,可以为中央处理器(Central Processing Unit,CPU),特定应用集成电路,数字信号处理器、现成可编程门阵列或者其他可编程逻辑器件等。该处理器可以调用存储器12中存储的程序。具体的,处理器可以执行以下内存分配代码检测方法的实施例中计算机设备侧所执行的操作。
存储器12中用于存放一个或者一个以上程序,程序可以包括程序代码,程序代码包括计算机操作指令,在本申请实施例中,该存储器中至少存储有用于实现以上任一内存分配代码检测方法的程序。
在一种可能的实现方式中,该存储器12可包括存储程序区和存储数据区,其中,存储程序区可存储操作***、以及至少一个功能(比如对应用程序代码进行编译的功能)所需的应用程序等;存储数据区可存储根据计算机的使用过程中所创建的数据,比如,待检测应用成代码、中间语言代码、内存分配代码位置信息等等。
此外,存储器12也可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件或其他易失性固态存储器件。
该通信接口13可以为通信模块的接口,如GSM模块的接口。
本申请还可以包括显示器14和输入单元15等等。
当然,图9所示的计算机设备的结构并不构成对本申请实施例中计算机设备的限定,在实际应用中计算机设备可以包括比图1所示的更多或更少的部件,或者组合某些部件。
其中,图9中的计算机设备10可以为终端(如PC机),也可以为性能高于普通终端的服务器。
在本申请实施例中,计算机设备10可以根据通信接口13利用网络接收外界其他设备发送的待检测应用程序代码;也可以通过自身的输入单元14(如键盘、触摸屏、语音输入设备等)获取待检测应用程序代码。
相应的,计算机设备10中处理器11可以通过通信总线16从通信接口13或者输入单元14接收待检测应用程序代码,并调用存储器12中存储的程序对待检测应用程序代码进行编译,并对编译得到的中间代码进行检测,以确定内存分配代码的位置信息,从而实现方便的在应用程序代码中检测所有内存分配代码的目的。
另一方面,本申请还提供了一种存储介质,该存储介质中存储有计算机程序,所述计算机程序被处理器加载并执行时,用于实现如上任意一个实施例中所描述的内存分配代码检测方法。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、物品或者设备中还存在另外的相同要素。
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
以上仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (9)

1.一种内存分配代码检测方法,其特征在于,包括:
获取待检测中间语言代码;所述待检测中间语言代码为对待检测应用程序代码进行编译得到的中间语言代码;
在所述待检测中间语言代码中确定指令码为目标指令码的目标中间语言代码;所述目标指令码为对应内存分配代码的指令码,所述内存分配代码为内存分配操作对应的目标中间语言代码,其对应的的应用程序代码;
在所述目标中间语言代码中确定包括内存分配指令的目标中间语言代码;
利用所述包括内存分配指令的目标中间语言代码确定内存分配代码位置信息,所述内存分配代码位置信息为内存分配代码在所述待检测应用程序代码中的位置信息;
利用所述内存分配代码位置信息确定最后修改账号,所述最后修改账号为最后修改每行内存分配代码的账号,每个最后账号对应有代码编辑***,每个修改账号对应不同的内部分配代码位置信息;
向每个所述最后修改账号对应的代码编辑***发送相应的内存分配代码位置信息和内存分配代码修改指令,以使所述代码编辑***对所述内存分配代码进行修改;
接收所述代码编辑***发送的修改完成指令;执行所述获取待检测中间语言代码的步骤。
2.根据权利要求1所述的方法,其特征在于,所述利用所述内存分配代码位置信息确定最后修改账号之前,还包括:
判断所述目标中间语言代码的条数是否大于预设阈值;
若是,则执行所述利用所述内存分配代码位置信息确定最后修改账号的步骤。
3.根据权利要求1所述的方法,其特征在于,所述利用所述内存分配代码位置信息确定最后修改每行内存分配代码的最后修改账号,包括:
利用版本控制***的API向所述版本控制***发送用于获取最后修改账号的请求和内存分配代码位置信息;
获取所述版本控制***返回的与内存分配代码位置信息对应的最后修改账号。
4.根据权利要求1至3任意一项所述的方法,其特征在于,所述目标指令码包括:
box指令对应的指令码、newarr指令对应的指令码、和newobj指令对应的指令码。
5.一种内存分配代码检测***,其特征在于,包括:
待检测中间语言代码获取模块,用于获取待检测中间语言代码;所述待检测中间语言代码为对待检测应用程序代码进行编译得到的中间语言代码;
目标中间语言代码确定模块,用于在所述待检测中间语言代码中确定指令码为目标指令码的目标中间语言代码;所述目标指令码为对应内存分配代码的指令码,所述内存分配代码为内存分配操作对应的目标中间语言代码,其对应的的应用程序代码;
位置信息确定模块,用于在所述目标中间语言代码中确定包括内存分配指令的目标中间语言代码;利用所述包括内存分配指令的目标中间语言代码确定内存分配代码位置信息,所述内存分配代码位置信息为内存分配代码在所述待检测应用程序代码中的位置信息;
最后修改账号确定模块,用于利用所述内存分配代码位置信息确定最后修改账号,所述最后修改账号为最后修改每行内存分配代码的账号,每个最后账号对应有代码编辑***,每个修改账号对应不同的内部分配代码位置信息;
指令发送模块,用于向每个所述最后修改账号对应的代码编辑***发送相应的内存分配代码位置信息和内存分配代码修改指令,以使所述代码编辑***对所述内存分配代码进行修改;
指令接收模块,用于接收所述代码编辑***发送的修改完成指令。
6.根据权利要求5所述的***,其特征在于,还包括:
判断模块,用于判断所述目标中间语言代码的条数是否大于预设阈值;若是,则执行所述利用所述内存分配代码位置信息确定最后修改账号的步骤。
7.根据权利要求5所述的***,其特征在于,所述最后修改账号确定模块包括:
请求发送单元,用于利用版本控制***的API向所述版本控制***发送用于获取最后修改账号的请求和内存分配代码位置信息;
最后修改账号获取单元,用于获取所述版本控制***返回的与内存分配代码位置信息对应的最后修改账号。
8.一种计算机设备,其特征在于,包括:
处理器和存储器;
其中,所述处理器用于执行所述存储器中存储的程序;
所述存储器用于存储程序,所述程序至少用于:
获取待检测中间语言代码;其中,所述待检测中间语言代码为对待检测应用程序代码进行编译得到的中间语言代码;
在所述待检测中间语言代码中确定指令码为目标指令码的目标中间语言代码;其中,所述目标指令码为对应内存分配代码的指令码,所述内存分配代码为内存分配操作对应的目标中间语言代码,其对应的的应用程序代码;
在所述目标中间语言代码中确定包括内存分配指令的目标中间语言代码;
利用所述包括内存分配指令的目标中间语言代码确定内存分配代码位置信息,所述内存分配代码位置信息为内存分配代码在所述待检测应用程序代码中的位置信息;
利用所述内存分配代码位置信息确定最后修改账号,所述最后修改账号为最后修改每行内存分配代码的账号,每个最后账号对应有代码编辑***,每个修改账号对应不同的内部分配代码位置信息;
向每个所述最后修改账号对应的代码编辑***发送相应的内存分配代码位置信息和内存分配代码修改指令,以使所述代码编辑***对所述内存分配代码进行修改;
接收所述代码编辑***发送的修改完成指令;执行所述获取待检测中间语言代码的步骤。
9.一种存储介质,其特征在于,所述存储介质中存储有计算机可执行指令,所述计算机可执行指令被处理器加载并执行时,实现如上权利要求1至4任一项所述的内存分配代码检测方法。
CN201910642148.8A 2019-07-16 2019-07-16 内存分配代码检测方法、装置、计算机设备及存储介质 Active CN110334031B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910642148.8A CN110334031B (zh) 2019-07-16 2019-07-16 内存分配代码检测方法、装置、计算机设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910642148.8A CN110334031B (zh) 2019-07-16 2019-07-16 内存分配代码检测方法、装置、计算机设备及存储介质

Publications (2)

Publication Number Publication Date
CN110334031A CN110334031A (zh) 2019-10-15
CN110334031B true CN110334031B (zh) 2023-11-03

Family

ID=68145517

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910642148.8A Active CN110334031B (zh) 2019-07-16 2019-07-16 内存分配代码检测方法、装置、计算机设备及存储介质

Country Status (1)

Country Link
CN (1) CN110334031B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111338864B (zh) * 2020-02-18 2023-08-18 上海闻泰电子科技有限公司 内存问题检测方法、装置、计算机设备及存储介质
CN113220554B (zh) * 2021-05-17 2023-07-25 北京百度网讯科技有限公司 检测程序代码的性能的方法和设备

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104123218A (zh) * 2013-04-23 2014-10-29 腾讯科技(深圳)有限公司 一种代码覆盖测试方法、装置和***
WO2017035748A1 (zh) * 2015-08-31 2017-03-09 华为技术有限公司 一种代码编译方法及代码编译器
CN109344051A (zh) * 2018-08-28 2019-02-15 北京达佳互联信息技术有限公司 数据处理的方法、装置、电子设备及存储介质

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104123218A (zh) * 2013-04-23 2014-10-29 腾讯科技(深圳)有限公司 一种代码覆盖测试方法、装置和***
WO2017035748A1 (zh) * 2015-08-31 2017-03-09 华为技术有限公司 一种代码编译方法及代码编译器
CN109344051A (zh) * 2018-08-28 2019-02-15 北京达佳互联信息技术有限公司 数据处理的方法、装置、电子设备及存储介质

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
Linux平台下基于源代码插装的动态内存检测;高海昌;冯博琴;何杭军;朱利;;小型微型计算机***(09);全文 *
R. Finlayson ; LIVE.COM ; .An Abstract API for Multicast Address Allocation.IETF rfc2771.2000,全文. *
安全协议多目标语言代码缺陷检测方法仿真;孙雷;;计算机仿真(12);全文 *

Also Published As

Publication number Publication date
CN110334031A (zh) 2019-10-15

Similar Documents

Publication Publication Date Title
US10019256B2 (en) Systems and methods for incremental software development
US7975257B2 (en) Iterative static and dynamic software analysis
US8954929B2 (en) Automatically redirecting method calls for unit testing
US9632769B2 (en) Software build optimization
US20240045850A1 (en) Systems and methods for database orientation transformation
CN113885870B (zh) 应用程序更新方法、电子设备、终端设备及***
US20190095181A1 (en) Easy-To-Use Type Of Compile-Time Dependency Injection Method And Device In The Java Platform
US20110126179A1 (en) Method and System for Dynamic Patching Software Using Source Code
US20180060043A1 (en) Preservation of backward compatibility for java card cap files
US20150067653A1 (en) Automatic generation of analysis-equivalent application constructs
CN112099880B (zh) 场景驱动的应用程序约减方法和***
CN110334031B (zh) 内存分配代码检测方法、装置、计算机设备及存储介质
US20130007184A1 (en) Message oriented middleware with integrated rules engine
CN109284222B (zh) 软件单元、数据处理***中的项目测试方法、装置及设备
CN107943504A (zh) 一种嵌入式***中软件模块的动态升级方法
US9395977B2 (en) Locating program code units after software refactoring
CN117707543A (zh) 一种应用安装包制作和安装方法、计算设备及存储介质
US20120222023A1 (en) Automatic runtime dependency lookup
US10606569B2 (en) Declarative configuration elements
CN111352631A (zh) 一种接口兼容性检测方法及装置
CN116578282A (zh) 代码生成方法、装置、电子设备及介质
KR20130020135A (ko) 통합 개발 환경에서의 코드 동시 개발자 리스트 제공 시스템 및 방법
US20180267780A1 (en) Methods for providing conditional allocation of build files and related systems and computer program products
CN111367796A (zh) 应用程序调试方法及装置
CN116737229A (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
GR01 Patent grant
GR01 Patent grant