CN113342431B - 函数调用栈回溯、程序异常处理方法、装置、设备及介质 - Google Patents
函数调用栈回溯、程序异常处理方法、装置、设备及介质 Download PDFInfo
- Publication number
- CN113342431B CN113342431B CN202110736647.0A CN202110736647A CN113342431B CN 113342431 B CN113342431 B CN 113342431B CN 202110736647 A CN202110736647 A CN 202110736647A CN 113342431 B CN113342431 B CN 113342431B
- Authority
- CN
- China
- Prior art keywords
- function
- function call
- data
- program
- call stack
- 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
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/0703—Error 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/079—Root cause analysis, i.e. error or fault diagnosis
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Health & Medical Sciences (AREA)
- Biomedical Technology (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种函数调用栈回溯、程序异常处理方法、装置、电子设备及存储介质,函数调用栈回溯方法,包括:获取程序异常时的异常栈数据段;自所述异常栈数据段,依次提取数据,并对每一数据执行:判断该数据是否为地址信息;若是,则根据该数据以及一函数映射表,查找所述地址信息对应的函数名;按所述数据的提取顺序以及所查找的函数名,回溯获得第一函数调用顺序;至少根据所述第一函数调用顺序,获得函数调用栈。本申请能够在无需进行额外处理的情况下,获取完整的函数调用栈,从而能够利用函数调用栈进行程序和***分析。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种函数调用栈回溯、程序异常处理方法、装置、设备及介质。
背景技术
函数调用栈用于根据函数正向调用顺序储存函数及执行函数的相关信息。当程序或者***出现故障时,函数调用栈可以用来分析程序或***出现故障的原因。
目前,函数调用栈通常在函数执行时生成,从而可以在发生故障时获取并使用。然而,对于未储存函数调用栈或者由于故障丢失函数调用栈的情况下,未有能够获取完整的函数调用栈的方法。
由此,如何在未存储函数调用栈或函数调用栈丢失情况下,无需进行额外处理的情况下,获取函数调用栈,从而能够利用函数调用栈进行程序和***分析,是本领域亟待解决的技术问题。
发明内容
本发明为了克服上述现有技术存在的缺陷,提供一种函数调用栈回溯、程序异常处理方法、装置、电子设备及存储介质,以在未存储函数调用栈或函数调用栈丢失情况下,无需进行额外处理的情况下,获取完整的函数调用栈,从而能够利用函数调用栈进行程序和***分析。
根据本申请的一个方面,提供一种函数调用栈回溯方法,包括:
获取程序异常时的异常栈数据段;
自所述异常栈数据段,依次提取数据,并对每一数据执行:
判断该数据是否为地址信息;
若是,则根据该数据以及一函数映射表,查找所述地址信息对应的函数名;
按所述数据的提取顺序以及所查找的函数名,回溯获得第一函数调用顺序;
至少根据所述第一函数调用顺序,获得函数调用栈。
在本申请的一些实施例中,所述判断该数据是否为地址信息包括:
判断所述数据是否落入进程空间的代码段地址空间;
若是,则所述数据为地址信息;
若否,则所述数据不是地址信息。
在本申请的一些实施例中,所述根据所述第一函数调用顺序,获得函数调用栈之前,还包括:
利用处理器的函数调用规范调用函数调用栈的栈帧依次回溯获得第二函数调用顺序,
其中,所述函数调用栈根据所述第一函数调用顺序以及所述第二函数调用顺序获得。
在本申请的一些实施例中,所述根据所述第一函数调用顺序,获得函数调用栈之前,还包括:
利用编译程序的函数调用算法自当前函数依次回溯获得第三函数调用顺序,
其中,所述函数调用栈根据所述第一函数调用顺序以及所述第三函数调用顺序获得。
在本申请的一些实施例中,所述利用编译程序的函数调用算法自当前函数依次回溯获得第三函数调用顺序包括:
函数调用算法获取步骤:根据当前函数的函数名,获取当前函数的函数调用算法;
调用函数确定步骤:根据当前函数的函数调用算法以及当前函数的地址信息,确定调用当前函数的调用函数;
当前函数赋值步骤:将所述调用函数作为当前函数;
迭代执行所述函数调用算法获取步骤、所述调用函数确定步骤以及所述当前函数赋值步骤,获得所述第三函数调用顺序。
在本申请的一些实施例中,所述函数调用栈回溯方法集成在程序中,以当所述程序异常时自动执行所述函数调用栈回溯方法。
根据本申请的又一方面,还提供一种程序异常处理方法,包括:
捕获程序的异常信号;
执行如上所述的函数调用栈回溯方法,以获取所述函数调用栈;
根据所述函数调用栈进行程序异常检测。
根据本申请的又一方面,还提供一种函数调用栈回溯装置,包括:
第一获取模块,配置成获取程序异常时的异常栈数据段;
提取模块,配置成自所述异常栈数据段,依次提取数据:
判断模块,配置成判断各数据是否为地址信息;
函数查找模块,配置成若所述判断模块判断为是,则根据该数据以及一函数映射表,查找所述地址信息对应的函数名;
回溯模块,配置成按所述数据的提取顺序以及所查找的函数名,回溯获得第一函数调用顺序;
第二获取模块,配置成至少根据所述第一函数调用顺序,获得函数调用栈。
根据本申请的又一方面,还提供一种电子设备,所述电子设备包括:处理器;存储介质,其上存储有计算机程序,所述计算机程序被所述处理器运行时执行如上所述的步骤。
根据本申请的又一方面,还提供一种存储介质,所述存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行如上所述的步骤。
由此可见,本申请提供的方案,与现有技术相比,具有如下优势:
本申请通过获取程序异常时的异常栈数据段,以自所述异常栈数据段,依次提取数据,并根据每一个为地址信息的数据在一函数映射表查找该数据对应的函数名,从而回溯获得第一函数调用顺序;并根据所述第一函数调用顺序,获得函数调用栈,由此,无需在程序编译时执行额外的用于进行函数调用顺序回溯的设置,也无需获取程序编译时生成的用来确定函数的调用方式的算法,即可进行函数调用栈的回溯,从而能够利用函数调用栈进行程序和***分析。
附图说明
通过参照附图详细描述其示例实施方式,本发明的上述和其它特征及优点将变得更加明显。
图1示出了根据本申请实施例的函数调用栈回溯方法的流程图。
图2示出了根据本申请具体实施例的函数调用栈回溯方法的流程图。
图3示出了根据本申请实施例的程序异常处理方法的流程图。
图4示出了根据本申请实施例的函数调用栈回溯装置的模块图。
图5示意性示出本申请示例性实施例中一种计算机可读存储介质示意图。
图6示意性示出本申请示例性实施例中一种电子设备示意图。
具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本发明将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施方式中。
此外,附图仅为本发明的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
附图中所示的流程图仅是示例性说明,不是必须包括所有的步骤。例如,有的步骤还可以分解,而有的步骤可以合并或部分合并,因此,实际执行的顺序有可能根据实际情况改变。
为了克服上述现有技术存在的缺陷,本申请提供一种函数调用栈回溯方法、异常程序处理方法、装置、电子设备及存储介质,以在无需进行额外处理的情况下,获取完整的函数调用栈,从而能够利用函数调用栈进行程序和***分析。
首先参见图1,图1示出了根据本申请实施例的函数调用栈回溯方法的流程图。图1共示出了如下步骤:
步骤S110:获取程序异常时的异常栈数据段。
具体而言,异常栈数据段可于由程序异常时自动生成和获取。异常栈数据段可以用于描述程序的执行情况。
步骤S120:自所述异常栈数据段,依次提取数据,并对每一数据执行步骤S121和步骤S122。
具体而言,数据的长度可以预先设定。例如,数据的长度为32位,由此,可以自所述异常栈数据段中依次提取长度为32位的数据。进一步地,提取数据的顺序可以是从异常栈数据段最新生成的数据开始。
步骤S121:判断该数据是否为地址信息。
具体而言,可以通过如下步骤判断该数据是否为地址信息:判断所述数据是否落入进程空间的代码段地址空间;若是,则所述数据为地址信息;若否,则所述数据不是地址信息。由此,通过进程空间的代码段地址空间,可以判断子数据段是否为地址信息。
若是,则执行步骤S122:根据该数据以及一函数映射表,查找所述地址信息对应的函数名。
具体而言,函数映射表可以预先建立和维护。函数映射表用于储存函数名与其地址信息的映射关系。由此,可以通过步骤S122基于地址信息来查找对应的函数名。
进一步地,当步骤S121判断为否时,可以不对数据进行处理,或者剔除该数据。
步骤S130:按所述数据的提取顺序以及所查找的函数名,回溯获得第一函数调用顺序。
具体而言,根据数据的提取顺序可以确定函数之间的调用关系,由此,根据依次查找到的函数名可以回溯获得第一函数调用顺序。
步骤S140:至少根据所述第一函数调用顺序,获得函数调用栈。
在本申请提供的函数调用栈回溯方法中,通过获取程序异常时的异常栈数据段,以自所述异常栈数据段,依次提取数据,并根据每一个为地址信息的数据在一函数映射表查找该数据对应的函数名,从而回溯获得第一函数调用顺序;并根据所述第一函数调用顺序,获得函数调用栈,由此,无需在程序编译时执行额外的用于进行函数调用顺序回溯的设置,也无需获取程序编译时生成的用来确定函数的调用方式的算法,即可进行函数调用栈的回溯,从而能够利用函数调用栈进行程序和***分析。
下面参考图2,图2示出了根据本申请具体实施例的函数调用栈回溯方法的流程图。图2共示出如下步骤:
步骤S130:按所述数据的提取顺序以及所查找的函数名,回溯获得第一函数调用顺序。
步骤S150:利用处理器的函数调用规范调用函数调用栈的栈帧依次回溯获得第二函数调用顺序。
具体而言,函数调用规范例如可以包括如下内容:默认压栈的寄存器;以默认压栈的寄存器的压栈顺序;参数是怎样传递给被调用者的;怎样访问局部变量;最后的返回值又是怎样传递给调用者的;所涉及的栈的操作是由调用者还是被调用者负责的等,本申请并非以此为限制。
具体而言,处理器的函数调用规范是随着不同处理器不同。在一些具体实现中,可以由不同的平台执行基于不同处理器的函数调用规范的回溯。
进一步地,处理器的函数调用规范的使用,需在程序编译时,嵌入特定数据,从而在程序出现异常时,能够根据栈中的特定数据进行调用顺序的回溯。
步骤S160:利用编译程序的函数调用算法自当前函数依次回溯获得第三函数调用顺序。
具体而言,步骤S160可以通过如下步骤来实现:
函数调用算法获取步骤:根据当前函数的函数名,获取当前函数的函数调用算法;
调用函数确定步骤:根据当前函数的函数调用算法以及当前函数的地址信息,确定调用当前函数的调用函数;
当前函数赋值步骤:将所述调用函数作为当前函数;
迭代执行所述函数调用算法获取步骤、所述调用函数确定步骤以及所述当前函数赋值步骤,获得所述第三函数调用顺序。
具体而言,函数调用算法在程序编译时经由用户选择或者设置的编译选项、编译参数自动生成。函数调用算法与所编译的程序储存在不同的储存空间中。具体而言,在对程序进行编译前,编译程序可以提供多种函数调用规范的编译选项,基于用户对这些编译选项的选择,从而能够在程序编译时,生成用于抽象表达函数调用方式的函数调用算法,以用于进行函数调用栈的回溯。
具体而言,经配置的编译选项生成的函数调用规范在回溯时,是动态计算出运行时的调用关系,其输入变量包括函数调用算法以及异常时的地址,由这两个变量来动态算出函数调用者,从而实现回溯。
步骤S141:根据所述第一函数调用顺序、第二函数调用顺序以及第三函数调用顺序,获得函数调用栈。
具体而言,步骤S130、步骤S150以及步骤S160可以是异步执行也可以是同步执行,本申请并不限定步骤S130、步骤S150以及步骤S160的执行顺序。
在一些实施例中,可以仅执行步骤S130和步骤S150,从而基于第一函数调用顺序和第二函数调用顺序来获得函数调用栈。在又一些变化例中,可以仅执行步骤S130和步骤S160,从而基于第一函数调用顺序和第三函数调用顺序来获得函数调用栈。本申请并非以此为限制。
具体而言,步骤S141可以以第一函数调用顺序为优选顺序,通过第二函数调用顺序和/或第三函数调用顺序进行补充。换言之,当第一函数调用顺序回溯出现错误或异常时,可以通过第二函数调用顺序和/或第三函数调用顺序进行调用顺序的补充和修正。
在一些变化例中,当可以获得第二函数调用顺序和/或第三函数调用顺序时,由于第二函数调用顺序和/或第三函数调用顺序获得的调用顺序更为准确,因此,可以以第二函数调用顺序和/或第三函数调用顺序为优选顺序。当无法获得第二函数调用顺序和/或第三函数调用顺序,或者第二函数调用顺序和/或第三函数调用顺序返回为空时,采用第一函数调用顺序来形成函数调用栈。所述第一函数调用顺序、所述第二函数调用顺序以及第三调用顺序的整合并非以此为限制。
进一步地,在本申请的各实施例中,所述函数调用栈回溯方法可以集成在程序中,以当所述程序异常时自动执行所述函数调用栈回溯方法。由此,可以将函数调用栈回溯方法打包为程序组件从而集成在主程序中,随产品发布,当出现问题时,可以自动发现,而不是出现问题后,再用其它的调试器去复现,跟踪调用栈,提高函数调用栈回溯效率,从而提高***/程序问题的分析解决效率。
图3示出了根据本申请实施例的程序异常处理方法的流程图。图3共示出如下步骤:
步骤S101:捕获程序的异常信号。
具体而言,函数调用栈回溯方法中的获取程序异常时的异常数据段的步骤可以经由异常信号的捕获触发执行。所述异常信号例如可以由信号处理函数捕获。具体而言,异常信号及其含义可以由用户自定义设置,本发明并非以此为限制。例如,在函数所在程序的运行过程中,如果出现诸如访问释放的内存,没有申请的内存,不存在的内存等内存访问异常时,操作***会终止程序的运行,同时会给进程发送异常信号,该异常信号会通过注册的信号处理函数来捕获,以通过异常信号的捕获判断当前进程已经异常,从而触发获取程序异常时的异常栈数据段的步骤的执行。
步骤S102:执行如上所述的函数调用栈回溯方法,以获取所述函数调用栈。
步骤S103:根据所述函数调用栈进行程序异常检测。
由此,当在一个函数调用一个函数时,***会将调用者的函数所处的地址,保存起来,然后开始执行新的函数,这个地址保存就是调用栈规定的标准入口,假如新的函数运行过程发生了异常,例如访问不存在的内存,此时操作***将会终止整个进程,并且发信号给进程。本申请提供的函数调用栈的回溯方法向***注册信号处理函数,在***发出信号后,触发回溯方法的执行:根据之前保存在内存中的函数地址的储存顺序,从当前函数开始,找到调用这个函数的函数,回溯推导,从而将最开始函数调用时的顺序全部记录下来,形成函数调用栈,从而便于进行程序异常检测。
以上示例性地示出本发明的多个实现方式,本发明并非以此为限制,各实施方式中,步骤的增加、省略、顺序变换皆在本发明的保护范围之内;各实施方式可以单独或组合来实现。
下面结合图4描述本申请提供的应用于从机设备的函数调用栈回溯装置200。函数调用栈回溯装置200包括第一获取模块210、提取模块220、判断模块230、函数查找模块240、回溯模块250以及第二获取模块260。
第一获取模块210配置成获取程序异常时的异常栈数据段;
提取模块220配置成自所述异常栈数据段,依次提取数据:
判断模块230配置成判断各数据是否为地址信息;
函数查找模块240配置成若所述判断模块判断为是,则根据该数据以及一函数映射表,查找所述地址信息对应的函数名;
回溯模块250配置成按所述数据的提取顺序以及所查找的函数名,回溯获得第一函数调用顺序;
第二获取模块260配置成至少根据所述第一函数调用顺序,获得函数调用栈。
本申请提供的函数调用栈回溯装置中,通过获取程序异常时的异常栈数据段,以自所述异常栈数据段,依次提取数据,并根据每一个为地址信息的数据在一函数映射表查找该数据对应的函数名,从而回溯获得第一函数调用顺序;并根据所述第一函数调用顺序,获得函数调用栈,由此,无需在程序编译时执行额外的用于进行函数调用顺序回溯的设置,也无需获取程序编译时生成的用来确定函数的调用方式的算法,即可进行函数调用栈的回溯,从而能够利用函数调用栈进行程序和***分析。
本申请还可以提供一种程序异常处理装置。程序异常处理装置包括捕获模块、函数调用栈回溯装置以及异常检测模块。
捕获模块,配置成捕获程序的异常信号。
函数调用栈回溯装置,配置成执行如上所述的函数调用栈回溯方法,以获取所述函数调用栈。
异常检测模块,配置成根据所述函数调用栈进行程序异常检测。
由此,能够通过函数调用栈回溯方法获得的函数调用栈进行程序异常检测,确定程序异常原因等。
本申请可以通过软件、硬件、固件及其任意结合的方式实现函数调用栈回溯装置200和/或程序异常处理装置。图4仅仅是示意性的示出本发明提供的函数调用栈回溯装置200,在不违背本发明构思的前提下,模块的拆分、合并、增加都在本申请的保护范围之内。
在本公开的示例性实施例中,还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被例如处理器执行时可以实现上述任意一个实施例中所述函数调用栈回溯方法和/或程序异常处理方法的步骤。在一些可能的实施方式中,本发明的各个方面还可以实现为一种程序产品的形式,其包括程序代码,若所述程序产品在终端设备上运行时,所述程序代码用于使所述终端设备执行本说明书上述函数调用栈回溯方法和/或程序异常处理方法部分中描述的根据本发明各种示例性实施方式的步骤。
参考图5所示,描述了根据本发明的实施方式的用于实现上述方法的程序产品800,其可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在终端设备,例如个人电脑上运行。然而,本发明的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行***、装置或者器件使用或者与其结合使用。
所述程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的***、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
所述计算机可读存储介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读存储介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行***、装置或者器件使用或者与其结合使用的程序。可读存储介质上包含的程序代码可以用任何适若的介质传输,包括但不限于无线、有线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本发明操作的程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在租户计算设备上执行、部分地在租户设备上执行、作为一个独立的软件包执行、部分在租户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到租户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。
在本公开的示例性实施例中,还提供一种电子设备,该电子设备可以包括处理器,以及用于存储所述处理器的可执行指令的存储器。其中,所述处理器配置为经由执行所述可执行指令来执行上述任意一个实施例中所述函数调用栈回溯方法和/或程序异常处理方法的步骤。
所属技术领域的技术人员能够理解,本发明的各个方面可以实现为***、方法或程序产品。因此,本发明的各个方面可以具体实现为以下形式,即:完全的硬件实施方式、完全的软件实施方式(包括固件、微代码等),或硬件和软件方面结合的实施方式,这里可以统称为“电路”、“模块”或“***”。
下面参照图6来描述根据本发明的这种实施方式的电子设备600。图6显示的电子设备600仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图6所示,电子设备600以通用计算设备的形式表现。电子设备600的组件可以包括但不限于:至少一个处理单元610、至少一个存储单元620、连接不同***组件(包括存储单元620和处理单元610)的总线630、显示单元640等。
其中,所述存储单元存储有程序代码,所述程序代码可以被所述处理单元610执行,使得所述处理单元610执行本说明书上述函数调用栈回溯方法和/或程序异常处理方法部分中描述的根据本发明各种示例性实施方式的步骤。例如,所述处理单元610可以执行如图1至3中所示的步骤。
所述存储单元620可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(RAM)6201和/或高速缓存存储单元6202,还可以进一步包括只读存储单元(ROM)6203。
所述存储单元620还可以包括具有一组(至少一个)程序模块6205的程序/实用工具6204,这样的程序模块6205包括但不限于:操作***、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
总线630可以为表示几类总线结构中的一种或多种,包括存储单元总线或者存储单元控制器、***总线、图形加速端口、处理单元或者使用多种总线结构中的任意总线结构的局域总线。
电子设备600也可以与一个或多个外部设备700(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得租户能与该电子设备600交互的设备通信,和/或与使得该电子设备600能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口650进行。并且,电子设备600还可以通过网络适配器660与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。网络适配器660可以通过总线630与电子设备600的其它模块通信。应若明白,尽管图中未示出,可以结合电子设备600使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID***、磁带驱动器以及数据备份存储***等。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、或者网络设备等)执行根据本公开实施方式的上述函数调用栈回溯方法和/或程序异常处理方法。
由此可见,本申请提供的方案,与现有技术相比,具有如下优势:
通过获取程序异常时的异常栈数据段,以自所述异常栈数据段,依次提取数据,并根据每一个为地址信息的数据在一函数映射表查找该数据对应的函数名,从而回溯获得第一函数调用顺序;并根据所述第一函数调用顺序,获得函数调用栈,由此,无需在程序编译时执行额外的用于进行函数调用顺序回溯的设置,也无需获取程序编译时生成的用来确定函数的调用方式的算法,即可进行函数调用栈的回溯,从而能够利用函数调用栈进行程序和***分析。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由所附的权利要求指出。
Claims (10)
1.一种函数调用栈回溯方法,其特征在于,包括:
获取程序异常时的异常栈数据段;
自所述异常栈数据段,依次提取数据,并对每一数据执行:
判断该数据是否为地址信息;
若是,则根据该数据以及一函数映射表,查找所述地址信息对应的函数名;
按所述数据的提取顺序以及所查找的函数名,回溯获得第一函数调用顺序;
至少根据所述第一函数调用顺序,获得函数调用栈。
2.如权利要求1所述的函数调用栈回溯方法,其特征在于,所述判断该数据是否为地址信息包括:
判断所述数据是否落入进程空间的代码段地址空间;
若是,则所述数据为地址信息;
若否,则所述数据不是地址信息。
3.如权利要求1所述的函数调用栈回溯方法,其特征在于,所述根据所述第一函数调用顺序,获得函数调用栈之前,还包括:
利用处理器的函数调用规范调用函数调用栈的栈帧依次回溯获得第二函数调用顺序,
其中,所述函数调用栈根据所述第一函数调用顺序以及所述第二函数调用顺序获得。
4.如权利要求1所述的函数调用栈回溯方法,其特征在于,所述根据所述第一函数调用顺序,获得函数调用栈之前,还包括:
利用编译程序的函数调用算法自当前函数依次回溯获得第三函数调用顺序,
其中,所述函数调用栈根据所述第一函数调用顺序以及所述第三函数调用顺序获得。
5.如权利要求4所述的函数调用栈回溯方法,其特征在于,所述利用编译程序的函数调用算法自当前函数依次回溯获得第三函数调用顺序包括:
函数调用算法获取步骤:根据当前函数的函数名,获取当前函数的函数调用算法;
调用函数确定步骤:根据当前函数的函数调用算法以及当前函数的地址信息,确定调用当前函数的调用函数;
当前函数赋值步骤:将所述调用函数作为当前函数;
迭代执行所述函数调用算法获取步骤、所述调用函数确定步骤以及所述当前函数赋值步骤,获得所述第三函数调用顺序。
6.如权利要求1至5任一项所述的函数调用栈回溯方法,其特征在于,所述函数调用栈回溯方法集成在程序中,以当所述程序异常时自动执行所述函数调用栈回溯方法。
7.一种程序异常处理方法,其特征在于,包括:
捕获程序的异常信号;
执行如权利要求1至6任一项所述的函数调用栈回溯方法,以获取所述函数调用栈;
根据所述函数调用栈进行程序异常检测。
8.一种函数调用栈回溯装置,其特征在于,包括:
第一获取模块,配置成获取程序异常时的异常栈数据段;
提取模块,配置成自所述异常栈数据段,依次提取数据:
判断模块,配置成判断各数据是否为地址信息;
函数查找模块,配置成若所述判断模块判断为是,则根据该数据以及一函数映射表,查找所述地址信息对应的函数名;
回溯模块,配置成按所述数据的提取顺序以及所查找的函数名,回溯获得第一函数调用顺序;
第二获取模块,配置成至少根据所述第一函数调用顺序,获得函数调用栈。
9.一种电子设备,其特征在于,所述电子设备包括:
处理器;
存储器,其上存储有计算机程序,所述计算机程序被所述处理器运行时执行:
如权利要求1至6任一项所述的函数调用栈回溯方法;和/或
如权利要求7所述的程序异常处理方法。
10.一种存储介质,其特征在于,所述存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行:
如权利要求1至6任一项所述的函数调用栈回溯方法;和/或
如权利要求7所述的程序异常处理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110736647.0A CN113342431B (zh) | 2021-06-29 | 2021-06-29 | 函数调用栈回溯、程序异常处理方法、装置、设备及介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110736647.0A CN113342431B (zh) | 2021-06-29 | 2021-06-29 | 函数调用栈回溯、程序异常处理方法、装置、设备及介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113342431A CN113342431A (zh) | 2021-09-03 |
CN113342431B true CN113342431B (zh) | 2023-02-07 |
Family
ID=77481772
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110736647.0A Active CN113342431B (zh) | 2021-06-29 | 2021-06-29 | 函数调用栈回溯、程序异常处理方法、装置、设备及介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113342431B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113760584B (zh) * | 2021-09-23 | 2023-07-25 | 北京字跳网络技术有限公司 | 一种性能分析数据的获取方法、装置、设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103559123A (zh) * | 2013-10-24 | 2014-02-05 | 烽火通信科技股份有限公司 | 基于VxWorks操作***的函数调用栈分析方法及装置 |
CN107704383A (zh) * | 2017-09-12 | 2018-02-16 | 中国航空工业集团公司洛阳电光设备研究所 | 一种基于任务栈分析的动态测试函数覆盖率获取方法 |
CN110865898A (zh) * | 2019-10-12 | 2020-03-06 | 北京字节跳动网络技术有限公司 | 崩溃调用栈聚合的方法、装置、介质和设备 |
CN111984496A (zh) * | 2020-07-16 | 2020-11-24 | 北京字节跳动网络技术有限公司 | 一种监控栈内存泄露的方法、装置、介质和电子设备 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100570581C (zh) * | 2008-04-09 | 2009-12-16 | 中兴通讯股份有限公司 | 故障定位的方法和装置 |
CN107085548A (zh) * | 2016-02-16 | 2017-08-22 | 阿里巴巴集团控股有限公司 | 一种监控应用程序内存的方法、装置及电子设备 |
CN110502357B (zh) * | 2019-07-09 | 2023-01-17 | 北京字节跳动网络技术有限公司 | 一种栈回溯方法、装置、介质和设备 |
-
2021
- 2021-06-29 CN CN202110736647.0A patent/CN113342431B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103559123A (zh) * | 2013-10-24 | 2014-02-05 | 烽火通信科技股份有限公司 | 基于VxWorks操作***的函数调用栈分析方法及装置 |
CN107704383A (zh) * | 2017-09-12 | 2018-02-16 | 中国航空工业集团公司洛阳电光设备研究所 | 一种基于任务栈分析的动态测试函数覆盖率获取方法 |
CN110865898A (zh) * | 2019-10-12 | 2020-03-06 | 北京字节跳动网络技术有限公司 | 崩溃调用栈聚合的方法、装置、介质和设备 |
CN111984496A (zh) * | 2020-07-16 | 2020-11-24 | 北京字节跳动网络技术有限公司 | 一种监控栈内存泄露的方法、装置、介质和电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN113342431A (zh) | 2021-09-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112100072B (zh) | 应用程序代码的静态检测方法、装置、设备及介质 | |
US20120331449A1 (en) | Device, method and computer program product for evaluating a debugger script | |
CN110764945A (zh) | 一种崩溃日志处理方法、装置、设备和存储介质 | |
US8797335B2 (en) | Platform agnostic screen capture tool | |
CN110990411B (zh) | 数据结构的生成方法及装置、调用方法及装置 | |
CN108874441B (zh) | 一种板卡配置方法、装置、服务器和存储介质 | |
CN113342431B (zh) | 函数调用栈回溯、程序异常处理方法、装置、设备及介质 | |
CN110659210A (zh) | 一种信息获取方法、装置、电子设备及存储介质 | |
CN110941534A (zh) | 检测web应用第三方代码调用的方法及*** | |
CN110888791A (zh) | 一种日志处理方法、装置、设备和存储介质 | |
CN114490394A (zh) | 测试范围确定方法、装置、设备和介质 | |
CN114003269A (zh) | 组件处理方法、装置、电子设备及存储介质 | |
CN112068932B (zh) | 应用程序的集成、监控方法、装置、***、设备及介质 | |
CN110888641B (zh) | 一种脚本自动生成方法、装置、服务器及存储介质 | |
CN110045952B (zh) | 代码调用方法与装置 | |
CN116450398A (zh) | 异常回溯方法、装置、设备和介质 | |
CN112748930B (zh) | 编译检测方法、装置、设备及存储介质 | |
CN110716859A (zh) | 自动为修改的代码推送测试用例的方法及相关装置 | |
CN116521414A (zh) | 故障代码定位方法、云端服务器、***及存储介质 | |
CN113190235B (zh) | 一种代码的分析方法、装置、电子终端及存储介质 | |
CN111124423B (zh) | 一种基于多平台的编译检测方法、装置、服务器及介质 | |
CN111382017A (zh) | 故障查询方法、装置,服务器及存储介质 | |
CN110297639B (zh) | 用于检测代码的方法和装置 | |
CN112114811A (zh) | 一种编译方法、装置和设备 | |
CN114338846A (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 |