CN106802785B - 一种栈解析方法和装置 - Google Patents
一种栈解析方法和装置 Download PDFInfo
- Publication number
- CN106802785B CN106802785B CN201611145387.5A CN201611145387A CN106802785B CN 106802785 B CN106802785 B CN 106802785B CN 201611145387 A CN201611145387 A CN 201611145387A CN 106802785 B CN106802785 B CN 106802785B
- Authority
- CN
- China
- Prior art keywords
- stack frame
- stack
- function
- address
- frame
- 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.)
- Expired - Fee Related
Links
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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30145—Instruction analysis, e.g. decoding, instruction word fields
-
- 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3004—Arrangements for executing specific machine instructions to perform operations on memory
- G06F9/30043—LOAD or STORE instructions; Clear instruction
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
Abstract
本发明实施例公开了一种栈解析的方法和装置,可以在栈解析过程中,通过获取一个栈帧例如第一栈帧的最低位地址,可以从这个栈帧中得到第二函数调用这个栈帧所对应的第一函数的调用关系,并可以根据固定偏移从第一栈帧中得到第一栈帧的长度信息,从而可以依据第一栈帧的长度信息和第一栈帧的最低位地址确定出第二栈帧的最低位地址,以此往复可以得到各函数的调用关系,在获取调用栈时不需要使用BP寄存器,也不需要在栈帧中保存寄存器值,而所使用的SP寄存器在各个应用场景中基本都属于专用于栈帧的寄存器,SP寄存器不会被优化作为其他用处,能正确获取,从而在获取调用栈的过程中节约了寄存器资源,不会影响系统性能。
Description
技术领域
本发明涉及数据处理领域,特别是涉及一种栈解析方法和装置。
背景技术
在通过计算机进行数据处理的过程中,可以通过执行进程来实现该进程所对应的功能。在计算机系统中,一个进程可以包括有一个或多个线程,每个线程可以被配置对应的栈,该栈可以作为该线程的私有空间,用于存储该线程的私有资源。根据一个线程的复杂程度,在执行该线程时,需要顺序执行若干个函数以实现该线程的功能,故这些函数的私有资源也保存在该线程所对应栈的栈帧中,一般情况下,可以将一个栈帧作为一个函数的私有空间,用于存储该函数的私有资源。根据函数之间的调用关系,函数对应的栈帧在栈中的位置也有不同,以帧地址的高低以及栈帧相邻关系区分,被调用函数的栈帧一般位于调用函数的栈帧下一层,即被调用函数的栈帧地址较低。
若要实现一个线程的功能,需要通过从该线程对应的栈中获取与该线程相关的各个函数之间的调用关系,一般情况下,从栈的最内层栈帧即地址最低的栈帧开始,获取该最内层栈帧所对应的函数与上一层栈帧所对应函数之间的调用关系,依据栈地址从低向高,一层一层的获取栈帧中保存的函数调用关系,获取一个线程中各函数的调用关系的过程可以称为获取该线程的调用栈的过程。线程运行过程中获取调用栈是重要的调测手段,若获取调用栈的方式能够有很高的、可靠的性能,可以减少对线程性能的影响,提高其应用范围。
传统的获取调用栈的方法为栈回溯算法,在该算法中,需要在栈帧中保存基数指针(base pointer,BP)寄存器值,一个栈帧中保存的BP寄存器值用于标识这个栈帧与上一层栈帧之间的关联关系,故可以根据该BP寄存器值推导出这个栈帧的上一层栈帧。可见,获取调用栈的过程中,其难点在于如何根据当前栈帧中的内容确定出上一层栈帧的位置,而传统算法需要在栈帧中额外保存BP寄存器值,且需要BP寄存器专用于推栈才能根据BP寄存器值才能实现,由此浪费了CPU宝贵的寄存器资源,影响性能。
发明内容
为了解决上述技术问题,本发明实施例提供了一种帧解析方法和装置,在获取调用栈的过程中节约了寄存器资源,不会影响系统性能。
第一方面,本发明提供了一种栈解析方法,应用于一个线程所对应的栈,所述栈中具有多个栈帧,所述方法包括:
获取第一栈帧的最低位地址,所述第一栈帧为所述多个栈帧中的一个栈帧,所述第一栈帧为用于保存第一函数私有资源的栈帧,所述第一函数为所述线程使用到的一个函数;
根据所述第一栈帧的最低位地址,从第一栈帧中获取第二函数的指令地址,所述第二函数用于在所述线程中调用第一函数,所述第二函数的指令地址用于指示第二函数调用第一函数的调用关系;
根据固定偏移以及所述第一栈帧的最低位地址所指示的位置,从所述第一栈帧中获取第一栈帧的长度信息;
根据所述第一栈帧的最低位地址以及所述第一栈帧的长度信息确定出第二栈帧的最低位地址,所述第二栈帧为用于保存所述第二函数私有资源的栈帧。
在第一方面的第一种可能的实现方式中,所述获取第一栈帧的最低位地址,包括:
从所述第一栈帧对应的栈指针SP寄存器中获取所述第一栈帧的最低位地址。
结合第一方面或者第一方面的第一种可能的实现方式,在第二种可能的实现方式中,还包括:
将所述第二栈帧的最低位地址保存到所述第二栈帧对应的SP寄存器中。
在第一方面的第三种可能的实现方式中,所述第一栈帧为处于所述栈最内层的栈帧。
在第一方面的第四种可能的实现方式中,还包括:
执行移动指令,所述移动指令用于指示将所述第一栈帧的长度信息压到所述第一栈帧中;
在所述第一栈帧中与所述第一栈帧最低位地址距离所述固定偏移设置一个地址空间;
在所述地址空间中存储所述第一栈帧的长度信息。
第二方面,本发明提供一种栈解析装置,应用于一个线程所对应的栈,所述栈中具有多个栈帧,所述装置包括获取单元、指令地址单元、长度信息单元和确定单元:
所述获取单元,用于获取第一栈帧的最低位地址,所述第一栈帧为所述多个栈帧中的一个栈帧,所述第一栈帧为用于保存第一函数私有资源的栈帧,所述第一函数为所述线程使用到的一个函数;
所述指令地址单元,用于根据所述第一栈帧的最低位地址,从第一栈帧中获取第二函数的指令地址,所述第二函数用于在所述线程中调用第一函数,所述第二函数的指令地址用于指示第二函数调用第一函数的调用关系;
所述长度信息单元,用于根据固定偏移以及所述第一栈帧的最低位地址所指示的位置,从所述第一栈帧中获取第一栈帧的长度信息;
所述确定单元,用于根据所述第一栈帧的最低位地址以及所述第一栈帧的长度信息确定出第二栈帧的最低位地址,所述第二栈帧为用于保存所述第二函数私有资源的栈帧。
在第二方面的第一种可能的实现方式中,所述获取单元具体用于从所述第一栈帧对应的栈指针SP寄存器中获取所述第一栈帧的最低位地址。
结合第二方面或者第二方面的第一种可能的实现方式,在第二种可能的实现方式中,还包括保存单元:
所述保存单元,用于将所述第二栈帧的最低位地址保存到所述第二栈帧对应的SP寄存器中。
在第二方面的第三种可能的实现方式中,所述第一栈帧为处于所述栈最内层的栈帧。
在第二方面的第四种可能的实现方式中,还包括执行单元、设置单元和存储单元:
所述执行单元,用于执行移动指令,所述移动指令用于指示将所述第一栈帧的长度信息压到所述第一栈帧中;
所述设置单元,用于在所述第一栈帧中与所述第一栈帧最低位地址距离所述固定偏移设置一个地址空间;
所述存储单元,用于在所述地址空间中存储所述第一栈帧的长度信息。
由上述技术方案可以看出,通过在栈帧中与最低位地址距离固定偏移的位置存储该栈帧的长度信息,可以在栈解析过程中,通过获取一个栈帧例如第一栈帧的最低位地址可以从这个栈帧中得到第二函数调用这个栈帧所对应的第一函数的调用关系,并可以根据固定偏移从第一栈帧中得到第一栈帧的长度信息,从而可以依据第一栈帧的长度信息以及第一栈帧的最低位地址确定出第二栈帧的最低位地址,也就是第二函数所对应栈帧的位置,以此往复可以依次从各层栈帧中得到各函数的调用关系,可以在获取调用栈的过程中,不需要使用到BP寄存器,也不需要在栈帧中保存寄存器值,而所使用的SP寄存器在各个应用场景中基本都属于专用于栈帧的寄存器,SP寄存器不会被优化作为其他用处,能正确获取,从而在获取调用栈的过程中节约了寄存器资源,不会影响系统性能。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为一种基于栈回溯算法的栈的布局示意图;
图2为本发明实施例提供的一种栈的布局的示意图;
图3为本发明实施例提供的一种栈解析的方法的流程图;
图4为本发明实施例提供的一种栈解析装置的结构示意图;
图5为本发明实施例提供的一种计算机设备的硬件结构示意图。
具体实施方式
下面结合附图,对本发明的实施例进行描述。
在通过计算机进行数据处理的过程中,可以通过执行进程来实现该进程所对应的功能。在计算机系统中,一个进程可以包括有一个或多个线程,每个线程可以被配置对应的栈。在执行一个线程时,需要顺序执行若干个函数以实现该线程的功能,也即要实现一个线程的功能,需要获知该若干个函数之间的调用关系,获取一个线程中各函数的调用关系的过程可以称为获取该线程的调用栈的过程。一个线程中各个函数有其对应的栈帧,可以用于存储该函数的私有资源。根据函数之间的调用关系,函数对应的栈帧在栈中的位置也有不同,以帧地址的高低以及栈帧相邻关系区分,被调用函数的栈帧一般位于调用函数的栈帧下一层,即被调用函数的栈帧地址较低。
传统的获取调用栈的方法为栈回溯算法,在该算法中,需要在栈帧中保存BP寄存器值,一个栈帧中保存的BP寄存器值用于标识这个栈帧与上一层栈帧之间的关联关系,故可以根据该BP寄存器值推导出这个栈帧的上一层栈帧。如图1所示,为基于栈回溯算法的栈的布局示意图,图1中,A栈帧是函数A对应的栈帧,B栈帧是函数B对应的栈帧,bp.A表示函数A对应的A栈帧的BP寄存器值,可以用于指示A栈帧的位置,同理,bp.B表示函数B对应的B栈帧的BP寄存器值,可以用于指示B栈帧的位置,bp.C表示函数C对应的C栈帧的BP寄存器值,可以用于指示C栈帧的位置。根据BP寄存器值可以获取到相应的栈帧,在每个栈帧中可以保存有上一层栈帧的BP寄存器值,以及该栈帧所对应的函数与上一层栈帧所对应函数之间的调用关系,函数之间的调用关系可以是以函数返回地址的形式保存在栈帧中,以A栈帧为例,依据bp.A可以从A栈帧中获取到A返回地址即函数B与函数A之间的调用关系,以及用于指示B栈帧位置的bp.B。
由此可知,传统算法需要在栈帧中额外保存BP寄存器值,才可以通过BP寄存器值确定出上一层栈帧的位置。并且为了保证获取调用栈的可靠性,还需要BP寄存器专用于推栈位置的定位,浪费了CPU宝贵的寄存器资源,影响性能。
为此,本发明实施例提供了一种栈解析的方法,通过在栈帧中与最低位地址距离固定偏移的位置存储该栈帧的长度信息,可以在栈解析过程中,通过获取一个栈帧例如第一栈帧的最低位地址可以从这个栈帧中得到第二函数调用这个栈帧所对应的第一函数的调用关系,并可以根据固定偏移从第一栈帧中得到第一栈帧的长度信息,从而可以依据第一栈帧的长度信息以及第一栈帧的最低位地址确定出第二栈帧的最低位地址,也就是第二函数所对应栈帧的位置,以此往复可以依次从各层栈帧中得到各函数的调用关系,可以在获取调用栈的过程中,不需要使用到BP寄存器,也不需要在栈帧中保存寄存器值,而所使用的栈指针(Stack Pointer,SP)寄存器在各个应用场景中基本都属于专用于栈帧的寄存器,SP寄存器不会被优化作为其他用处,能正确获取,从而在获取调用栈的过程中节约了寄存器资源,不会影响系统性能。
如图2所示,为本发明实施例中栈的布局的示意图,栈中包含有三个栈帧,每个栈帧都有其所对应的函数,栈帧中可以保存该栈帧的长度信息、该栈帧所对应函数的返回地址、局部变量等信息。A栈帧是函数A对应的栈帧,B栈帧是函数B对应的栈帧,C栈帧是函数C对应的栈帧。
在帧中,一般由高地址栈帧所对应的函数调用下一层低地址栈帧所对应的函数,故图2中,函数C调用函数B,函数B调用函数A。函数之间的调用关系可以通过函数的返回地址进行体现,例如A栈帧中保存的A返回地址可以体现出函数B调用函数A的调用关系。在栈帧中保存的返回地址可以是一个连接寄存器(Link Register,LR)值。
一般使用SP寄存器对栈帧地址进行标识,SP.A表示函数A对应的A栈帧的最低位地址,SP.B表示函数B对应的B栈帧的最低位地址,SP.C表示函数C对应的C栈帧的最低位地址,通过栈帧的最低位地址可以确定出该栈帧在栈中的位置。
为了能够快速确定出上一层栈帧的位置,且不需要使用额外的寄存器,在本发明实施例中,引入了栈帧的长度信息作为确定上一层栈帧位置的依据。栈帧的长度信息用于标识该栈帧所占用栈的长度,例如可以是8kb或者16bit等。在每个栈帧中保存该栈帧的长度信息,如图2所示,A1用于表示A栈帧的长度,B1用于表示B栈帧的长度,C1用于表示C栈帧的长度。一个栈帧的长度信息可以保持在栈帧中的特定位置,以便可以从栈帧中快速准确的获取,在本发明实施例中,可以将栈帧的长度信息存储在距离该栈帧最低位地址固定偏移的位置,该固定偏移可以是针对一个栈中所有栈帧统一配置的,也可以是依据栈帧长度单独配置的。从而在得到一个栈帧的最低位地址时,可以通过固定偏移快速定位到在这个栈帧中存储这个栈帧长度信息的位置。
以A栈帧为例,在该A栈帧中可以保存有函数A的局部变量即A局部变量、栈帧长度A1和A返回地址,根据SP.A可以从A栈帧中得到A返回地址即函数B与函数A的调用关系,将SP.A通过固定偏移可以定位到A栈帧中存储A栈帧长度信息的位置,从而获取到栈帧长度A1,根据SP.A和栈帧长度A1可以确定出B栈帧的SP.B,以此类推可以依次从各层栈帧中得到各个函数之间的调用关系。
本发明实施例提供的方法可以应用于程序的调试阶段,例如,在程序调试阶段,如果调试的程序出现漏洞(bug),可以先确定出出现bug的位置,若该位置对应的是某一个函数,则说明该函数或者其他函数在调用该函数的过程中可能会存在问题,则依据这些函数之间的调用关系,可以依次对这些函数进行检测从而确定出出现bug的函数,从而可以对该函数的程序进行相应的处理来避免该bug的出现。
也可以应用于程序运行阶段,例如,程序运行时需要使用函数A、函数B、函数C和函数D,其中函数D调用函数C,函数C调用函数B,函数B调用函数A,程序在运行中如果出现错误,可以先确定出发现错误的位置,如该位置对应的是函数B,则可以推知函数B及其上层函数可能会存在问题,根据函数之间的调用关系,可以依次检测函数B、函数C和函数D从而确定出出现错误的函数。
接下来,详细介绍本发明实施例所提供的一种栈解析的方法。图3为本发明实施例提供的一种栈解析的方法的流程图,应用于一个线程所对应的栈,该方法包括:
S301:获取第一栈帧的最低位地址,所述第一栈帧为所述多个栈帧中的一个栈帧,所述第一栈帧为用于保存第一函数私有资源的栈帧,所述第一函数为所述进程使用到的一个函数。
一个线程往往需要顺序执行多个函数才能实现该线程的功能,每个函数都有其对应的一个栈帧,栈帧可以用于保存函数的私有资源,例如,该函数的局部变量、返回地址等信息。
一个线程所对应的栈中可以具有多个栈帧,第一栈帧可以是该多个栈帧中的一个,例如,第一栈帧可以是帧中最内层的栈帧,即地址最低的栈帧,也可以是除了最外层栈帧或者说地址最高的栈帧以外的其他栈帧。
本发明实施例中,可以从所述第一栈帧对应的SP寄存器中获取所述第一栈帧的最低位地址。
S302:根据所述第一栈帧的最低位地址,从第一栈帧中获取第二函数的指令地址。
第一栈帧是第一函数对应的栈帧,在本发明实施例中,可以将调用该第一函数的上层函数称为第二函数,第二函数的指令地址可以用于标识第二函数调用第一函数的调用关系。该调用关系可以包括第二函数调用第一函数,即第一函数是被调用函数,第二函数是调用函数,以及第二函数如何实现对第一函数的调用。
一个函数的指令地址往往有多条,该多条指令地址中的任意一条指令地址都可以指示该函数与被调用函数之间的调用关系,因此,获取到函数的任意一条指令地址即可获知该函数相应的调用关系。在具体实现中,第二函数的指令地址往往以第一函数的返回地址的形式保存在第一函数对应的第一栈帧中。
根据第一栈帧的最低位地址可以获取到该第一栈帧,由于栈帧中保存有该栈帧所对应的函数的返回地址,因此当获取到第一栈帧后,便可以从该第一栈帧中获取到第一函数的返回地址即第二函数的指令地址。
S303:根据固定偏移以及所述第一栈帧的最低位地址所指示的位置,从所述第一栈帧中获取第一栈帧的长度信息。
固定偏移可以用于表示栈帧的最低位地址与该栈帧中存储该栈帧长度信息的地址之间的距离,每个栈帧中存储该栈帧的长度信息的位置可以是在该栈帧中相对比较固定的位置,故固定偏移可以是一个已知的固定数值。
通过将第一栈帧的最低位地址偏移该固定偏移量可以得到存储该栈帧长度信息的地址,从该地址所指示的位置可以获取第一栈帧的长度信息。例如,第一栈帧的最低位地址为第10比特(bit),固定偏移为8bit,则存储第一栈帧的长度信息的地址为第18bit,根据该地址所指示的位置可以获取到第一栈帧的长度信息。
S304:根据所述第一栈帧的最低位地址以及所述第一栈帧的长度信息确定出第二栈帧的最低位地址,所述第二栈帧为用于保存所述第二函数私有资源的栈帧。
一个栈帧的长度可以理解为是该栈帧的最低位地址与该栈帧的最高位地址之间的差值,因此,根据一个栈帧的最低位地址以及该栈帧的长度可以计算出该栈帧的最高位地址。
当两个函数之间具有调用关系时,一个可以是调用函数,另一个可以是被调用函数,这两个函数各自对应的栈帧可以是具有相邻关系的两个栈帧,也即调用函数对应的栈帧的最低位地址与被调用函数对应的栈帧的最高位地址相同,可知这两个栈帧的最低位地址之间的差值是被调用函数对应的栈帧的长度。例如,第二函数调用第一函数,则第二函数对应的第二栈帧和第一函数对应的第一栈帧具有相邻的关系,第一栈帧的最低位地址和第二栈帧的最低位地址的差值是第一栈帧的长度。
因此,根据获取的第一栈帧的长度信息,以及第一栈帧的最低位地址可以计算得出第二栈帧的最低位地址,例如,第一栈帧的最低位地址为第10bit,第一栈帧的长度为15bit,则可以计算出第二栈帧的最低位地址为第10+15=25bit。
由上述技术方案可以看出,通过在栈帧中与最低位地址距离固定偏移的位置存储该栈帧的长度信息,可以在栈解析过程中,通过获取一个栈帧例如第一栈帧的最低位地址可以从这个栈帧中得到第二函数调用这个栈帧所对应的第一函数的调用关系,并可以根据固定偏移从第一栈帧中得到第一栈帧的长度信息,从而可以依据第一栈帧的长度信息以及第一栈帧的最低位地址确定出第二栈帧的最低位地址,也就是第二函数所对应栈帧的位置,以此往复可以依次从各层栈帧中得到各函数的调用关系,可以在获取调用栈的过程中,不需要使用到BP寄存器,也不需要在栈帧中保存寄存器值,而所使用的SP寄存器在各个应用场景中基本都属于专用于栈帧的寄存器,SP寄存器不会被优化作为其他用处,能正确获取,从而在获取调用栈的过程中节约了寄存器资源,不会影响系统性能。
一般情况下,可以是从栈的最内层栈帧即地址最低的栈帧开始,获取该最内层栈帧所对应的函数与上一层栈帧所对应函数之间的调用关系,在本发明实施例中第一栈帧可以是处于所述栈最内层的栈帧。
当第一栈帧是最内层栈帧即第一函数为最内层函数时,获取的调用栈中除了包括各个函数之间的调用关系外,还可以包括最内层函数所需调用的相关信息,在程序计数器(Program Counter,PC)中存储有最内层函数所需调用的相关信息,故此,当第一函数为最内层函数时,可以通过PC获取到第一函数所需调用的相关信息,从而使获取的调用栈中包含的信息更加完善。
在本发明实施例中,当计算出第二栈帧的最低位地址后,可以将该第二栈帧的最低位地址保存到第二栈帧对应的SP寄存器中,以便后续操作中可以依据保存的该第二栈帧的最低位地址,从该第二栈帧中获取调用第二函数的函数的指令地址。
在上述介绍中,第二栈帧对应的SP寄存器和第一栈帧对应的SP寄存器可以是同一个SP寄存器,在该SP寄存器中可以保存一个栈帧的最低位地址,以第一栈帧为例,SP寄存器中保存的是第一栈帧的最低位地址,依据上述操作步骤,当计算出第二栈帧的最低位地址后,则可以将该SP寄存器中保存的地址信息进行更新,即将该SP寄存器中保存的第一栈帧的最低位地址更新为第二栈帧的最低位地址。
通过更新SP寄存器中保存的栈帧的最低位地址,可以灵活、高效地获取所需函数之间的调用关系。
例如,对于一个线程,需要使用五个函数,第一个函数、第二个函数、第三个函数、第四个函数和第五个函数,第一个函数为最内层函数,最初在SP寄存器中保存的是该线程所需使用的最内层函数对应的栈帧(最内层栈帧)的最低位地址,当需要获取该线程中函数之间的调用关系时,需要从最内层栈帧开始,依据栈地址从低到高,一层一层获取栈帧中保存的函数的调用关系。但是,在一些情况下,可能需要获取第三个函数及其上层函数之间的调用关系,例如,已经获知第二个函数调用第一个函数,第三个函数调用第二个函数,现在只需要获知第三个函数、第四个函数和第五个函数之间的调用关系,对于这种情况,若SP寄存器中保存的仍是第一个函数对应的栈帧的最低位地址,则在获取函数之间的调用关系时,仍是从最内层栈帧开始,一层一层获取栈帧中保存的函数的调用关系,此时会重复获取第一个函数、第二个函数和第三个函数之间的调用关系,增加了工作量,降低了工作效率。对于这种情况,当已经获知第二个函数调用第一个函数,第三个函数调用第二个函数后,可以将SP寄存器中保存的栈帧的最低位地址更新为第三个函数所对应栈帧的最低位地址,以便于当只需获知第三个函数及其上层函数之间的调用关系时,可以直接从第三个函数所对应栈帧开始执行。
在上述实施例中,在每个栈帧中可以存储有该栈帧的长度信息,接下来将对栈帧中存储该栈帧的长度信息的具体方式展开介绍,具体操作如下:
执行移动指令,所述移动指令用于指示将所述第一栈帧的长度信息压到所述第一栈帧中。
移动指令可以是一条指令信息,用于实现栈帧的长度信息的存储。在具体实现中,可以是一条数据传送(MOV)指令。
通过该移动指令可以将第一栈帧的长度信息存储在该第一栈帧的某一个位置处,该位置的选取,可以是在所述第一栈帧中与所述第一栈帧最低位地址距离所述固定偏移设置一个地址空间;在所述地址空间中存储所述第一栈帧的长度信息。
例如,第一栈帧的最低位地址为第10bit,固定偏移为5bit,则可以在第一栈帧中地址为第15bit所指示的位置处设置一个地址空间,用于存储第一栈帧的长度信息。
由上述介绍可知,通过一条指令便可以实现在栈帧中存储该栈帧的长度信息,当获取到第一栈帧的最低位地址后,依据该第一栈帧长度信息,便可以确定出第二栈帧的最低位地址。
而传统方式中,为了获取上一层栈帧的位置,往往需要多条指令信息,参照图1,bp.B可以用于表示函数B对应的栈帧的位置,传统方式中,需要执行多条指令,才可以将bp.B存储到函数A对应的栈帧中。
相比于传统方式,本发明实施例采用的方式,有效的减少了指令的条数,从而减少系统性能的损耗,并且移动指令占用的内存极小,从而有效减少了可执行文件的大小。
本发明的设备实施例
图4为本发明实施例提供的一种栈解析装置的结构示意图,所述装置包括获取单元401、指令地址单元402、长度信息单元403和确定单元404:
所述获取单元401,用于获取第一栈帧的最低位地址,所述第一栈帧为所述多个栈帧中的一个栈帧,所述第一栈帧为用于保存第一函数私有资源的栈帧,所述第一函数为所述线程使用到的一个函数。
所述指令地址单元402,用于根据所述第一栈帧的最低位地址,从第一栈帧中获取第二函数的指令地址,所述第二函数用于在所述线程中调用第一函数,所述第二函数的指令地址用于指示第二函数调用第一函数的调用关系。
所述长度信息单元403,用于根据固定偏移以及所述第一栈帧的最低位地址所指示的位置,从所述第一栈帧中获取第一栈帧的长度信息。
所述确定单元404,用于根据所述第一栈帧的最低位地址以及所述第一栈帧的长度信息确定出第二栈帧的最低位地址,所述第二栈帧为用于保存所述第二函数私有资源的栈帧。
可选的,所述获取单元具体用于从所述第一栈帧对应的栈指针SP寄存器中获取所述第一栈帧的最低位地址。
可选的,所述装置还可以包括保存单元:
所述保存单元,用于将所述第二栈帧的最低位地址保存到所述第二栈帧对应的SP寄存器中。
可选的,所述第一栈帧为处于所述栈最内层的栈帧。
可选的,所述装置还可以包括执行单元:
所述执行单元,用于执行移动指令,所述移动指令用于指示将所述第一栈帧的长度信息压到所述第一栈帧中;
在所述第一栈帧中与所述第一栈帧最低位地址距离所述固定偏移设置一个地址空间;
在所述地址空间中存储所述第一栈帧的长度信息。
图4为从网络设备侧描述本发明技术方案的装置实施例,图4所对应实施例中特征的说明可以参见图3所对应实施例的相关说明,这里不再一一赘述。
由上述技术方案可以看出,通过在栈帧中与最低位地址距离固定偏移的位置存储该栈帧的长度信息,可以在栈解析过程中,通过获取一个栈帧例如第一栈帧的最低位地址可以从这个栈帧中得到第二函数调用这个栈帧所对应的第一函数的调用关系,并可以根据固定偏移从第一栈帧中得到第一栈帧的长度信息,从而可以依据第一栈帧的长度信息以及第一栈帧的最低位地址确定出第二栈帧的最低位地址,也就是第二函数所对应栈帧的位置,以此往复可以依次从各层栈帧中得到各函数的调用关系,可以在获取调用栈的过程中,不需要使用到BP寄存器,也不需要在栈帧中保存寄存器值,而所使用的SP寄存器在各个应用场景中基本都属于专用于栈帧的寄存器,SP寄存器不会被优化作为其他用处,能正确获取,从而在获取调用栈的过程中节约了寄存器资源,不会影响系统性能。
图5为本发明实施例提供的一种计算机设备的硬件结构示意图,所述计算机设备500包括存储器501、接收器502,以及分别与存储器501、接收器502连接的处理器503,存储器501用于存储一组程序指令,处理器503用于调用存储器501存储的程序指令执行如下操作:
触发接收器502获取第一栈帧的最低位地址,所述第一栈帧为所述多个栈帧中的一个栈帧,所述第一栈帧为用于保存第一函数私有资源的栈帧,所述第一函数为所述线程使用到的一个函数;
根据所述第一栈帧的最低位地址,从第一栈帧中获取第二函数的指令地址,所述第二函数用于在所述线程中调用第一函数,所述第二函数的指令地址用于指示第二函数调用第一函数的调用关系;
根据固定偏移以及所述第一栈帧的最低位地址所指示的位置,从所述第一栈帧中获取第一栈帧的长度信息;
根据所述第一栈帧的最低位地址以及所述第一栈帧的长度信息确定出第二栈帧的最低位地址,所述第二栈帧为用于保存所述第二函数私有资源的栈帧。
可选地,处理器503可以为中央处理器(Central Processing Unit,CPU),存储器501可以为随机存取存储器(Random Access Memory,RAM)类型的内部存储器,接收器502可以包含普通物理接口,物理接口可以为以太(Ethernet)接口或异步传输模式(Asynchronous Transfer Mode,ATM)接口。处理器503、接收器502和存储器501可以集成为一个或多个独立的电路或硬件,如:专用集成电路(Application Specific IntegratedCircuit,ASIC)。
图5所对应实施例中特征的说明可以参见图3所对应实施例的相关说明,这里不再一一赘述。
由上述技术方案可以看出,通过在栈帧中与最低位地址距离固定偏移的位置存储该栈帧的长度信息,可以在栈解析过程中,通过获取一个栈帧例如第一栈帧的最低位地址可以从这个栈帧中得到第二函数调用这个栈帧所对应的第一函数的调用关系,并可以根据固定偏移从第一栈帧中得到第一栈帧的长度信息,从而可以依据第一栈帧的长度信息以及第一栈帧的最低位地址确定出第二栈帧的最低位地址,也就是第二函数所对应栈帧的位置,以此往复可以依次从各层栈帧中得到各函数的调用关系,可以在获取调用栈的过程中,不需要使用到BP寄存器,也不需要在栈帧中保存寄存器值,而所使用的SP寄存器在各个应用场景中基本都属于专用于栈帧的寄存器,SP寄存器不会被优化作为其他用处,能正确获取,从而在获取调用栈的过程中节约了寄存器资源,不会影响系统性能。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质可以是下述介质中的至少一种:只读存储器(英文:read-only memory,缩写:ROM)、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于设备及系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的设备及系统实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述,仅为本发明的一些具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
Claims (10)
1.一种栈解析方法,其特征在于,应用于一个线程所对应的栈,所述栈中具有多个栈帧,所述方法包括:
获取第一栈帧的最低位地址,所述第一栈帧为所述多个栈帧中的一个栈帧,所述第一栈帧为用于保存第一函数私有资源的栈帧,所述第一函数为所述线程使用到的一个函数;
根据所述第一栈帧的最低位地址,从第一栈帧中获取第二函数的指令地址,所述第二函数用于在所述线程中调用第一函数,所述第二函数的指令地址用于指示第二函数调用第一函数的调用关系;
根据固定偏移以及所述第一栈帧的最低位地址所指示的位置,从所述第一栈帧中获取第一栈帧的长度信息;
根据所述第一栈帧的最低位地址以及所述第一栈帧的长度信息确定出第二栈帧的最低位地址,所述第二栈帧为用于保存第二函数私有资源的栈帧。
2.根据权利要求1所述的方法,其特征在于,所述获取第一栈帧的最低位地址,包括:
从所述第一栈帧对应的栈指针SP寄存器中获取所述第一栈帧的最低位地址。
3.根据权利要求1或2所述的方法,其特征在于,还包括:
将所述第二栈帧的最低位地址保存到所述第二栈帧对应的SP寄存器中。
4.根据权利要求1所述的方法,其特征在于,所述第一栈帧为处于所述栈最内层的栈帧。
5.根据权利要求1所述的方法,其特征在于,还包括:
执行移动指令,所述移动指令用于指示将所述第一栈帧的长度信息压到所述第一栈帧中;
在所述第一栈帧中与所述第一栈帧最低位地址距离所述固定偏移设置一个地址空间;
在所述地址空间中存储所述第一栈帧的长度信息。
6.一种栈解析装置,其特征在于,应用于一个线程所对应的栈,所述栈中具有多个栈帧,所述装置包括获取单元、指令地址单元、长度信息单元和确定单元:
所述获取单元,用于获取第一栈帧的最低位地址,所述第一栈帧为所述多个栈帧中的一个栈帧,所述第一栈帧为用于保存第一函数私有资源的栈帧,所述第一函数为所述线程使用到的一个函数;
所述指令地址单元,用于根据所述第一栈帧的最低位地址,从第一栈帧中获取第二函数的指令地址,所述第二函数用于在所述线程中调用第一函数,所述第二函数的指令地址用于指示第二函数调用第一函数的调用关系;
所述长度信息单元,用于根据固定偏移以及所述第一栈帧的最低位地址所指示的位置,从所述第一栈帧中获取第一栈帧的长度信息;
所述确定单元,用于根据所述第一栈帧的最低位地址以及所述第一栈帧的长度信息确定出第二栈帧的最低位地址,所述第二栈帧为用于保存第二函数私有资源的栈帧。
7.根据权利要求6所述的装置,其特征在于,所述获取单元具体用于从所述第一栈帧对应的栈指针SP寄存器中获取所述第一栈帧的最低位地址。
8.根据权利要求6或7所述的装置,其特征在于,还包括保存单元:
所述保存单元,用于将所述第二栈帧的最低位地址保存到所述第二栈帧对应的SP寄存器中。
9.根据权利要求6所述的装置,其特征在于,所述第一栈帧为处于所述栈最内层的栈帧。
10.根据权利要求6所述的装置,其特征在于,还包括执行单元、设置单元和存储单元:
所述执行单元,用于执行移动指令,所述移动指令用于指示将所述第一栈帧的长度信息压到所述第一栈帧中;
所述设置单元,用于在所述第一栈帧中与所述第一栈帧最低位地址距离所述固定偏移设置一个地址空间;
所述存储单元,用于在所述地址空间中存储所述第一栈帧的长度信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611145387.5A CN106802785B (zh) | 2016-12-13 | 2016-12-13 | 一种栈解析方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611145387.5A CN106802785B (zh) | 2016-12-13 | 2016-12-13 | 一种栈解析方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106802785A CN106802785A (zh) | 2017-06-06 |
CN106802785B true CN106802785B (zh) | 2019-07-09 |
Family
ID=58984858
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611145387.5A Expired - Fee Related CN106802785B (zh) | 2016-12-13 | 2016-12-13 | 一种栈解析方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106802785B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2020073200A1 (zh) * | 2018-10-09 | 2020-04-16 | 华为技术有限公司 | 调试程序的方法和系统 |
CN110489179B (zh) * | 2019-08-02 | 2022-12-27 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧函数签名的方法、装置、介质和设备 |
CN110764941B (zh) * | 2019-09-05 | 2023-04-18 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
CN114064302B (zh) * | 2020-07-30 | 2024-05-14 | 华为技术有限公司 | 一种进程间通信的方法及装置 |
CN112882695B (zh) * | 2021-03-02 | 2023-11-28 | 百果园技术(新加坡)有限公司 | 传参方法、装置、计算机设备及存储介质 |
CN113238800B (zh) * | 2021-05-25 | 2022-06-28 | 上海安路信息科技股份有限公司 | 堆栈帧结构和函数调用方法及系统 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103019787A (zh) * | 2012-12-14 | 2013-04-03 | 华为技术有限公司 | 函数调用关系确定方法、热补丁升级方法及装置 |
CN105678168A (zh) * | 2015-12-29 | 2016-06-15 | 北京神州绿盟信息安全科技股份有限公司 | 一种基于栈异常的shellcode检测方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8732681B2 (en) * | 2011-05-16 | 2014-05-20 | Texas Instruments Incorporated | Stack analysis for post mortem analysis |
-
2016
- 2016-12-13 CN CN201611145387.5A patent/CN106802785B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103019787A (zh) * | 2012-12-14 | 2013-04-03 | 华为技术有限公司 | 函数调用关系确定方法、热补丁升级方法及装置 |
CN105678168A (zh) * | 2015-12-29 | 2016-06-15 | 北京神州绿盟信息安全科技股份有限公司 | 一种基于栈异常的shellcode检测方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN106802785A (zh) | 2017-06-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106802785B (zh) | 一种栈解析方法和装置 | |
CN105843741B (zh) | 应用程序的信息处理方法和装置 | |
WO2019091217A1 (zh) | 脚本调试方法、设备及计算机存储介质 | |
US9459989B2 (en) | Method and apparatus for reverse debugging source code using causal analysis | |
JP6363152B2 (ja) | データフロー分析のための装置、方法、コンピュータプログラム及び記憶媒体 | |
US8555256B2 (en) | Pass-by breakpoint setting and debugging method and device | |
US11709756B2 (en) | Dynamic distributed tracing instrumentation in a microservice architecture | |
CN107003899A (zh) | 一种中断响应方法、装置及基站 | |
CN107436752B (zh) | 异常现场恢复方法、装置及计算机可读存储介质 | |
CN105027089B (zh) | 内核功能性检查器 | |
WO2017197982A1 (zh) | 报文处理方法、装置及系统和计算机存储介质 | |
CN107678807A (zh) | 一种软件实现状态机的方法及装置 | |
WO2017202083A1 (zh) | 微码调试方法及单板 | |
CN104572482B (zh) | 一种过程变量的存储方法及装置 | |
WO2020073200A1 (zh) | 调试程序的方法和系统 | |
CN117251361A (zh) | 一种测试系统稳定性的方法、装置、设备和存储介质 | |
CN116483643A (zh) | 一种gpu调试方法、装置、设备及存储介质 | |
WO2017215439A1 (zh) | 一种变量信息提取方法、装置及计算机存储介质 | |
CN114217927A (zh) | 一种线程调用方法、装置、计算机设备及存储介质 | |
CN107800593A (zh) | 一种网络压力的测试方法及系统 | |
US9959225B2 (en) | Computer apparatus and control method of computer apparatus | |
CN106708689B (zh) | 异常设备定位方法及装置 | |
CN112445525B (zh) | 数据处理方法、相关设备及计算机可读介质 | |
CN108170463B (zh) | 一种安卓设备的出厂设置方法和装置 | |
JP2009223841A (ja) | 命令ログ取得プログラム及び仮想計算機システム |
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 | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20190709 Termination date: 20211213 |
|
CF01 | Termination of patent right due to non-payment of annual fee |