CN109564540B - 用于jit编译器的调试的系统、方法和设备 - Google Patents
用于jit编译器的调试的系统、方法和设备 Download PDFInfo
- Publication number
- CN109564540B CN109564540B CN201780047635.9A CN201780047635A CN109564540B CN 109564540 B CN109564540 B CN 109564540B CN 201780047635 A CN201780047635 A CN 201780047635A CN 109564540 B CN109564540 B CN 109564540B
- Authority
- CN
- China
- Prior art keywords
- input data
- jit
- compiler
- native code
- jit compiler
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Abstract
通过将JIT编译器生成的本地代码与从可靠的JIT编译器生成的本地代码进行比较来调试JIT编译器。使用相同的输入数据执行不同的编译。通过在程序的编译期间拦截运行时环境与可靠的JIT编译器之间的通信交换来记录输入数据。使用基于从JIT编译器到运行时环境的API调用中的至少一个参数的键来存储每个通信的输入数据。调试工具随后用于使用先前记录的输入数据以使用被测试的JIT编译器来发起方法的编译。
Description
技术领域
本公开的实施例涉及计算机技术领域。
背景技术
本实施例总体上涉及计算机系统领域,并且涉及用于测试编译器的行为并且验证其操作的软件开发和测试技术。具体地,通过使用相同的输入数据来分析从各种编译而生成的本地代码,测试即时(JIT)编译器和/或提前(AOH)编译器的行为。
发明内容
提供本“发明内容”是为了以简化的形式介绍一些概念,这些概念将在下面的“具体实施方式”中进一步描述。本“发明内容”不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。
通过分析JIT编译器生成的本地代码来调试或测试JIT编译器。将从被测试的JIT编译器生成的本地代码与从产生可靠的本地代码的JIT编译器生成的本地代码进行比较。为了分析这些代码,使用相同的输入数据和程序来执行两个JIT编译。将从可靠的JIT编译器生成的本地代码与从被测试的JIT编译器生成的本地代码进行比较以确定两者之间的差异,并且使用这些差异来确定被测试的JIT编译器中的问题的根源。
为了利用相同的输入数据,在使用可靠的JIT编译器的方法的初始JIT编译期间记录输入数据。输入数据来自运行时环境,该运行时环境调用JIT编译器以生成针对特定方法的本地代码。拦截JIT编译器与运行时环境之间的通信交换以便记录输入数据。
调试工具用于在将JIT编译器视为在运行时环境之外操作的独立工具的环境中发起方法的JIT编译。这是通过将调试工具配置为从JIT编译器拦截意图用于运行时环境的通信并且利用由JIT编译器请求的输入数据进行响应来实现的。
通过阅读以下详细描述并且审阅相关附图,这些和其他特征和优点将变得很清楚。应当理解,前面的一般性描述和以下的详细描述都只是说明性的,而不是对所要求保护的各方面的限制。
附图说明
图1是示出用于记录输入数据和调试JIT编译器的各种阶段的框图。
图2是示出在生成本地代码时使用的组件和过程的示例性配置的框图。
图3A是示出用于记录输入数据的组件和过程的示例性配置的框图。
图3B是示出将输入数据记录到字典中的示例的框图。
图4A-4B是用于记录输入数据的示例性方法的流程图。
图5是示出用于使用记录的输入数据来编译一个或多个方法的组件和过程的示例性配置的框图。
图6是用于使用被测试的JIT编译器来编译方法的示例性方法的流程图。
图7是用于比较使用不同编译器从编译产生的相同方法的本地代码的示例性方法的流程图。
图8是示出第一示例性计算或操作环境的框图。
图9是示出第二示例性计算或操作环境的框图。
具体实施方式
概述
编译是将以编程语言编写的源代码转换成目标架构的机器代码或本地代码的过程。静态编译器在计算机程序执行之前执行该转换,并且在程序的执行之前生成可执行代码。JIT编译器(通常称为动态编译器)在计算机程序的执行期间将计算机程序的中间表示转换为本地代码。计算机程序的中间表示是由语言编译器生成的源代码的机器和语言无关版本。
JIT编译器在管理计算机程序的执行的运行时环境(即,语言虚拟机、后端编译器)内操作。运行时环境接受程序的中间代码表示(“IR”),并且当方法在程序的执行期间被调用时调用JIT编译器将程序的方法的中间表示转换为本地代码。
由于若干原因,JIT编译可以比静态编译有益。使用JIT编译,只编译实际使用的代码,从而减少存储器使用。此外,JIT编译更有效地执行来自外部源或动态链接库(即,.dll)的内联的编译器优化,这产生更快的可执行代码。此外,一起执行的代码将位于同一存储器位置内,从而减少了存储器页面错误的数目。
然而,调试JIT编译器比调试静态编译器更困难。静态编译器可以能够利用相同的输入源代码产生静态编译器的执行的诊断跟踪,这可以用于发现问题的根源。这种方法不适用于动态编译器(诸如JIT编译器),其中编译依赖于相同的输入数据来检测问题。JIT编译器不是独立工具,而是在执行程序时调用JIT编译器的运行时环境的一部分。JIT编译器使用的输入数据由运行时环境知道,并且被存储在当运行时环境终止时被丢弃的内部数据结构中。
本文中公开的主题通过在编译期间在JIT编译器与运行时环境之间交换输入数据时记录输入数据来克服该障碍。输入数据包括关于目标方法的信息,诸如方法的IR的存储器位置、方法签名、与方法的自变量或参数有关的类型信息、类的字段布局、自变量的类句柄以及其他类型的数据。
JIT编译器需要的来自运行时环境的输入数据在各种类型的JIT编译器之间变化。JIT编译器可以执行不同的优化和分析,从而需要不同类型和数量的输入数据。在本主题的一个方面,调试工具可以从运行时环境获取在编译期间记录的附加数据,即使在编译期间没有请求输入数据。这是因为用于记录输入数据的JIT编译器通常与被测试的JIT编译器不同。当预期在随后利用不同类型的JIT编译器进行编译时需要该信息时,在记录阶段期间收集该附加输入数据。
调试工具用于记录和存储输入数据以供稍后在被测试的JIT编译器的后续编译时使用。调试工具将由被测试的JIT编译器生成的本地代码与使用相同输入数据的相同方法的可靠的本地代码进行比较。如果两个本地代码文件中的指令相匹配,则假定被测试的JIT编译器正在产生可靠的本地代码。否则,当两个本地代码文件中的指令不同时,将进一步分析从被测试的JIT编译器生成的本地代码以确定问题的根源。现在将注意力转向对该技术的各方面的更详细描述。
调试工具
图1示出了在系统和设备中实施的过程的阶段的示例性配置100,该系统和设备执行对JIT编译的输入数据的记录以便调试和分析JIT编译器。在本文中公开的主题的一个方面,该过程包括初始阶段102、记录阶段104、测试阶段106和分析阶段108。
在初始阶段102中,以编程语言编写的源代码110由与编程语言相关联的语言编译器编译。语言编译器生成中间代码表示(“IR”)和元数据112。IR可以用字节码、公共中间语言(“CIL”)、GNU寄存器传输语言(“GNU RTL”)、解析树、树表示等来表示。该IR和元数据112用于将源代码中的方法编译成本地代码。在记录阶段104中,IR由包括JIT编译器114和运行时执行引擎(未示出)的运行时环境(未示出)编译。记录阶段104的输出是输入数据116和本地代码122。运行时环境记录在运行时执行引擎与JIT编译器114之间的通信交换,以便保留在编译中使用的输入数据。该输入数据116被存储到字典(未示出)中并且用于测试阶段106。
在测试阶段106中,所记录的输入数据116用于使用第二JIT编译器或被测试的JIT编译器118来编译IR 112的一个或多个方法。被测试的JIT编译器118可以是与用于生成所记录的输入数据116的JIT编译器不同的JIT编译器。通过被测试的JIT编译器118生成的本地代码120来分析被测试的JIT编译器118以生成错误代码、优化不佳的代码等。
在分析阶段108中,调试工具124将从被测试的JIT编译器118生成的本地代码120与针对从可靠的JIT编译器生成的相同方法生成的本地代码122进行比较。可靠的JIT编译器是一个产生无错本地代码的JIT编译器。代码比较用作调试被测试的JIT编译器118的手段。两个不同JIT编译器生成的指令的差异可以用于诊断被测试的JIT编译器118中的问题的根源。分析阶段108生成输出数据126,以指示两个本地代码中的指令之间的差异,该差异然后可以用于确定被测试的JIT编译器的任何问题的根源。输出数据126可以被显示给显示器上的开发人员、存储在文件中、或者以适于将分析结果传达给预期用户的任何格式来被生成。
现在将注意力转向图2以描述运行时执行引擎与运行时执行环境中的JIT编译器之间的接口。尽管该描述利用以C++编程语言编写的.NET框架特定的术语,但是应当注意,本文中公开的主题不限于.NET框架或C++编程语言。
在本文中公开的主题的一个方面,示出了示例性配置200,其中用特定编程语言编写的程序的源代码202由语言编译器204编译成汇编206。汇编206包括IR和元数据。运行时环境208(即,后端编译器、语言虚拟机)使用汇编206来生成本地代码214。在本发明的主题的一个方面,运行时环境208包括运行时执行引擎210和JIT编译器212。
汇编206包括用于所有方法的代码和元数据。元数据被组织为非结构化二进制数据流,该数据流包括关于汇编中的所有类型、方法、字段、属性和事件的信息。元数据还包括所有命名空间、类型和成员名称、方法中使用的所有字符串、方法签名、通用实例化和全局唯一标识符(GUID)。
运行时执行引擎210加载汇编206的内容中并且执行它。运行时执行引擎210识别出并非所有IR都可以被执行,并且因此不会将所有IR编译成本地代码214。相反,当在汇编206中定义的单独的方法被调用时,运行时执行引擎210将汇编的IR转换为本地代码214,并且将所得到的本地代码存储在存储器中。当加载和初始化类型时,加载器(未示出)为类型中的每个方法创建并且附加存根(stub)(未示出)。当第一次调用该方法时,存根将控制传递给JIT编译器212以将该方法的IR转换为本地代码214,并且将存根更改为直接指向所生成的本地代码,以使得对已编译的方法的后续调用传递给本地代码214。
当JIT编译器212编译方法时,JIT编译器212与运行时执行引擎210接口以获取由运行时执行引擎210控制的信息,诸如汇编中的元数据和运行时数据结构内部存储的其他信息。在JIT编译器212与用于JIT编译器212的运行时执行引擎210之间存在交换以获取该输入数据。该交换通过一系列API调用和响应或返回值进行传送,并且被称为接口216。在本发明的主题的一个方面,该接口是.NET框架的EE/JIT接口。
当需要编译被调用的方法时,运行时执行引擎210发起与JIT编译器212的交换。运行时执行引擎210使用一个或多个参数(parm 1...parm n)(诸如ICorJitInfo对象)来调用对JIT编译器212的API调用,诸如CompileMethod()218。ICorJitInfo对象包含指向方法本体和方法签名的指针、JIT编译器212的用于存储返回值的指针、编译代码的大小以及其他数据。JIT编译器212不仅编译在ICorJitInfo对象中引用的方法,还编译在该方法内调用的所有其他方法。
在编译期间,JIT编译器212执行诸如类型检查、代码优化等各种功能,这需要运行时执行引擎210已知的信息。因此,JIT编译器212通过对运行时执行引擎210的API调用来做出对该信息进行若干请求,并且运行时执行引擎210利用通过返回值的响应来回复。例如,API调用getArgType(parm)220请求由参数parm表示的特定数据元素的类型,该类型由运行时执行引擎210返回作为返回值222。API调用getClassName(parm)224请求由参数parm表示的特定类的名称,该名称由运行时执行引擎210在返回值226中返回。由于运行时执行引擎210具有程序的全局视角,因此对运行时执行引擎210进行这些API调用,并且这些API调用访问在程序执行期间生成的元数据和其他内部数据。
在该交换期间,JIT编译器212请求运行时执行引擎210为方法的本地代码以及包含与垃圾收集、调试和异常处理有关的数据的其他表分配存储器。当JIT编译器212完成编译该方法时,向CompileMethod()调用228返回指向该方法的本地代码的入口点的指针作为返回值并且在返回值中返回该方法的本地代码的大小。运行时执行引擎210针对尚未编译的每个被调用的方法重复该过程。
现在将注意力转向图3A,图3A描述了用于拦截JIT编译器与运行时执行引擎之间的通信交换以便记录输入数据的示例性技术300。如图3A所示,运行时环境304中的运行时执行引擎306接收包含IR及其相关元数据的汇编302。在本发明的一个方面,汇编302是.NET汇编,其中IR是公共中间语言(“CIL”)格式并且元数据包含描述包括以下中的一项或多项的程序的多个数据流(即,非结构化二进制数据):关于汇编中的类型、方法、字段、属性和事件的所有信息;命名空间、类型和成员名称;字符串;全球唯一标识符;所有方法签名和通用实例。
运行时环境304包括运行时执行引擎306、JIT编译器308、记录器314、方法字典、(方法1字典316a、方法n字典316n),其中每个方法字典包括一个或多个调用字典318a、318n。运行时环境304为组件302的每个方法生成本地代码。记录器314是调试工具的一部分。
记录器314拦截接口312a、312b中的API调用和响应,以使得运行时执行引擎306和JIT编译器308不知道该拦截。在本文中公开的主题的一个方面,记录器314应用迂回(detour),其将由JIT编译器308进行的所有API调用引导到记录器314,并且记录器314从API调用中提取所请求的输入数据,并且将API调用传递到运行时执行引擎306上。类似地,来自运行时执行引擎306的对JIT编译器308的响应被传递到记录器314,记录器314从响应记录所请求的输入数据,并且将响应传递到JIT编译器308上。
JIT编译器308请求的输入数据是针对各种类型的信息,诸如但不限于以下中的一项或多项:(1)关于程序中的类型、方法、字段、属性和事件的所有信息;命名空间、类型和成员名称;字符串;全球唯一标识符;所有方法签名和通用实例化;(2)关于在正在编译的方法内部调用的方法的信息,包括这些方法的签名、这些方法的属性、这些方法中的特定内联行为;(3)与异常处理结构和实现细节有关的信息;(4)安全状态信息;(5)类型到潜在原始类型的映射;(6)内在函数的地址;(7)调试信息——用于将IR代码映射回其相应源代码的数据;(8)符号表数据;(9)简档数据;(10)为本地代码、调试数据、异常处理数据和垃圾收集数据分配的存储器地址。
迂回是一种能够拦截源函数调用以使得能够执行迂回函数来代替源函数的技术。在当前情况下,迂回函数是记录器314。在本发明的主题的一个方面,通过被称为API挂钩(hook)的技术来支持迂回。在API挂钩中,提供了迂回API,其使得记录器314能够使用记录器314的地址来改变API调用和响应的地址。以这种方式,记录器能够记录API调用及其响应以便在测试阶段使用它们。
记录器314将调用和响应记录在多个字典中。应当注意,术语“字典”也可以称为表、映射、符号表、数据存储器和/或关联数组。字典是一种经由键值对可访问的数据结构,即,键用于获取与键相对应的值。
每个方法具有字典(即,方法字典)316a、316n,字典包含用于所进行的每个调用的字典(即,调用字典)318a、318n。每个API调用的参数用作相应调用字典318a、318n中的键,并且与该键或值相对应的条目是被给予对API调用的响应。然后在测试阶段使用这些字典以便为在记录阶段做出的API调用提供相同的输入数据。以这种方式,使用被测试的JIT编译器的编译利用与来自利用可靠的JIT编译器进行的编译相同的输入数据。
图3B描绘了示出记录阶段的示例322。示出了具有四行代码的源代码324。行326将sometype定义为具有两个整型参数a、b的类。行328定义方法bar,其具有sometype类型的参数X,该参数将整型值返回到变量foo。方法bar的行330返回变量X.a。行332调用对方法bar的调用,返回值存储在foo中。该方法的IR代码在框334中示出,其包含三行代码。行336加载arg0的值。行338处理具有sometype类型的值并且获取a的字段值。行340将方法的执行返回到程序中调用它的点。
当运行时执行引擎306执行对bar的调用时,它调用对JIT编译器308的CompileMethod API调用344以使JIT编译器308能够编译方法bar356。CompileMethod API调用344包括指向ICorJitInfo对象346的指针(*comp)、指向CORINFO_METHOD_INFO结构348的指针(*info)、无符号标志350、指向本地代码352的存储位置的指针(*nativeEntry)、以及指向本地代码354的大小的指针(*nativeSizeOfCode)。CORINFO_METHOD_INFO结构包含可以直接访问方法334的IR以及其他数据的方法句柄。
在方法bar的编译期间,JIT编译器308遇到ldarg0指令。JIT编译器308向运行时执行引擎306发出针对类对象和在方法bar的调用中使用的自变量的类型的API调用360、368。API调用可以是getArgType()API调用360,该调用包括指向CORINFO_SIG_INFO结构的指针(*sig),该指针描述bar 362的方法签名以及其他参数。运行时执行引擎306使用CorInfoTypeWithMod返回值0x12进行响应,该值表示类型类370。
在该交换期间,记录器314将用于方法bar的编译的CompileMethod API调用记录到相应的方法字典372中。方法字典372可以利用与该方法相关联的MethodContext 382作为方法字典中的键。运行时执行引擎306使用MethodContext来跟踪对JIT编译器308进行的调用。
对于在方法bar的编译期间的每个后续调用,生成单独的调用字典,其中键与API调用第一自变量或参数中的一个或多个相关联,并且值对应于响应。例如,对于getArgTypeAPI调用,键可以是与第一参数相关联的值,诸如方法签名(即,指针*sig 374),并且该位置的值是表示类型类376的值0x12。当由不同JIT编译器在测试阶段调用getArgType API调用时,调试工具使用与第一参数相关联的值(诸如在API调用中使用的方法签名(即,指针*sig))作为键来在方法字典372中查找响应,其是0x12。同样,对于由JIT编译器对运行时执行环境进行的后续API调用,用于查找先前记录的响应的键可以是在所记录的API调用中使用的自变量或参数中的一个或多个。如图3B所示,键378用于获取包含值0x23的响应380,包括由在所记录的API调用中使用的自变量中的一个或多个构成的值。应当注意,本文中描述的技术的主题不限于键和值的任何特定配置,并且可以使用其他技术,诸如API调用的散列函数、API调用的参数中的一个或多个的散列函数等。
现在将注意力转向对参考各种示例性方法描述的主题的各方面的操作的描述。可以理解,除非另有说明,否则代表性方法不一定必须以所呈现的顺序或以任何特定顺序执行。示例性方法可以代表由本文中描述的一个或多个方面执行的一些或全部操作,并且该方法可以包括比所描述的操作更多或更少的操作。此外,关于这些方法描述的各种活动可以以串行或并行方式或者串行和并行操作的任何组合来执行。这些方法可以使用对于给定的一组设计和性能约束所期望的所描述的实施例或替代实施例的一个或多个硬件元件和/或软件元件来实现。
图4A-图4B示出了用于记录在运行时执行引擎与JIT编译器之间的接口中交换的输入数据的示例性方法400的流程图。参考图3A-图3B和图4A-图4B,记录器314拦截运行时执行引擎306与JIT编译器308之间的通信。记录器314监测CompileMethod()API调用(框402)的通信(框404)。该API调用被记录到与该特定CompileMethod()API调用相关联的方法的方法字典316a、'n中(框406)。记录器314将直到完成CompileMethod()API调用之前进行的每个后续API调用和响应记录到与该方法相关联的单独的调用字典318a、318n中。
当记录器314拦截来自JIT编译器308的API调用时(框408-是),记录器314使用与API调用的一个或多个参数相关联的存储器地址作为键来将API调用记录到相应的调用字典318a、318n中,并且将API调用转发给运行时执行引擎306(框410)。当记录器314拦截来自运行时执行引擎306的对API调用的响应时(框412-是),响应作为与键相对应的值被记录在相应的调用字典318a、318n中并且被转发给JIT编译器308(框414)。
在一些情况下,即使JIT编译器没有请求,记录器314也将响应于接收到特定请求而从运行时执行引擎请求附加信息。当预期在利用不同的JIT编译器来编译该方法时将需要该附加信息时,记录器314请求该附加信息。JIT编译器在方法的编译期间执行的操作上有所不同,并且因此,这些编译器使用不同类型和数量的输入数据来执行。在本发明的一个方面,在记录期间,记录器314可以请求存储在字典中的该附加信息。
例如,一个JIT编译器JIT A可以具有浅内部类型系统,而另一JIT编译器JIT B可以具有更鲁棒的类型系统。JIT A可以是可以从其来记录输入数据的可靠的JIT编译器,并且JIT B可以是被测试的JIT编译器。当JIT A正在编译引用参数字段的方法时,它可能只需要它所需要的特定字段的偏移。当JIT B编译相同的方法时,它可能需要针对每种类型的所有字段偏移。但是,字典将不具有该输入数据,即该方法中每种类型的所有字段偏移,因为它在使用JIT A编译方法时未被记录。在这种情况下,记录器被配置为在预期具有用于JITB的编译的该输入数据时记录附加信息,以便捕获针对每种类型的所有字段偏移。
转到图4B,记录器将API调用或请求与一组规则或启发法(heuristics)相匹配,这些规则或启发法将指示是否需要附加输入数据(框430)。如果请求匹配规则(框432-是),则记录器从运行时执行引擎请求附加信息并且将该信息存储在字典中(框434)。否则(框432-否),记录器继续进行以监测接口。
示例性规则或启发法可以包括以下中的一项或多项:
(1)当请求是针对方法签名时,获取与方法签名相关联的返回值的类型;
(2)当请求是针对方法的getinline时,获取该方法的类句柄;
(3)当请求是针对方法类时,获取该方法的类句柄;
(4)当请求是用以解析令牌时,获取类型属性、子类型以及对应的字段和字段偏移;
(5)当请求是针对被称为CorInfoType的类型时,获取对应的原始值类类型;
(6)当请求是针对字段类型时,获取该类型的类句柄和针对对应字段的属性;
(7)当请求是针对args类时,获取针对该类的类句柄;以及
(8)当请求涉及CallInfo类时,获取对应的方法名称、属性和句柄。
记录器314将该附加输入数据记录到相应的字典中。在这种情况下,记录器314使用与原始API调用相关联的键将附加输入数据插入到相应的方法字典中,并且所使用的值与从记录器到运行时执行引擎的API调用中使用的至少一个或多个参数相关联以获取附加输入数据。
回到图4A,当记录器314拦截对CompileMethod()API调用的响应时(框420-是),记录器314将响应记录在对应的调用字典318a、318n中(框422),并且记录器314返回以监测接口312a、312b(框402)。否则(框420-否),记录器314等待运行时执行引擎306与JIT编译器308之间的下一次通信。
现在将注意力转向讨论使用所记录的运行时信息以利用不同JIT编译器来JIT编译程序的示例性方法。参考图5,示出了系统500,系统500包括耦合到被测试的JIT编译器506的调试工具124。调试工具124取代运行时执行环境并且与被测试的JIT编译器506通信,就像调试工具124是运行时执行引擎一样。调试工具124使用方法字典510a、n和调用字典512a、n来获取输入数据或对被测试的JIT编译器506的响应。
当重新编译程序的方法时,调试工具124不受特定顺序的约束。调试工具124能够选择任何特定方法来重新编译,而不会对在目标方法之前或之后编译或执行的程序中的其他方法有任何依赖性。字典的使用为调试工具124提供了这种能力,因为所记录的输入数据被存储在具有键值对的数据结构中,该键值对使得能够访问独立于任何顺序的方法的输入数据。这不同于利用基于堆栈的数据结构来存储输入数据的其他技术,该输入数据需要对所记录的数据的访问基于存储数据的顺序,诸如在记录期间编译方法的顺序。
参考图5和6,调试工具124将特定JIT编译器加载到测试506(框602)。然后选择方法以利用被测试的JIT编译器506进行编译,并且加载510a、n其对应的方法字典(框604)。应当注意,调试工具不限于以任何特定顺序编译方法,诸如与记录方法的顺序相同。方法和调用字典的构造方式允许调试工具选择任何独立地编译的方法。同样,调试工具可以响应于从被测试的JIT编译器进行的API调用,而不管调试工具接收这些调用的顺序如何。
然后,调试工具124使用与记录中的相同的参数来生成CompileMethod API调用。该相同的API调用被记录在方法字典510a、n中,该方法字典被访问以获取相同的方法签名,该方法签名被发送到被测试的JIT编译器506(框606)。然后,调试工具124等待从被测试的JIT编译器506接收API调用。对于每个API调用(框608),调试工具124在相关联的调用字典512a、n中搜索响应(框610)。如果找到响应(框612-是),则将响应作为返回值传输给对被测试的JIT编译器506的API调用(框614)。如果不是(框612-否),则创建默认响应并且将其作为API调用的返回值发送回被测试的JIT编译器506(框616)。重复这些步骤,直到被测试的JIT编译器506完成对CompileMethod API调用的编译。
现在将注意力转向讨论使用相同输入数据从不同JIT编译器编译的不同本地代码的分析。参考图1和图7,调试工具124加载两个不同编译的本地代码文件:本地代码1和本地代码2(框702)。然后,调试工具124将第一本地代码文件(本地代码1)中的每个代码块与第二本地代码文件(本地代码2)中的对应代码块进行比较(框704、706)。代码块是与程序中的特定方法相对应的本地代码指令集。术语方法指的是面向对象的编程语言中与对象类相关联的函数,其中对象类包括行为(即,实现该函数的代码)和数据。将第一本地代码文件的代码块中的每个指令与第二本地代码文件的代码块中的对应指令进行比较。代码块中的指令的位置用于确定其与另一代码块中的对应指令的关系或对应关系。
然后,调试工具124比较每个相关或对应的指令(框708)以确定指令及其参数是否匹配(框710)。如果整个指令匹配(框710-是),则调试工具124前进到下一指令(框712)。如果指令不匹配(框714-否),但仅指令本身匹配而参数不匹配(框714-是),则确定两个参数的地址之间的差异。如果两个代码块的基本地址之间的差异相差相同的量(框716),则指令将被认为是相同的(框722-是)。
例如,考虑包括以下指令的第一代码块:
mov EAX,1x1234
mov ECX,0x1235
并且第二代码块包括以下指令:
mov EAX,0x4234
mov EAX,0x4235。
两个代码块的基本地址之间的差异是0x3000,并且因此调试工具124将确定这两个指令是等同的。如果基本地址之间的差异不相同(框722-否),则将两个指令标识为不同并且被记录为错误(框720)。如果指令和参数都不匹配(框718-是),则将两个指令识别为不同并且被记录为错误(框720)。否则(框718-否),将指令记录为错误并且继续进行到下一指令(框724)。
然后,使用这两个本地代码文件之间的指令差异来调试被测试的JIT编译器。这些差异用于确定JIT编译器如何生成其代码,并且用于指向被测试的JIT编译器中的问题的根源。
备选地,一些JIT编译器(例如,Java JIT编译器)使用符号或令牌来引用存储器地址。在这种情况下,调试工具确定由符号或令牌表示的地址以执行比较。
根据本文中描述的主题的各方面,一种计算机系统可以包括一个或多个处理器、连接到一个或多个处理器的存储器、以及当被加载到存储器中时使一个或多个处理器使用第一JIT编译器对程序方法执行第一JIT编译并且使用第二JIT编译器对同一方法执行第二JIT编译的至少一个模块。第一JIT编译使用输入数据生成第一本地代码以执行方法的JIT编译,并且第二JIT编译使用与方法的第一JIT编译中相同的输入数据生成第二本地代码。将从第一JIT编译生成的方法的本地代码中的指令与从第二JIT编译生成的本地代码中的指令进行比较。然后输出这些指令的差异。
JIT编译器可能需要来自运行时环境的输入数据可以包括以下中的一个或多个:在方法中使用的元素的类型数据、方法中的另一方法的方法签名、与该方法有关的调试信息、与该方法有关的存储器地址、与该方法有关的简档数据、以及与该方法有关的符号表数据。输入数据是从拦截从JIT编译器发起的对请求输入数据的运行时环境的API调用而获取的。所请求的输入数据是从运行时环境获取的,并且使用从API调用中的参数构造的键而被存储在字典中。以这种方式,当稍后由第二JIT编译器调用相同的API调用时,可以使用由第二JIT编译器进行的相同API调用中的相同参数来从字典中取回输入数据。
即使第一JIT编译器未请求附加输入数据,也可以从运行时环境取回与从第一JIT编译器请求的输入数据相关的附加输入数据。当第一API调用中的数据与指示要在记录阶段期间取回该附加输入数据的规则相匹配时,取回该附加输入数据。
一种设备可以包括一个或多个处理器、连接到至少一个处理器的存储器、运行时环境、第一JIT编译器、第二JIT编译器、记录器和调试工具。第一JIT编译器使用由运行时环境提供的输入数据来执行方法的第一编译。记录器记录在第一JIT编译中使用的输入数据。第一JIT编译器为该方法生成第一本地代码。第二JIT编译器使用相同的输入数据来执行方法的第二编译。第一JIT编译器和第二JIT编译器是不同的。第二编译生成该方法的第二本地代码。调试工具在第二编译中从第二JIT编译器接收对输入数据的请求,并且从第一数据存储器获取所请求的输入数据以返回到第二JIT编译器。
记录器拦截指向运行时环境的API调用,以便存储输入数据以供在第二编译中使用。输入数据被存储在第一数据存储中的基于拦截的API调用中的一个或多个参数的位置中。调试工具拦截来自第二JIT编译器的第二编译中的API调用,并且从数据存储器中获取所请求的输入数据。在某些情况下,即使没有从第一JIT编译器请求,调试工具也可以在第一编译期间从运行时环境请求附加输入数据。调试工具比较第一本地代码和第二本地代码以确定这些代码之间的差异。
JIT编译器在编译期间请求的输入数据可以包括以下中的一个或多个:在方法中使用的元素的类型数据、方法中的另一方法的方法签名、与该方法有关的调试信息、与该方法有关的存储器地址、与该方法有关的简档数据、以及与该方法有关的符号表数据。
一种使用诸如上述系统和设备等系统和设备的方法可以包括各种操作,诸如:在程序的方法的JIT编译期间拦截由第一JIT编译器进行的第一API调用,其中第一API调用从执行程序的运行时环境请求输入数据;从运行时环境获取输入数据并且将其传输给第一JIT编译器,并且基于第一API调用满足预定义条件来向运行时环境发出针对附加输入数据的第二API调用,而不从第一JIT编译器发起,并且将输入数据和附加输入数据存储在通过与第一API调用的一个或多个参数相关联的键可访问的数据存储器中。使用第二JIT编译器进行第二API调用,该第二编译器请求附加输入数据并且从数据存储器被取回。如果无法获取所请求的输入数据,则生成默认响应。
JIT编译器可能需要来自运行时环境的输入数据可以包括以下中的一个或多个:在方法中使用的元素的类型数据、方法中的另一方法的方法签名、与该方法有关的调试信息、与该方法有关的存储器地址、与该方法有关的简档数据、以及与该方法有关的符号表数据。预定义条件可以包括以下中的一项或多项:(1)当第一API调用是针对方法签名时,获取与方法签名相关联的返回值的类型;(2)当第一API调用是针对方法类时,获取该方法的类句柄;以及(3)当第一API调用是用于解析令牌时,获取类型属性、子类型以及令牌的对应字段和字段偏移。可以通过与来自第一API调用的至少一个参数相关联的键来在数据存储器中访问输入数据。
该方法使用第一JIT编译器生成该方法的第一本地代码,并且使用与第一JIT编译器相同的输入数据生成该方法的第二本地代码,并且比较第一本地代码和第二本地代码以确定指示第二JIT编译器的问题的差异。
合适的计算环境的示例
现在将注意力转向对示例性操作环境的讨论。图8描绘了第一示例性操作环境800,其包括集成开发环境(“IDE”)802和公共语言运行时(“CLR”)804。IDE 802(例如,Visual Studio、NetBeans、Eclipse、JetBrains、NetCode等)可以允许用户(例如,开发人员、程序员、设计者、编码人等)设计、编码、编译、测试、运行、编辑、调试或构建程序、程序集、网站、网络应用、包和计算设备中网络服务。软件程序包括以一种或多种源代码语言(例如,Visual Basic、Visual J#、C++、C#、J#、Java Script、APL、COBOL、Pascal、Eiffel、Haskell、ML、Oberon、Perl、Python、Scheme、Smalltalk等)创建的源代码810。
IDE 802可以提供本地代码开发环境,或者可以提供在语言虚拟机上运行的托管代码开发,或者可以提供其组合。IDE 802可以使用.NET框架提供托管代码开发环境,该.NET框架可以包括用户界面806、源代码编辑器808、源代码810、语言编译器812、以及IR和元数据814。用户可以经由IDE 802中的用户界面806和源代码编辑器808以根据已知的软件编程技术和与特定源语言相关联的特定逻辑和语法规则来创建和/或编辑源代码。此后,可以经由语言编译器812编译源代码810,由此创建IR和元数据814。
在本发明的一个方面,IDE 802可以在第一计算设备840上操作,并且CLR 804可以在与第一计算设备840不同的第二计算设备836上操作。在本发明的另一方面,IDE 802和CLR 804可以在同一计算设备上操作。计算设备836、840可以是任何类型的电子设备,诸如但不限于:移动设备、个人数字助理、移动计算设备、智能电话、蜂窝电话、手持计算机、服务器、服务器阵列或服务器群、web服务器、网络服务器、刀片服务器、因特网服务器、工作站、小型计算机、大型计算机、超级计算机、网络设备、web设备、分布式计算系统、多处理器系统或其组合。
第一计算设备836和第二计算设备840可以通过通信框架838通信地耦合。通信框架838支持计算设备之间的通信。通信框架838可以实施任何众所周知的通信技术,诸如适用于分组交换网络的技术(例如,诸如因特网等公共网络、诸如企业内联网等专用网络等)、电路交换网络(例如,公共交换电话网络)、或分组交换网络和电路交换网络的组合(具有合适的网关和转换器)。
公共语言运行时804利用读取汇编816的运行时执行引擎822,汇编816由元数据818和中间代码表示820组成。运行时执行引擎822在记录阶段期间与记录器824交互,并且在测试阶段与调试工具828交互。输入数据由记录器824在记录阶段记录,并且被存储在由调试工具828在测试阶段使用的字典826中。一个或多个JIT编译器830可以由记录器824和调试工具828使用。调试工具828比较一个或多个本地代码832以确定JIT编译器830的问题。
尽管已经关于.NET框架描述了前述操作环境,但是本文中描述的技术不限于任何特定的软件框架、编程语言、编译器集合、操作系统、操作系统平台、编译器基础结构项目等。本文中描述的技术可以用在GNU编译器集合(GCC)和低级虚拟机(LLVM)编译器基础结构以及采用动态编译的其他编译器和操作系统框架中。
现在将注意力转向图9和第二示例性操作环境的讨论。应当注意,操作环境900是示例性的,并且不旨在对实施例的功能提出任何限制。实施例可以应用于利用至少一个计算设备902的操作环境900。计算设备902可以是任何类型的电子设备,诸如但不限于:移动设备、个人数字助理、移动计算设备、智能电话、蜂窝电话、手持计算机、服务器、服务器阵列或服务器群、web服务器、网络服务器、刀片服务器、因特网服务器、工作站、小型计算机、大型计算机、超级计算机、网络设备、web设备、分布式计算系统、多处理器系统或其组合。操作环境900可以配置在网络环境、分布式环境、多处理器环境,或者可以访问远程或本地存储设备的独立计算设备中。
计算设备902可以包括一个或多个处理器904、通信接口906、存储设备908、一个或多个输入设备910、存储器912和输出设备914。处理器904可以是任何商用处理器。并且可以包括双微处理器和多处理器架构。通信接口906支持计算设备902与其他设备之间的有线或无线通信。存储设备908可以是计算机可读介质,其不包含传播信号,诸如通过载波传输的调制数据信号。存储装置908的示例包括但不限于:RAM、ROM、EEPROM、闪存或其他存储器技术、CD-ROM、数字通用盘(DVD)或其他光学存储器、磁带盒、磁带、磁盘存储器,所有这些不包含传播信号,诸如通过载波传输的调制数据信号。计算设备902中可以存在多个存储设备908。输入设备910可以包括键盘、鼠标、笔、语音输入设备、触摸输入设备等、以及其任何组合。输出设备914可以包括显示器、扬声器、打印机等、以及其任何组合。
存储器912可以是可以存储可执行程序、应用程序和数据的任何非暂态计算机可读存储介质。计算机可读存储介质不涉及传播信号,诸如通过载波传输的调制数据信号。它可以是任何类型的非暂态存储器设备(例如,随机存取存储器、只读存储器等)、磁存储器、易失性存储器、非易失性存储器、光存储器、DVD、CD、软盘驱动器等,这些存储器与传播信号无关,诸如通过载波传输的调制数据信号。存储器912还可以包括一个或多个外部存储设备或远程定位的存储设备,这些存储设备不涉及传播信号,诸如通过载波传输的调制数据信号。
存储器912可以包含指令、组件和数据。组件是执行特定功能的软件程序,并且另外称为模块、程序、应用等。存储器可以包括操作系统916、语言编译器918、运行时环境920、源代码文件922、本地代码文件924、包括IR和元数据的汇编926、运行时执行引擎928、记录器930、调试工具932、一个或多个JIT编译器934、方法和调用字典936、输出数据938以及其他应用和数据940。
尽管用结构特征和/或方法动作专用的语言描述了本主题,但是应当理解,所附权利要求书中定义的主题不必限于上述具体特征或动作。而是,上述具体特征和动作被公开作为实现权利要求的示例形式。例如,已经针对.NET框架描述了几个组件。然而,本文中描述的主题的各方面不限于.NET框架,并且可以应用于Java运行时环境、LLVM和任何其他JIT编译系统。
已经关于测试可靠的JIT编译器和被测试的JIT编译器的本地代码描述了所公开的主题。但是,可以对任何类型的JIT编译器和任何数目的JIT编译器进行比较。例如,记录阶段不限于使用可靠的JIT编译器来记录编译的输入,也不限于任何类型的JIT编译器,无论是否产生可靠的本地代码。例如,记录阶段可以基于使用第一JIT编译器的编译,并且测试阶段可以基于使用相同的第一JIT编译器或不同于第一JIT编译器的第二JIT编译器的编译。
本文中公开的主题不限于测试和/或调试JIT编译器。所公开的技术可以应用于生成任何类型的代码的不同工具,诸如源代码、IR、托管代码或本地代码,诸如但不限于软件开发工具包(SDK)、源到源编译器、静态编译器、提前编译器等。或者,主题不限于比较本地代码,并且所描述的技术可以用于比较IL代码或高于本地代码的代码的较低级表示。
此外,所公开的主题可以在调试环境中使用,其中各个测试程序通过被测试的JIT编译器来运行并且与指定的输出进行比较。此外,被测试的JIT编译器和旧的“可靠的”JIT编译器可以用于生产运行,其中运行时执行环境基本上在生产服务上同时调用两个JIT,进行在线而不是脱机分析,并且标记任何差异以用于后续跟进和进一步离线分析。该场景可以是云服务的一部分。
Claims (20)
1.一种用于JIT编译器的调试的系统,包括:
至少一个处理器和存储器;以及
至少一个模块,所述至少一个模块当在所述至少一个处理器上被执行时执行以下动作:
使用第一JIT编译器执行对程序的方法的第一JIT编译;
从所述第一JIT编译生成所述方法的第一本地代码;
在所述第一JIT编译期间,记录从运行时环境提供给所述第一JIT编译器的输入数据,所述输入数据由所述第一JIT编译器使用以生成所述第一本地代码;
在所述第一JIT编译期间,记录来自所述运行时环境的属于所述方法的附加数据以用于第二JIT编译中,所述附加数据未被提供给所述第一JIT编译器;
使用所述输入数据和所述附加数据以利用第二JIT编译器执行对所述方法的所述第二JIT编译;
从所述第二JIT编译生成所述方法的第二本地代码;以及
输出所述第一本地代码中的指令和所述第二本地代码中的指令是否是等同的。
2.根据权利要求1所述的系统,其中所述输入数据包括以下中的一项或多项:
所述方法中使用的元素的类型数据;
所述方法中的另一方法的方法签名;
与所述方法有关的调试信息;
与所述方法有关的存储器地址;
与所述方法有关的简档数据;或者
与所述方法有关的符号表数据。
3.根据权利要求1所述的系统,其中所述至少一个模块当在所述至少一个处理器上被执行时执行以下另外的动作:
拦截来自所述第一JIT编译器的请求第一输入数据的第一API调用;
从所述运行时环境获取所述第一输入数据;以及
使用与所述第一API调用中的至少一个或多个参数相对应的键来将所述第一输入数据存储在字典中。
4.根据权利要求3所述的系统,其中所述至少一个模块当在所述至少一个处理器上被执行时执行以下另外的动作:
从所述第二JIT编译器接收请求所述第一输入数据的第二API调用;以及
使用所述第二API调用中的至少一个参数从所述字典取回所述第一输入数据以访问所述第一输入数据。
5.根据权利要求4所述的系统,其中所述第二API调用时在与所述第一API调用的接收不同的序列中被接收。
6.根据权利要求3所述的系统,其中所述至少一个模块当在所述至少一个处理器上被执行时执行以下另外的动作:
从所述第一JIT编译器接收请求所述第一输入数据的第一API调用;
从所述运行时环境取回与所述第一输入数据相关联的、未被包括在所述第一API调用中的附加输入数据;以及
存储所述附加输入数据。
7.根据权利要求1所述的系统,其中所述第一JIT编译器与所述第二JIT编译器不同。
8.一种用于JIT编译器的调试的方法,所述方法在包括至少一个处理器和存储器的至少一个计算设备上被执行,所述方法包括:
在对程序的方法的第一JIT编译期间拦截第一API调用,所述第一API调用从执行所述程序的运行时环境请求输入数据,所述第一API调用是在所述第一JIT编译期间从第一JIT编译器被发起的;
从所述运行时环境获取所述输入数据以用于向所述第一JIT编译器的传输;
在所述第一API调用满足预定义条件时,向所述运行时环境发出针对附加输入数据的第二API调用,而无需从所述第一JIT编译器的发起,所述附加输入数据属于所述方法并且用于后续编译中;以及
将所述输入数据和所述附加输入数据存储在通过与所述第一API调用相关联的存储器位置可访问的数据存储中,被存储的所述数据用于所述后续编译中。
9.根据权利要求8所述的方法,还包括:
使用第二JIT编译器执行对所述方法的第二JIT编译;
在所述第二JIT编译期间,接收请求所述附加输入数据的第二API调用;以及
从所述数据存储取回所述附加输入数据。
10.根据权利要求8所述的方法,其中所述输入数据包括以下中的一项或多项:
所述方法中使用的元素的类型数据;
所述方法中的另一方法的方法签名;
与所述方法有关的调试信息;
与所述方法有关的存储器地址;
与所述方法有关的简档数据;或者
与所述方法有关的符号表数据。
11.根据权利要求8所述的方法,其中所述预定义条件包括以下中的一项或多项:
(1)当所述第一API调用是针对方法签名时,获取与所述方法签名相关联的返回值的类型;
(2)当所述第一API调用是针对方法类时,获取所述方法的类句柄;或者
(3)当所述第一API调用是用以解析令牌时,获取所述令牌的类型属性、子类型以及对应字段和字段偏移。
12.根据权利要求8所述的方法,还包括:
使用与来自所述第一API调用的至少一个参数相关联的所述输入数据来访问所述数据存储以获得所述输入数据。
13.根据权利要求9所述的方法,还包括:
使用所述第一JIT编译器生成所述方法的第一本地代码;
使用所述第二JIT编译器生成所述方法的第二本地代码;以及
比较所述第一本地代码与所述第二本地代码,以确定指示所述第二JIT编译器的问题的差异。
14.根据权利要求8所述的方法,还包括:
当所述输入数据不能够从所述运行时环境中获取时,返回默认值作为所述输入数据。
15.一种用于JIT编译器的调试的设备,包括:
至少一个处理器和耦合到所述至少一个处理器的至少一个存储器,其中所述至少一个处理器被配置为:
在所述存储器中使用表示方法的标识符来记录在程序的方法的第一JIT编译中使用的输入数据,所述第一JIT编译由第一编译器执行,所述第一编译中使用的所述输入数据由所述第一编译器向所运行时环境请求;
使用第二编译器执行所述方法的第二JIT编译,所述第二编译器不同于所述第一编译器;
由调试工具从所述第二编译器接收针对输入数据的请求,以执行所述方法的所述第二JIT编译;以及
由所述调试工具提供由所述第二编译器请求的所述输入数据,以执行所述方法的所述第二JIT编译,其中使用表示所述方法的所述标识符从所述存储器中取回所述输入数据。
16.根据权利要求15所述的设备,其中所述调试工具将从所述第一JIT编译生成的第一本地代码和从所述第二JIT编译生成的第二本地代码相比较,以确定所述第一本地代码和所述第二本地代码之间的差异。
17.根据权利要求16所述的设备,其中所述至少一个处理器还被配置为:
由所述调试工具将与所述第一本地代码相关联的指令和参数与所述第二本地代码中的对应指令和参数相比较;
当与所述第一本地代码相关联的所述指令的所述参数与所述第二本地代码中的所述指令的所述参数不同时,确定所述第一本地代码相关联的所述指令的所述参数与所述第二本地代码中的所述指令的所述参数之间的地址的差异;
如果所述差异与以下差异相同:与所述第一本地代码的指令相关联的基地址同所述第二本地代码的所述指令之间的差异,则所述指令被认为相似。
18.根据权利要求15所述的设备,其中所述第一编译器包括以下中的至少一项:及时JIT编译器或者提前AOH编译器;并且所述第二编译器包括以下中的至少一项:JIT编译器或者AOH编译器。
19.根据权利要求15所述的设备,其中所述调试工具提供由所述第二编译器请求的所述输入数据,而不管由所述第二编译器在其中执行所述方法的序列。
20.根据权利要求15所述的设备,其中所述标识符是所述方法的参数。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US15/224,586 | 2016-07-31 | ||
US15/224,586 US10579498B2 (en) | 2016-07-31 | 2016-07-31 | Debugging tool for a JIT compiler |
PCT/US2017/043188 WO2018026540A1 (en) | 2016-07-31 | 2017-07-21 | Debugging tool for a jit compiler |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109564540A CN109564540A (zh) | 2019-04-02 |
CN109564540B true CN109564540B (zh) | 2022-05-10 |
Family
ID=59416865
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201780047635.9A Active CN109564540B (zh) | 2016-07-31 | 2017-07-21 | 用于jit编译器的调试的系统、方法和设备 |
Country Status (4)
Country | Link |
---|---|
US (1) | US10579498B2 (zh) |
EP (1) | EP3491527B1 (zh) |
CN (1) | CN109564540B (zh) |
WO (1) | WO2018026540A1 (zh) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR102414250B1 (ko) * | 2015-07-30 | 2022-06-29 | 삼성전자주식회사 | 전자 장치, 컴파일링 방법 및 컴퓨터 판독가능 기록매체 |
US10606728B2 (en) * | 2016-09-06 | 2020-03-31 | Sap Se | Framework for detecting source code anomalies |
US10853057B1 (en) | 2017-03-29 | 2020-12-01 | Amazon Technologies, Inc. | Software library versioning with caching |
US10565090B1 (en) * | 2018-01-03 | 2020-02-18 | Amazon Technologies, Inc. | Proxy for debugging transformed code |
US10798464B1 (en) | 2018-04-27 | 2020-10-06 | Amazon Technologies, Inc. | Streaming delivery of client-executable code |
US10776255B1 (en) * | 2019-07-31 | 2020-09-15 | International Business Machines Corporation | Automatic verification of optimization of high level constructs using test vectors |
US11487565B2 (en) * | 2020-10-29 | 2022-11-01 | Hewlett Packard Enterprise Development Lp | Instances of just-in-time (JIT) compilation of code using different compilation settings |
CN113836023B (zh) * | 2021-09-26 | 2023-06-27 | 南京大学 | 一种基于体系结构交叉检查的编译器安全性测试方法 |
CN114115900B (zh) * | 2021-11-25 | 2023-03-24 | 北京力控元通科技有限公司 | 一种脚本编译方法、装置及电子设备 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1540517A (zh) * | 2003-04-21 | 2004-10-27 | 微软公司 | Just-My-Code调试技术 |
CN101241444A (zh) * | 2008-02-21 | 2008-08-13 | 上海交通大学 | 用于动态二进制翻译的调试方法 |
CN101482845A (zh) * | 2008-01-08 | 2009-07-15 | 国际商业机器公司 | 一种调用即时调试器的方法和系统 |
Family Cites Families (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6543011B1 (en) | 1999-07-15 | 2003-04-01 | International Business Machines Corporation | Method for event recording in java |
US6718535B1 (en) | 1999-07-30 | 2004-04-06 | Accenture Llp | System, method and article of manufacture for an activity framework design in an e-commerce based environment |
US7380235B1 (en) | 2003-06-27 | 2008-05-27 | Microsoft Corporation | Application program interface call replay tool |
JP4086791B2 (ja) * | 2004-01-28 | 2008-05-14 | インターナショナル・ビジネス・マシーンズ・コーポレーション | コンパイラプログラム、動的コンパイラプログラム、再現コンパイラプログラム、再現コンパイラ、コンパイル方法、及び記録媒体 |
US8397225B2 (en) * | 2008-04-24 | 2013-03-12 | International Business Machines Corporation | Optimizing just-in-time compiling for a java application executing on a compute node |
US20110078666A1 (en) | 2009-05-26 | 2011-03-31 | University Of California | System and Method for Reproducing Device Program Execution |
US8677329B2 (en) * | 2009-06-03 | 2014-03-18 | Apple Inc. | Methods and apparatuses for a compiler server |
US8701088B2 (en) * | 2010-05-28 | 2014-04-15 | Red Hat, Inc. | Generating backtracing information for software debugging of software programs running on virtual machines |
US8694967B2 (en) | 2010-06-11 | 2014-04-08 | Microsoft Corporation | User interface inventory |
US8769518B1 (en) | 2010-06-29 | 2014-07-01 | Ca, Inc. | Ensuring determinism during programmatic replay in a virtual machine |
US9116717B2 (en) * | 2011-05-27 | 2015-08-25 | Cylance Inc. | Run-time interception of software methods |
US8910126B2 (en) * | 2012-04-18 | 2014-12-09 | International Business Machines Corporation | Compiling source code for debugging with variable value restoration based on debugging user activity |
US20140304687A1 (en) | 2013-04-05 | 2014-10-09 | 2236008 Ontario, Inc. | Compilation validation |
JP2015043198A (ja) * | 2013-07-22 | 2015-03-05 | 株式会社東芝 | 解析システム、解析方法および解析プログラム |
US9292270B2 (en) * | 2014-03-27 | 2016-03-22 | Microsoft Technology Licensing, Llc | Supporting dynamic behavior in statically compiled programs |
-
2016
- 2016-07-31 US US15/224,586 patent/US10579498B2/en active Active
-
2017
- 2017-07-21 EP EP17745630.8A patent/EP3491527B1/en active Active
- 2017-07-21 CN CN201780047635.9A patent/CN109564540B/zh active Active
- 2017-07-21 WO PCT/US2017/043188 patent/WO2018026540A1/en unknown
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1540517A (zh) * | 2003-04-21 | 2004-10-27 | 微软公司 | Just-My-Code调试技术 |
CN101482845A (zh) * | 2008-01-08 | 2009-07-15 | 国际商业机器公司 | 一种调用即时调试器的方法和系统 |
CN101241444A (zh) * | 2008-02-21 | 2008-08-13 | 上海交通大学 | 用于动态二进制翻译的调试方法 |
Non-Patent Citations (3)
Title |
---|
《Random program generator for Java JIT compiler test system》;T. Yoshikawa等;《Third International Conference on Quality Software, 2003. Proceedings》;20040809;全文 * |
《Retargeting JIT compilers by using C-compiler generated executable code》;M. Anton Ertl等;《 Proceedings. 13th International Conference on Parallel Architecture and Compilation Techniques, 2004. PACT 2004》;20041018;全文 * |
《一种可用于编译器调试的目标代码验证方法》;琚小明等;《计算机应用》;20050721;第25卷(第7期);1674-1694页 * |
Also Published As
Publication number | Publication date |
---|---|
EP3491527B1 (en) | 2020-07-08 |
US10579498B2 (en) | 2020-03-03 |
EP3491527A1 (en) | 2019-06-05 |
WO2018026540A1 (en) | 2018-02-08 |
CN109564540A (zh) | 2019-04-02 |
US20180032420A1 (en) | 2018-02-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109564540B (zh) | 用于jit编译器的调试的系统、方法和设备 | |
CN110096338B (zh) | 智能合约执行方法、装置、设备及介质 | |
Sen et al. | Jalangi: A selective record-replay and dynamic analysis framework for JavaScript | |
Mey et al. | Score-P: A unified performance measurement system for petascale applications | |
US7937692B2 (en) | Methods and systems for complete static analysis of software for building a system | |
US8863082B2 (en) | Transformational context-aware data source management | |
US8930884B2 (en) | Efficient extraction of software dependencies from program code | |
EP3465428B1 (en) | Sample driven profile guided optimization with precise correlation | |
US8615750B1 (en) | Optimizing application compiling | |
JP5905577B2 (ja) | オペレーティングシステムのネイティブプログラミングインターフェイスの他のプログラミング言語の中への投射 | |
US9588872B2 (en) | Discovery of code paths | |
JP2020119348A (ja) | 解析プログラム、解析方法および解析装置 | |
KR101798705B1 (ko) | 유연성을 갖춘 메타데이터 구성 기법 | |
US11740875B2 (en) | Type inference in dynamic languages | |
JP7410269B2 (ja) | テスト・ベクタを使用した高水準コンストラクトの最適化の自動検証 | |
CN115705250A (zh) | 监测堆栈使用量以优化程序 | |
Brendel et al. | Generic library interception for improved performance measurement and insight | |
Kim et al. | Static dalvik bytecode optimization for Android applications | |
KR100772181B1 (ko) | 확장성 생성 언어 스키마 기반 개발도구 연동 방법 및시스템 | |
Andrzejak et al. | Confguru-A system for fully automated debugging of configuration errors | |
Troost | A testing tool visualizing and ensuring data-flow coverage | |
Safonov et al. | Aspect .NET—aspect-oriented toolkit for Microsoft .NET based on Phoenix and Whidbey | |
Bachala et al. | ReHAna: An Efficient Program Analysis Framework to Uncover Reflective Code in Android | |
Yannes | The Future of Android with Liquid Development | |
Brunner et al. | Towards Better Tool Support for Code Comprehension |
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 |