CN110275792B - 高级语言的异常处理方法、装置和系统 - Google Patents

高级语言的异常处理方法、装置和系统 Download PDF

Info

Publication number
CN110275792B
CN110275792B CN201910386224.3A CN201910386224A CN110275792B CN 110275792 B CN110275792 B CN 110275792B CN 201910386224 A CN201910386224 A CN 201910386224A CN 110275792 B CN110275792 B CN 110275792B
Authority
CN
China
Prior art keywords
exception
function
code
current
entry address
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
CN201910386224.3A
Other languages
English (en)
Other versions
CN110275792A (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.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies 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 Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Publication of CN110275792A publication Critical patent/CN110275792A/zh
Application granted granted Critical
Publication of CN110275792B publication Critical patent/CN110275792B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0793Remedial or corrective actions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Quality & Reliability (AREA)
  • Software Systems (AREA)
  • Executing Machine-Instructions (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本申请实施例提供了一种高级语言的异常处理方案,该方案包括高级语言的异常处理方法、装置及系统。其中,该异常处理系统包括编译器端和运行时端。该编译器端用于获取程序中的第一函数,生成尾声代码;当该第一函数包括扫除操作时,生成扫除代码;当有扫除代码时,在该扫除代码后串接该尾声代码,将所串接的代码的入口地址记录到该第一函数对应的异常表中;当无扫除代码时,将该尾声代码的入口地址记录到该第一函数对应的异常表中;当该第一函数使用异常处理器时,将该异常处理器的入口地址和该异常处理器能捕获的异常类型记录到该异常表中。该运行时端用于根据该编译器端生成的异常表进行异常处理。该方案能够适用于任何一种依赖于运行时环境而不直接由操作系统执行的高级语言,且在系统进行异常处理时,能够提高该系统的运行效率,节约该系统的开销。

Description

高级语言的异常处理方法、装置和系统
技术领域
本申请涉及计算机技术领域,尤其涉及一种高级语言的异常处理方法、装置和系统。
背景技术
高级语言,例如C++、Java、Python、Ruby、Scala和Swift等,需要支持异常处理(exception handling)机制。异常处理机制是一种程序运行故障恢复机制,能够较好地处理程序不能正常运行的情况。虽然在大多数情况下,由于异常处理机制的执行频率很低,所以其性能问题可以被忽略。但是,在某些情况下,异常处理机制会出现较高的执行频率。例如,为了实现某些特定的业务场景,如通过跳转来实现逻辑控制,程序员会采用异常处理机制。另外,大量的存量代码中也会多处采用异常处理机制。
目前,例如,C++语言在实现异常处理机制时,运行时代码和应用代码交叉混合执行,程序通过记录和访问栈映射(stack map)信息来恢复调用保存(callee-saved)寄存器;通过调用回卷恢复(_unwind_resume)函数重复抛同一个异常来实现内存回收。然而,运行时代码和应用代码混合执行,降低了缓存(cache)命中率,增加了系统开销。利用栈映射信息来恢复调用保存寄存器,同一个异常被多次抛出,这样的实现方式大大增加了系统开销,降低了系统运行效率。又例如,安卓运行时(android runtime,ART)异常处理流程中,程序在回栈时需要通过记录和访问栈映射信息来恢复调用保存寄存器。这种利用栈映射信息来恢复调用保存寄存器的方式,同样大大增加了系统开销,降低了系统运行效率。另外,ART采用垃圾回收(garbage collection,GC)机制进行内存回收,保证失效的资源被自由释放。在异常处理流程中无需执行运行时的扫除(clean-up)操作,如引用计数(referencecounting,RC)内存处理操作。因此,ART异常处理流程不适用异常处理时需要扫除操作的语言。
因此,高效且适用性广的异常处理方案值得研究。
发明内容
有鉴于此,本申请实施例提供了一种高级语言的异常处理方案,该方案包括高级语言的异常处理方法、装置和系统。该方案能够适用于任何一种依赖于运行时环境(runtime environment)而不直接由操作系统执行的高级语言,且在系统进行异常处理时,能够提高该系统的运行效率,节约该系统的开销。
第一方面,提供了一种高级语言的异常处理方法,该方法由编译器端执行,该方法包括:获取程序中的第一函数;当该第一函数不包括扫除操作时,生成尾声代码,将该尾声代码的入口地址记录到该第一函数对应的异常表中,其中,该尾声代码的入口地址指向该尾声代码的开端;当该第一函数包括扫除操作时,生成扫除代码和尾声代码;在该扫除代码后串接该尾声代码;将所串接的代码的入口地址记录到该异常表中;其中,该所串接的代码的入口地址指向该所串接的代码的开端;其中,该异常表用于运行时端的异常处理。
结合第一方面,一种可能的实施方式中,在该扫除代码的末尾添加该尾声代码。可选地,在该扫除代码的末尾添加跳转至该尾声代码的入口地址的指令。
结合第一方面或第一方面中任一可能的实施方式,一种可能的实施方式中,当该第一函数使用异常处理器时,将该异常处理器的入口地址和该异常处理器能捕获的异常类型记录到该异常表的第一信息中。
结合第一方面或第一方面中任一可能的实施方式,一种可能的实施方式中,该编译器端部署于计算机或移动终端中。
结合第一方面或第一方面中任一可能的实施方式,一种可能的实施方式中,该高级语言包括下述语言中的至少一种:C++、Java、Swift、Python、Ruby和Scala。
第二方面,提供了一种高级语言的异常处理方法,该方法由运行时端执行,该方法包括:执行程序中的第一函数,该第一函数抛出第一异常;其中该程序中包括至少一个函数,每个函数具有编译器端在编译过程中为其生成的异常表,该异常表中记录有对应函数中关于异常处理器的第一信息,以及与函数执行相关的入口地址,该入口地址指向函数中的尾声代码的开端,或扫除代码与尾声代码串接在一起的所串接的代码的开端;获取与该第一函数对应的函数调用栈,其中该函数调用栈的栈顶栈帧为该第一函数对应的第一函数栈帧;从该函数调用栈的栈顶开始朝向栈底,依次将各个栈帧作为当前栈帧进行遍历处理,该遍历处理包括,如果当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常不匹配,则将当前异常表中的入口地址作为前一栈帧的返回地址,直到当前栈帧为栈底栈帧时结束遍历处理;如果当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常匹配,则将当前异常表中与该第一异常对应的异常处理器的入口地址作为前一栈帧的返回地址,并跳出遍历处理;在结束遍历处理或跳出遍历处理后,返回该函数调用栈的栈顶栈帧中函数对应的异常表中的入口地址执行。
结合第二方面,一种可能的实施方式中,将当前异常表中的入口地址作为前一栈帧的返回地址,包括:将当前异常表中的入口地址赋值给存储该前一栈帧的返回地址的内存地址所指向的内存位置。
结合第二方面,一种可能的实施方式中,将当前异常表中的入口地址作为前一栈帧的返回地址,包括:将入口地址存储数组中下标对应于该当前栈帧的数组元素,赋值给返回地址存储数组中下标对应于该前一栈帧的数组元素所指向的内存位置。
结合第二方面或第二方面中任一可能的实施方式,一种可能的实施方式中,该当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常不匹配,包括:该当前异常表中的第一信息中未查找到异常处理器的入口地址;或者该当前异常表中的第一信息中查找到异常处理器的入口地址,但该第一信息中的异常处理器能捕获的异常类型与该第一异常的异常类型不匹配。
结合第二方面或第二方面中任一可能的实施方式,一种可能的实施方式中,该当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常匹配,包括:该当前异常表中的第一信息中查找到异常处理器的入口地址,且该第一信息中的异常处理器能捕获的异常类型与该第一异常的异常类型相匹配。
结合第二方面或第二方面中任一可能的实施方式,一种可能的实施方式中,在结束遍历处理后,返回该函数调用栈的栈顶栈帧中函数对应的异常表中的入口地址执行;并生成提示信息,该提示信息用于提示用户该第一函数抛出的异常未被捕获。
结合第二方面或第二方面中任一可能的实施方式,一种可能的实施方式中,该运行时端部署于计算机或移动终端中。
结合第二方面或第二方面中任一可能的实施方式,一种可能的实施方式中,该高级语言包括下述语言中的至少一种:C++、Java、Swift、Python、Ruby和Scala。
第三方面,提供了一种高级语言的异常处理装置,该装置设置于编译器端,该装置包括:函数获取单元,该函数获取单元配置为获取程序中的第一函数;第一记录单元,该第一记录单元配置为:当该第一函数不包括扫除操作时,生成尾声代码,将该尾声代码的入口地址记录到该第一函数对应的异常表中,其中,该尾声代码的入口地址指向该尾声代码的开端;第二记录单元,该第二记录单元配置为:当该第一函数包括扫除操作时,生成扫除代码和尾声代码;在该扫除代码后串接该尾声代码;将所串接的代码的入口地址记录到该异常表中;其中,该所串接的代码的入口地址指向该所串接的代码的开端;其中,该异常表用于运行时端的异常处理。
结合第三方面,一种可能的实施方式中,该第二记录单元还配置为:在该扫除代码的末尾添加该尾声代码。可选地,该第二记录单元还配置为:在该扫除代码的末尾添加跳转至该尾声代码的入口地址的指令。
结合第三方面或第三方面中任一可能的实施方式,一种可能的实施方式中,该装置还包括:第三记录单元,该第三记录单元配置为:当该第一函数使用异常处理器时,将该异常处理器的入口地址和该异常处理器能捕获的异常类型记录到该异常表的第一信息中。
结合第三方面或第三方面中任一可能的实施方式,一种可能的实施方式中,该编译器端部署于计算机或移动终端中。
结合第三方面或第三方面中任一可能的实施方式,一种可能的实施方式中,该高级语言包括下述语言中的至少一种:C++、Java、Swift、Python、Ruby和Scala。
第四方面,提供了一种高级语言的异常处理装置,该装置设置于运行时端,该装置包括:第一执行单元,该第一执行单元配置为:执行程序中的第一函数,该第一函数抛出第一异常;其中该程序中包括至少一个函数,每个函数具有编译器端在编译过程中为其生成的异常表,该异常表中记录有对应函数中关于异常处理器的第一信息,以及与函数执行相关的入口地址,该入口地址指向函数中的尾声代码的开端,或扫除代码与尾声代码串接在一起的所串接的代码的开端;函数调用栈获取单元,该函数调用栈获取单元配置为获取与该第一函数对应的函数调用栈,其中该函数调用栈的栈顶栈帧为该第一函数对应的第一函数栈帧;遍历处理单元,该遍历处理单元配置为:从该函数调用栈的栈顶开始朝向栈底,依次将各个栈帧作为当前栈帧进行遍历处理,该遍历处理包括,如果当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常不匹配,则将当前异常表中的入口地址作为前一栈帧的返回地址,直到当前栈帧为栈底栈帧时结束遍历处理;如果当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常匹配,则将当前异常表中与该第一异常对应的异常处理器的入口地址作为前一栈帧的返回地址,并跳出遍历处理;第二执行单元,该第二执行单元配置为:在该遍历处理单元结束遍历处理或跳出遍历处理后,返回该函数调用栈的栈顶栈帧中函数对应的异常表中的入口地址执行。
结合第四方面,一种可能的实施方式中,该遍历处理单元还配置为:将当前异常表中的入口地址赋值给存储该前一栈帧的返回地址的内存地址所指向的内存位置。
结合第四方面,一种可能的实施方式中,该遍历处理单元还配置为:将入口地址存储数组中下标对应于该当前栈帧的数组元素,赋值给返回地址存储数组中下标对应于该前一栈帧的数组元素所指向的内存位置。
结合第四方面或第四方面中任一可能的实施方式,一种可能的实施方式中,该当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常不匹配,包括:该当前异常表中的第一信息中未查找到异常处理器的入口地址;或者该当前异常表中的第一信息中查找到异常处理器的入口地址,但该第一信息中的异常处理器能捕获的异常类型与该第一异常的异常类型不匹配。
结合第四方面或第四方面中任一可能的实施方式,一种可能的实施方式中,该当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常匹配,包括:该当前异常表中的第一信息中查找到异常处理器的入口地址,且该第一信息中的异常处理器能捕获的异常类型与该第一异常的异常类型相匹配。
结合第四方面或第四方面中任一可能的实施方式,一种可能的实施方式中,该第二执行单元还配置为:在该遍历处理单元结束遍历处理后,返回该函数调用栈的栈顶栈帧中函数对应的异常表中的入口地址执行;并生成提示信息,该提示信息用于提示用户该第一函数抛出的异常未被捕获。
结合第四方面或第四方面中任一可能的实施方式,一种可能的实施方式中,该运行时端部署于计算机或移动终端中。
结合第四方面或第四方面中任一可能的实施方式,一种可能的实施方式中,该高级语言包括下述语言中的至少一种:C++、Java、Swift、Python、Ruby和Scala。
第五方面,提供了一种高级语言的异常处理系统,该系统部署于计算机或移动终端中,该系统包括上述第三方面以及第三方面的任意一种可能的实施方式中的设置于编译器端的装置,以及上述第四方面以及第四方面的任意一种可能的实施方式中的设置于运行时端的装置。
第六方面,提供了一种计算机可读存储介质,其上存储有计算机程序,当该计算机程序在计算机中执行时,使该计算机执行上述第一至第二方面中的任一方面以及第一至第二方面的任意一种可能的实施方式中所描述的方法。
第七方面,提供了一种计算设备,包括存储器和处理器,其特征在于,该存储器中存储有可执行代码,该处理器执行该可执行代码时,实现上述第一至第二方面中的任一方面以及第一至第二方面的任意一种可能的实施方式中所描述的方法。
附图说明
图1为本申请实施例提供的一种高级语言的异常处理方法流程示意图;
图2为本申请实施例提供的一种高级语言的异常处理方法流程示意图;
图3为本申请实施例提供的一种函数调用栈示意图;
图4为本申请实施例提供的一种高级语言的异常处理装置结构示意图;
图5为本申请实施例提供的一种高级语言的异常处理装置结构示意图;
图6为本申请实施例提供的一种高级语言的异常处理系统结构示意图。
具体实施方式
本申请实施例提供的高级语言的异常处理方案,可以应用于计算机或移动终端中,适用于任何一种依赖于运行时环境而不直接由操作系统执行的高级语言。运行时环境,是指一种运行码在目标机器上运行的环境。运行时环境包括但不限于:公共语言运行时(common language runtime,CLR),Java虚拟机,ART和C++运行时等。高级语言包括但不限于:C++、Java、Swift、Python、Ruby和Scala等。
下面结合附图对本申请实施例提供的方案进行描述。
图1为本申请实施例提供的一种高级语言的异常处理方法流程图。该方法由编译器端执行,生成的异常表用于运行时端的异常处理。应理解,编译器端和运行时端可以一起部署于同一计算机或移动终端中,也可以分开部署,例如,编译器端部署于计算机中,运行时端部署于移动终端中。
该方法可以包括以下部分:
S101,获取程序中的第一函数。
该程序可以是采用任何一种合适的高级语言编写,例如C++、Java、Swift、Python、Ruby和Scala等。该程序包括至少一个函数,例如第一函数。
S102,判断该第一函数是否包括扫除操作。
扫除操作是一种内存管理操作,保证失效的资源被正确释放。扫除操作包括但不限于:GC机制、RC操作、释放(free)操作、析构(destructor)操作等。
S103,当该第一函数不包括扫除操作时,生成尾声(epilogue)代码,将该尾声代码的入口地址记录到该第一函数对应的异常表中。
尾声代码是编译器端在函数,例如第一函数的尾部生成的代码,它用于结束当前函数的调用,恢复函数调用前的寄存器,也即回到先前的函数。
异常表(exception_table)是编译器端在编译过程中为函数,例如第一函数生成的表,该异常表用于运行时端的异常处理。
在一个实施例中,该尾声代码的入口地址指向该尾声代码的开端。
将该尾声代码的入口地址记录到该第一函数对应的异常表中,可以使得运行时端在执行第一函数时,利用该异常表中的记录的尾声代码的入口地址,直接执行该第一函数的尾声代码,由此恢复该第一函数的调用者(caller)函数在调用该第一函数时保存的调用保存寄存器,返回到调用者函数继续执行,而无需利用栈映射信息来恢复调用保存寄存器,由此节约了系统开销,提高了系统运行效率。
S104,当该第一函数包括扫除操作时,生成扫除代码和尾声代码;在该扫除代码后串接该尾声代码,将所串接的代码的入口地址记录到该第一函数对应的异常表中。
在一个实施例中,在该扫除代码的末尾添加该尾声代码。可选地,在该扫除代码的末尾添加跳转至该尾声代码的入口地址的指令。
将扫除代码和尾声代码所串接的代码的入口地址记录到该第一函数对应的异常表中,可以使得运行时端在执行该第一函数时,利用该异常表中记录的所串接的代码的入口地址,直接执行第一函数的尾声代码,由此恢复该第一函数的调用者函数在调用该第一函数时保存的调用保存寄存器,返回到调用者函数继续执行。通过此方式,避免了通过记录和访问栈映射信息来恢复调用保存寄存器,由此节约了系统开销。另外,通过此方式,也避免了通过调用回卷恢复函数重复抛同一个异常来实现内存回收,使得运行时代码和应用代码可以分开执行,提高了缓存命中率,也提高了系统运行效率。
在一个实施例中,当该第一函数使用异常处理器(exception handler)时,将该异常处理器的入口地址和该异常处理器能捕获的异常类型记录到该异常表的第一信息中。
应理解,异常处理器的入口地址和异常处理器能捕获的异常类型可以记录在同一个表的第一信息中,也可以分开记录在两个表的第一信息中。例如,将异常处理器的入口地址记录到该第一函数对应的第一异常表的第一信息中,将该异常处理器能捕获的异常类型记录到该第一函数对应的第二异常表的第一信息中。在此,需要理解的是,本文中的“第一”,“第二”仅仅是为了表述的清楚而对类似概念进行的标记和区分,并不具有其他限定作用。
下面给出一个具体的实施例,来呈现编译器端如何生成扫除代码与尾声代码所串接的代码,以及如何将所串接的代码的入口地址记录到相应的异常表中:
Figure BDA0002054939240000061
在上述示例中,根据图1所示的方法,编译器端生成入口地址为.label.LFunction_29V5的尾声代码和入口地址为.label.LFunction_29V4的扫除代码,将尾声代码的入口地
址.label.LFunction_29V5通过添加跳转指令b串接到扫除代码段的末尾。然后,将所串接的代码的入口地址,也即扫除代码的入口地址.label.LFunction_29V4记录到入口地址为.label.LFunction_29V3的异常表中。
图2为本申请实施例提供的一种高级语言的异常处理方法流程图。该方法由运行时端执行,可以包括以下部分:
S201,执行程序中的第一函数,该第一函数抛出第一异常。
在一个实施例中,第一函数利用throw语句抛出一个异常。
S202,获取与该第一函数对应的函数调用栈,该函数调用栈的栈顶栈帧为该第一函数对应的第一函数栈帧。
运行时端执行程序,在调用到该程序中的每个函数时,操作系统都为该函数创建一个独立的函数栈帧,该栈帧中维持着执行该函数所需要的各种信息,例如,保存该函数的返回地址。这些函数栈帧依次进入函数调用栈中,在该函数调用栈的栈底是第一个进栈的函数栈帧,栈顶是最后一个进栈的函数栈帧。在执行完当前栈帧对应的函数,也即被调用(callee)函数,返回下一栈帧对应的函数,也即调用者函数时,该被调用函数根据它自身的返回地址,返回到调用者函数继续执行。
在一个实施例中,运行时端执行程序,执行到该程序中的第一函数时,操作系统为该第一函数创建第一函数栈帧,在该第一函数栈帧中保存该第一函数的返回地址,并将该第一函数栈帧添加到与该第一函数对应的函数调用栈的栈顶。运行时端获取该函数调用栈。
S202,从该函数调用栈的栈顶开始朝向栈底,依次将各个栈帧作为当前栈帧进行遍历处理,根据当前栈帧中当前函数对应的当前异常表,确定结束遍历处理或跳出遍历处理。
在一个实施例中,如果当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常不匹配,则将当前异常表中的入口地址作为前一栈帧的返回地址,直到当前栈帧为栈底栈帧时结束遍历处理;或者,如果当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常匹配,则将当前异常表中与该第一异常对应的异常处理器的入口地址作为前一栈帧的返回地址,并跳出遍历处理。
在一个实施例中,如果当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常不匹配,则将当前异常表中记录的指向函数中的尾声代码的开端的尾声代码的入口地址作为前一栈帧的返回地址。
在一个实施例中,如果当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常不匹配,则将当前异常表中记录的指向扫除代码与尾声代码串接在一起的所串接的代码的开端的所串接的代码的入口地址作为前一栈帧的返回地址。
在一个实施例中,将当前异常表中的入口地址赋值给存储该前一栈帧的返回地址的内存地址所指向的内存位置。
在一个实施例中,如果该当前异常表中的第一信息中未查找到异常处理器的入口地址,则该当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常不匹配。
在一个实施例中,如果该当前异常表中的第一信息中查找到异常处理器的入口地址,但该第一信息中的异常处理器能捕获的异常类型与该第一异常的异常类型不匹配,则该当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常不匹配。
在一个实施例中,如果该当前异常表中的第一信息中查找到异常处理器的入口地址,且该第一信息中的该异常处理器能捕获的异常类型与该第一异常的异常类型相匹配,则该当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常匹配。
在一个实施例中,运行时端将该函数调用栈的栈顶栈帧作为当前栈帧,并执行下述步骤:
步骤1,将存储该当前栈帧的返回地址的内存地址记录到返回地址存储数组中;
步骤2,如果当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常不匹配,则将当前异常表中的入口地址记录到入口地址存储数组中,并跳转到步骤3执行;如果当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常匹配,则将当前异常表中与该第一异常对应的异常处理器的入口地址存储到入口地址存储数组中,并跳转到步骤4执行;
步骤3,解析调用者栈帧作为当前栈帧;如果当前栈帧为栈底栈帧,则跳转到步骤4执行,否则跳转到步骤1执行;
步骤4,从该入口地址存储数组的第二个数组下标开始朝向最后一个数组下标,依次将各个数组下标作为当前数组下标进行赋值处理,该赋值处理包括,将该入口地址存储数组的当前数组下标所对应的数组元素赋值给该返回地址数组的当前数组下标的前一个数组下标所对应的数组元素所指向的内存位置,直到当前数组下标为最后一个数组下标时,结束赋值处理。
例如,入口地址存储数组为:en_addr[0]、en_addr[1]和en_addr[2],返回地址存储数组为re_addr[0]、re_addr[1]和re_addr[2],那么,在进行赋值处理时,将en_addr[1]中存储的入口地址赋值给re_addr[0]所存储的地址所指向的内存位置,将en_addr[2]中存储的入口地址赋值给re_addr[1]所存储的地址所指向的内存位置。
上述实施例描述了进行遍历处理的一种具体实现方式,但应理解的是,该具体实现方式,仅是示例性的,也可以采用其他实现方式,例如,可以采用表格的方式来记录入口地址和返回地址,并进行相应的赋值处理。
通过遍历处理,将当前异常表中的入口地址作为前一栈帧的返回地址,由此构成了一条“尾声链”。运行时端通过执行该“尾声链”,自动恢复各个尾声代码所对应的函数的调用者函数所需要的调用保存寄存器,由此避免了因记录和访问栈映射信息恢复调用保存寄存器所造成的系统开销。另外,运行时端在执行包括扫除操作的函数时,通过执行该“尾声链”,不仅避免了因记录和访问栈映射信息来恢复调用保存寄存器所造成的系统开销;而且,还避免了因调用回卷恢复函数重复抛同一个异常来实现内存回收所造成的运行时代码和应用代码混合执行,从而提高了缓存命中率,也提高了系统效率。
S204,在结束遍历处理或跳出遍历处理后,返回该函数调用栈的栈顶栈帧中函数对应的异常表中的入口地址执行。
在一个实施例中,在结束遍历处理后,返回该函数调用栈的栈顶栈帧中函数对应的异常表中的入口地址执行,并生成提示信息,该提示信息用于提示用户该第一函数抛出的异常未被捕获。
下面给出一个具体的实施例,来呈现编译器端如何根据Java源代码来生成尾声代码与扫除代码所串接的代码,以及如何将所串接的代码的入口地址、异常表的入口地址和异常处理器能捕获的异常类型记录到相应的异常表中。以及,运行时端如何利用该编译器端生成的异常表进行异常处理。
Java源代码:
Figure BDA0002054939240000081
Figure BDA0002054939240000091
编译器端为各个函数生成的扫除代码与尾声代码所串接的代码,以及相应的异常表。
Figure BDA0002054939240000092
Figure BDA0002054939240000101
Figure BDA0002054939240000111
在上述示例中,根据图1所示的方法,编译器端为函数ThrowException生成入口地址为.label.LNewChainedExceptions_7CThrowException_29V5的尾声代码和入口地址为.label.LNewChainedExceptions_7CThrowException_29V4的扫除代码,将尾声代码的入口地址.label.LNewChainedExceptions_7CThrowException_29V5通过添加跳转指令b串接到扫除代码段的末尾。然后,将所串接的代码的入口地址,也即扫除代码的入口地址.label.LNewChainedExceptions_7CThrowException_29V4记录到函数ThrowException对应的异常表中。
根据图1所示的方法,编译器端为函数CreateObject生成入口地址为.label.LNewChainedExceptions_7CCreateObject_29V5的尾声代码和入口地址为.label.LNewChainedExceptions_7CCreateObject_29V4的扫除代码,将尾声代码的入口地址.label.LNewChainedExceptions_7CCreateObject_29V5通过添加跳转指令b串接到扫除代码段的末尾。然后,将所串接的代码的入口地址,也即扫除代码的入口地址.label.LNewChainedExceptions_7CCreateObject_29V4记录到函数CreateObject对应的异常表中。
根据图1所示的方法,编译器端为函数Main生成入口地址为.label.LNewChainedExceptions_7Cmain_29V19的尾声代码和入口地址为.label.LNewChainedExceptions_7Cmain_29V9的扫除代码,将尾声代码的入口地址.label.LNewChainedExceptions_7Cmain_29V19通过添加跳转指令b串接到扫除代码段的末尾。然后,将所串接的代码的入口地址,也即扫除代码的入口地址.label.LNewChainedExceptions_7Cmain_29V9记录到函数Main对应的异常表中。另外,将异常处理器的入口地址.label.LNewChainedExceptions_7Cmain_29V17记录到函数Main对应的第一异常表的第一信息中,将异常处理器能捕获的异常类型.ref.__cinf_Ljava_2Flang_2FIllegalStateException_3B和.ref.__cinf_Ljava_2Flang_2FIllegalArgumentException_3B记录到函数Main对应的第二异常表的第一信息中。
应理解的是,尽管上述示例中将异常处理器的入口地址和异常处理器能捕获的异常类型分开记录到第一异常表的第一信息中和第二异常表的第一信息中,但是,将异常处理器的入口地址.label.LNewChainedExceptions_7Cmain_29V17和异常处理器能捕获的异常类型.ref.__cinf_Ljava_2Flang_2FIllegalStateException_3B和.ref.__cinf_Ljava_2Flang_2FIllegalArgumentException_3B记录到函数Main对应的一个异常表的第一信息中也是可以的。
运行时端执行程序,执行到函数ThrowException时,操作系统建立如图3所示的函数调用栈。
函数ThrowException抛出异常后,运行时端执行下述处理流程:
1.查找函数调用栈的栈顶函数LNewChainedExceptions_7CThrowException_29V的异常表,该函数不能捕获IllegalStateException类型异常。获取该异常表中扫除代码和尾声代码串接在一起的所串接的代码的入口地址.label.LNewChainedExceptions_7CThrowException_29V4,记录所串接的代码的入口地址。
2.回栈到函数LNewChainedExceptions_7CCreateObject_29V所在栈帧。查找函数LNewChainedExceptions_7CCreateObject_29V的异常表,该函数不能捕获IllegalStateException类型异常。获取该异常表中扫除代码和尾声代码串接在一起的所串接的代码的入口地址.label.LNewChainedExceptions_7CCreateObject_29V4,记录所串接的代码的入口地址。
3.回栈到函数LNewChainedExceptions_7Cmain_29V所在栈帧。查找函数LNewChainedExceptions_7Cmain_29V的异常表,该函数能捕获IllegalStateException类型异常。获取该异常表中记录的异常处理器的入口地址.label.LNewChainedExceptions_7Cmain_29V17,记录该异常处理器的入口地址。
4.修改函数LNewChainedExceptions_7CThrowException_29V的所串接的代码的返回地址为其调用者函数LNewChainedExceptions_7CCreateObject_29V的所串接的代码的入口地址。修改函数LNewChainedExceptions_7CCreateObject_29V的所串接的代码的返回地址为其调用者函数LNewChainedExceptions_7Cmain_29V的异常处理器的入口地址。
5.返回函数调用栈的栈顶函数LNewChainedExceptions_7CThrowException_29V的所串接的代码的入口地址.label.LNewChainedExceptions_7CThrowException_29V4,从该地址恢复执行,函数LNewChainedExceptions_7CThrowException_29V的扫除代码和尾声代码执行完成后,执行函数LNewChainedExceptions_7CCreateObject_29V的扫除代码和尾声代码,最后执行函数LNewChainedExceptions_7Cmain_29V的异常处理器。
上述实施例中,通过从函数调用栈的栈顶开始朝向栈底,依次将各个栈帧作为当前栈帧进行遍历处理,将当前异常表中的尾声代码的入口地址或扫除代码和尾声代码串接后的所串接的代码的入口地址,作为前一栈帧的返回地址,由此构成了一条“尾声链”。运行时端通过执行该“尾声链”,自动恢复各个尾声代码所对应的函数的调用者函数所需要的调用保存寄存器,由此避免了因记录和访问栈映射信息恢复调用保存寄存器所造成的系统开销。另外,运行时端在执行包括扫除操作的函数时,通过执行该“尾声链”,不仅避免了因记录和访问栈映射信息来恢复调用保存寄存器所造成的系统开销;而且还避免了因调用回卷恢复函数重复抛同一个异常来实现内存回收所造成的运行时代码和应用代码混合执行,从而提高了缓存命中率,也提高了系统效率。
上文详细描述了根据本申请实施例的一种高级语言的异常处理方法,下面将详细描述根据本申请实施例的一种高级语言的异常处理装置,该装置设置于编译器端或运行时端。
图4为本申请实施例提供的一种高级语言的异常处理装置结构示意图,该异常处理装置设置于编译器端,该编译器端部署于计算机或移动终端中。如图4所示,异常处理装置400包括函数获取单元401,第一记录单元402和第二记录单元403。在一个实施例中,异常处理装置400还包括第三记录单元404。
函数获取单元401,配置为获取程序中的第一函数。第一记录单元402,配置为当该第一函数不包括扫除操作时,生成尾声代码,将该尾声代码的入口地址记录到该第一函数对应的异常表中。该尾声代码的入口地址指向该尾声代码的开端。第二记录单元403,配置为当该第一函数包括扫除操作时,生成扫除代码和尾声代码;在该扫除代码后串接该尾声代码;将所串接的代码的入口地址记录到该异常表中。该所串接的代码的入口地址指向该所串接的代码的开端。第三记录单元404,配置为当该第一函数使用异常处理器时,将该异常处理器的入口地址和该异常处理器能捕获的异常类型记录到该异常表的第一信息中。该异常表用于运行时端的异常处理。
在一个实施例中,第二记录单元403还配置为在该扫除代码的末尾添加该尾声代码。可选地,第二记录单元403还配置为在该扫除代码的末尾添加跳转至该尾声代码的入口地址的指令。
图5为本申请实施例提供的一种高级语言的异常处理装置结构示意图,该异常处理装置设置于运行时端,该运行时端部署于计算机或移动终端中。如图5所示,异常处理装置500包括第一执行单元501,函数调用栈获取单元502,遍历处理单元503,以及第二执行单元504。
第一执行单元501,配置为执行程序中的第一函数,该第一函数抛出第一异常。该程序中包括至少一个函数,每个函数具有编译器端在编译过程中为其生成的异常表,该异常表中记录有对应函数中关于异常处理器的第一信息,以及与函数执行相关的入口地址。该入口地址指向函数中的尾声代码的开端,或扫除代码与尾声代码串接在一起的所串接的代码的开端。
函数调用栈获取单元502,配置为获取与该第一函数对应的函数调用栈。该函数调用栈的栈顶栈帧为该第一函数对应的第一函数栈帧。
遍历处理单元503,配置为:从该函数调用栈的栈顶开始朝向栈底,依次将各个栈帧作为当前栈帧进行遍历处理,该遍历处理包括,如果当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常不匹配,则将当前异常表中的入口地址作为前一栈帧的返回地址,直到当前栈帧为栈底栈帧时结束遍历处理;如果当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常匹配,则将当前异常表中与该第一异常对应的异常处理器的入口地址作为前一栈帧的返回地址,并跳出遍历处理。
第二执行单元504,配置为:在遍历处理单元503结束遍历处理或跳出遍历处理后,返回该函数调用栈的栈顶栈帧中函数对应的异常表中的入口地址执行。
在一个实施例中,遍历处理单元503还配置为将当前异常表中的入口地址赋值给存储前一栈帧的返回地址的内存地址所指向的内存位置。
在一个实施例中,该当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常不匹配,包括:该当前异常表中的第一信息中未查找到异常处理器的入口地址;或者该当前异常表中的第一信息中查找到异常处理器的入口地址,但该第一信息中的异常处理器能捕获的异常类型与该第一异常的异常类型不匹配。
在一个实施例中,该当前栈帧中当前函数对应的当前异常表中的第一信息与该第一异常匹配,包括:该当前异常表中的第一信息中查找到异常处理器的入口地址,且该第一信息中的异常处理器能捕获的异常类型与该第一异常的异常类型相匹配。
在一个实施例中,在遍历处理单元503结束遍历处理后,第二执行单元504还配置为:返回该函数调用栈的栈顶栈帧中函数对应的异常表中的入口地址执行;并生成提示信息,该提示信息用于提示用户该第一函数抛出的异常未被捕获。
应理解的是,编译器端和运行时端可以一起部署于计算机或移动终端中,也可以分开部署,例如,编译器端部署于计算机中,运行时端部署于移动终端中。
图6为本申请实施例提供的一种高级语言的异常处理系统结构示意图,该系统部署于计算机或移动终端中。异常处理系统600,包括编译器端601和运行时端602。编译器端601上设置有图4所示的异常处理装置400,运行时端602上设置有图5所示的异常处理装置500。为了简要起见,在此不再赘述。
在一个实施例中,还提供一种计算机可读存储介质,其上存储有计算机程序,当该计算机程序在计算机中执行时,令计算机执行结合图1到图2所描述的方法。
在一个实施例中,还提供一种计算设备,包括存储器和处理器,该存储器中存储有可执行代码,该处理器执行该可执行代码时,实现结合图1到图2所描述的方法。
在上述各个本申请实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。该计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行该计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。该计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。该计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读介质向另一个计算机可读介质传输,例如,该计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。该计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。该可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如,固态硬盘)等。
以上所述的具体实施方式,对本申请的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本申请的具体实施方式而已,并不用于限定本申请的保护范围,凡在本申请的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本申请的保护范围之内。

Claims (39)

1.一种高级语言的异常处理方法,所述方法由编译器端执行,其特征在于,所述方法包括:
获取程序中的第一函数;
当所述第一函数不包括扫除操作时,生成尾声代码,将所述尾声代码的入口地址记录到所述第一函数对应的异常表中,其中,所述尾声代码的入口地址指向所述尾声代码的开端;
当所述第一函数包括扫除操作时,生成扫除代码和尾声代码;在所述扫除代码后串接所述尾声代码;将所串接的代码的入口地址记录到所述异常表中;其中,所述所串接的代码的入口地址指向所述所串接的代码的开端;
其中,所述异常表用于运行时端的异常处理;所述扫除操作用于保证失效的资源被正确释放;所述扫除代码用于实现所述扫除操作;所述尾声代码用于结束所述第一函数的调用,恢复所述第一函数调用前的寄存器。
2.根据权利要求1所述的方法,其特征在于,所述在所述扫除代码后串接所述尾声代码包括:
在所述扫除代码的末尾添加所述尾声代码。
3.根据权利要求2所述的方法,其特征在于,所述在所述扫除代码后串接所述尾声代码包括:
在所述扫除代码的末尾添加跳转至所述尾声代码的入口地址的指令。
4.根据权利要求1-3任一项所述的方法,其特征在于,所述方法还包括:
当所述第一函数使用异常处理器时,将所述异常处理器的入口地址和所述异常处理器能捕获的异常类型记录到所述异常表的第一信息中。
5.根据权利要求1-3任一项所述的方法,其特征在于,所述编译器端部署于计算机或移动终端中。
6.根据权利要求4所述的方法,其特征在于,所述编译器端部署于计算机或移动终端中。
7.根据权利要求1-3任一项所述的方法,其特征在于,所述高级语言包括下述语言中的至少一种:C++、Java、Swift、Python、Ruby和Scala。
8.根据权利要求4所述的方法,其特征在于,所述高级语言包括下述语言中的至少一种:C++、Java、Swift、Python、Ruby和Scala。
9.一种高级语言的异常处理方法,所述方法由运行时端执行,其特征在于,所述方法包括:
执行程序中的第一函数,所述第一函数抛出第一异常;其中所述程序中包括至少一个函数,每个函数具有编译器端在编译过程中为其生成的异常表,所述异常表中记录有对应函数中关于异常处理器的第一信息,以及与函数执行相关的入口地址,所述入口地址指向函数中的尾声代码的开端,或扫除代码与尾声代码串接在一起的所串接的代码的开端;其中,所述扫除代码用于实现扫除操作,所述扫除操作用于保证失效的资源被正确释放;所述尾声代码用于结束所述第一函数的调用,恢复所述第一函数调用前的寄存器;
获取与所述第一函数对应的函数调用栈,其中所述函数调用栈的栈顶栈帧为所述第一函数对应的第一函数栈帧;
从所述函数调用栈的栈顶开始朝向栈底,依次将各个栈帧作为当前栈帧进行遍历处理,所述遍历处理包括,如果当前栈帧中当前函数对应的当前异常表中的第一信息与所述第一异常不匹配,则将当前异常表中的入口地址作为前一栈帧的返回地址,直到当前栈帧为栈底栈帧时结束遍历处理;
如果当前栈帧中当前函数对应的当前异常表中的第一信息与所述第一异常匹配,则将当前异常表中与所述第一异常对应的异常处理器的入口地址作为前一栈帧的返回地址,并跳出遍历处理;
在结束遍历处理或跳出遍历处理后,返回所述函数调用栈的栈顶栈帧中函数对应的异常表中的入口地址执行。
10.根据权利要求9所述的方法,其特征在于,所述将当前异常表中的入口地址作为前一栈帧的返回地址,包括:
将当前异常表中的入口地址赋值给存储所述前一栈帧的返回地址的内存地址所指向的内存位置。
11.根据权利要求9所述的方法,其特征在于,所述将当前异常表中的入口地址作为前一栈帧的返回地址,包括:
将入口地址存储数组中下标对应于所述当前栈帧的数组元素,赋值给返回地址存储数组中下标对应于所述前一栈帧的数组元素所指向的内存位置。
12.根据权利要求9-11任一项所述的方法,其特征在于,所述当前栈帧中当前函数对应的当前异常表中的第一信息与所述第一异常不匹配,包括:
所述当前异常表中的第一信息中未查找到异常处理器的入口地址;或者
所述当前异常表中的第一信息中查找到异常处理器的入口地址,但所述第一信息中的异常处理器能捕获的异常类型与所述第一异常的异常类型不匹配。
13.根据权利要求9-11任一项所述的方法,其特征在于,所述当前栈帧中当前函数对应的当前异常表中的第一信息与所述第一异常匹配,包括:
所述当前异常表中的第一信息中查找到异常处理器的入口地址,且所述第一信息中的异常处理器能捕获的异常类型与所述第一异常的异常类型相匹配。
14.根据权利要求9-11任一项所述的方法,其特征在于,所述在结束遍历处理或跳出遍历处理后,返回所述函数调用栈的栈顶栈帧中函数对应的异常表中的入口地址执行包括:
在结束遍历处理后,返回所述函数调用栈的栈顶栈帧中函数对应的异常表中的入口地址执行;并生成提示信息,所述提示信息用于提示用户所述第一函数抛出的异常未被捕获。
15.根据权利要求9-11任一项所述的方法,其特征在于,所述运行时端部署于计算机或移动终端中。
16.根据权利要求12所述的方法,其特征在于,所述运行时端部署于计算机或移动终端中。
17.根据权利要求13所述的方法,其特征在于,所述运行时端部署于计算机或移动终端中。
18.根据权利要求14所述的方法,其特征在于,所述运行时端部署于计算机或移动终端中。
19.根据权利要求9-11任一项所述的方法,其特征在于,所述高级语言包括下述语言中的至少一种:C++、Java、Swift、Python、Ruby和Scala。
20.根据权利要求12所述的方法,其特征在于,所述高级语言包括下述语言中的至少一种:C++、Java、Swift、Python、Ruby和Scala。
21.根据权利要求13所述的方法,其特征在于,所述高级语言包括下述语言中的至少一种:C++、Java、Swift、Python、Ruby和Scala。
22.根据权利要求14所述的方法,其特征在于,所述高级语言包括下述语言中的至少一种:C++、Java、Swift、Python、Ruby和Scala。
23.一种高级语言的异常处理装置,所述装置设置于编译器端,其特征在于,所述装置包括:
函数获取单元,所述函数获取单元配置为获取程序中的第一函数;
第一记录单元,所述第一记录单元配置为:当所述第一函数不包括扫除操作时,生成尾声代码,将所述尾声代码的入口地址记录到所述第一函数对应的异常表中,其中,所述尾声代码的入口地址指向所述尾声代码的开端;
第二记录单元,所述第二记录单元配置为:当所述第一函数包括扫除操作时,生成扫除代码和尾声代码;在所述扫除代码后串接所述尾声代码;将所串接的代码的入口地址记录到所述异常表中;其中,所述所串接的代码的入口地址指向所述所串接的代码的开端;
其中,所述异常表用于运行时端的异常处理;所述扫除操作用于保证失效的资源被正确释放;所述扫除代码用于实现所述扫除操作;所述尾声代码用于结束所述第一函数的调用,恢复所述第一函数调用前的寄存器。
24.根据权利要求23所述的装置,其特征在于,所述第二记录单元还配置为:在所述扫除代码的末尾添加所述尾声代码。
25.根据权利要求23所述的装置,其特征在于,所述第二记录单元还配置为:在所述扫除代码的末尾添加跳转至所述尾声代码的入口地址的指令。
26.根据权利要求23-25任一项所述的装置,其特征在于,所述装置还包括:
第三记录单元,所述第三记录单元配置为:当所述第一函数使用异常处理器时,将所述异常处理器的入口地址和所述异常处理器能捕获的异常类型记录到所述异常表的第一信息中。
27.根据权利要求23-25任一项所述的装置,其特征在于,所述编译器端部署于计算机或移动终端中。
28.根据权利要求23-25任一项所述的装置,其特征在于,所述高级语言包括下述语言中的至少一种:C++、Java、Swift、Python、Ruby和Scala。
29.一种高级语言的异常处理装置,所述装置设置于运行时端,其特征在于,所述装置包括:
第一执行单元,所述第一执行单元配置为:执行程序中的第一函数,所述第一函数抛出第一异常;其中所述程序中包括至少一个函数,每个函数具有编译器端在编译过程中为其生成的异常表,所述异常表中记录有对应函数中关于异常处理器的第一信息,以及与函数执行相关的入口地址,所述入口地址指向函数中的尾声代码的开端,或扫除代码与尾声代码串接在一起的所串接的代码的开端;其中,所述扫除代码用于实现扫除操作,所述扫除操作用于保证失效的资源被正确释放;所述尾声代码用于结束所述第一函数的调用,恢复所述第一函数调用前的寄存器;
函数调用栈获取单元,所述函数调用栈获取单元配置为获取与所述第一函数对应的函数调用栈,其中所述函数调用栈的栈顶栈帧为所述第一函数对应的第一函数栈帧;
遍历处理单元,所述遍历处理单元配置为:从所述函数调用栈的栈顶开始朝向栈底,依次将各个栈帧作为当前栈帧进行遍历处理,所述遍历处理包括,如果当前栈帧中当前函数对应的当前异常表中的第一信息与所述第一异常不匹配,则将当前异常表中的入口地址作为前一栈帧的返回地址,直到当前栈帧为栈底栈帧时结束遍历处理;如果当前栈帧中当前函数对应的当前异常表中的第一信息与所述第一异常匹配,则将当前异常表中与所述第一异常对应的异常处理器的入口地址作为前一栈帧的返回地址,并跳出遍历处理;
第二执行单元,所述第二执行单元配置为:在所述遍历处理单元结束遍历处理或跳出遍历处理后,返回所述函数调用栈的栈顶栈帧中函数对应的异常表中的入口地址执行。
30.根据权利要求29所述的装置,其特征在于,所述遍历处理单元还配置为:将当前异常表中的入口地址赋值给存储所述前一栈帧的返回地址的内存地址所指向的内存位置。
31.根据权利要求29所述的装置,其特征在于,所述遍历处理单元还配置为:将入口地址存储数组中下标对应于所述当前栈帧的数组元素,赋值给返回地址存储数组中下标对应于所述前一栈帧的数组元素所指向的内存位置。
32.根据权利要求29-31任一项所述的装置,其特征在于,所述当前栈帧中当前函数对应的当前异常表中的第一信息与所述第一异常不匹配,包括:
所述当前异常表中的第一信息中未查找到异常处理器的入口地址;或者
所述当前异常表中的第一信息中查找到异常处理器的入口地址,但所述第一信息中的异常处理器能捕获的异常类型与所述第一异常的异常类型不匹配。
33.根据权利要求29-31任一项所述的装置,其特征在于,所述当前栈帧中当前函数对应的当前异常表中的第一信息与所述第一异常匹配,包括:
所述当前异常表中的第一信息中查找到异常处理器的入口地址,且所述第一信息中的异常处理器能捕获的异常类型与所述第一异常的异常类型相匹配。
34.根据权利要求29-31任一项所述的装置,其特征在于,所述第二执行单元还配置为:在所述遍历处理单元结束遍历处理后,返回所述函数调用栈的栈顶栈帧中函数对应的异常表中的入口地址执行;并生成提示信息,所述提示信息用于提示用户所述第一函数抛出的异常未被捕获。
35.根据权利要求29-31任一项所述的装置,其特征在于,所述运行时端部署于计算机或移动终端中。
36.根据权利要求29-31任一项所述的装置,其特征在于,所述高级语言包括下述语言中的至少一种:C++、Java、Swift、Python、Ruby和Scala。
37.一种高级语言的异常处理系统,所述系统部署于计算机或移动终端中,其特征在于,所述系统包括权利要求23-28中任一项所述的设置于编译器端的装置,以及权利要求29-36中任一项所述的设置于运行时端的装置。
38.一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,使所述计算机执行权利要求1-22中任一项所述的方法。
39.一种计算设备,包括存储器和处理器,其特征在于,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现权利要求1-22中任一项所述的方法。
CN201910386224.3A 2019-03-05 2019-05-09 高级语言的异常处理方法、装置和系统 Active CN110275792B (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
CN2019101653830 2019-03-05
CN201910165383 2019-03-05

Publications (2)

Publication Number Publication Date
CN110275792A CN110275792A (zh) 2019-09-24
CN110275792B true CN110275792B (zh) 2020-10-23

Family

ID=67959138

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910386224.3A Active CN110275792B (zh) 2019-03-05 2019-05-09 高级语言的异常处理方法、装置和系统

Country Status (1)

Country Link
CN (1) CN110275792B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115774583A (zh) * 2021-09-08 2023-03-10 华为技术有限公司 程序调用栈创建方法、栈回溯方法和装置

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6817014B2 (en) * 2001-04-11 2004-11-09 Hewlett-Packard Development Company, L.P. Analysis of executable program code using compiler-generated function entry points and endpoints with other sources of function entry points and endpoints
CN102375957B (zh) * 2011-11-10 2014-05-14 西安电子科技大学 内核级return-oriented rootkits的防御方法
CN105224309B (zh) * 2015-09-02 2019-03-19 青岛中星微电子有限公司 一种调取函数的方法和装置
CN106326747B (zh) * 2016-08-26 2018-11-27 华中科技大学 一种针对rop攻击的检测方法

Also Published As

Publication number Publication date
CN110275792A (zh) 2019-09-24

Similar Documents

Publication Publication Date Title
US9811360B2 (en) Dynamic determination of application server runtime classloading
US8307352B2 (en) Classpath optimization in a Java runtime environment
US7406684B2 (en) Compiler, dynamic compiler, and replay compiler
US9104449B2 (en) Optimized execution of dynamic languages
US20080282238A1 (en) Static type for late binding
US9400667B2 (en) String cache file for optimizing memory usage in a Java virtual machine
US20100138817A1 (en) In-place function modification
CN109871290B (zh) 应用于Java的调用堆栈追踪方法、装置和存储介质
US8615743B2 (en) Adaptive compiled code
CN108228077B (zh) 存储区的管理方法、运行方法、装置、设备、可读介质
CN110275792B (zh) 高级语言的异常处理方法、装置和系统
CN114138281A (zh) 软件工程的编译方法、装置、设备及介质
US6581077B2 (en) Method and apparatus for storing short-lived objects in a virtual machine
US10346086B2 (en) Determining an age category for an object stored in a heap
CN106997313B (zh) 一种应用程序的信号处理方法、系统及终端设备
US10891214B2 (en) Transferring a debug configuration amongst carrier threads for debugging a carried thread
US10782945B1 (en) Escape analysis supporting on-stack replacement
CN109582382B (zh) 配置信息的加载方法、装置、存储介质及终端设备
US20180196669A1 (en) Reduced save and restore instructions for call-clobbered registers
US11474832B2 (en) Intelligently determining a virtual machine configuration during runtime based on garbage collection characteristics
CN114398102B (zh) 一种应用程序包生成方法、装置、编译服务器及计算机可读存储介质
CN108459952B (zh) 程序异常的处理方法及系统
CN111338633B (zh) 免安装文件生成方法、装置及电子设备
CN110716753B (zh) 云主机的初始化方法、装置、存储介质及电子设备
RU2639235C2 (ru) Свободная от блокирования потоковая передача данных исполняемого кода

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