CN103019707A - 调用栈的解析处理方法及装置 - Google Patents
调用栈的解析处理方法及装置 Download PDFInfo
- Publication number
- CN103019707A CN103019707A CN2012105045052A CN201210504505A CN103019707A CN 103019707 A CN103019707 A CN 103019707A CN 2012105045052 A CN2012105045052 A CN 2012105045052A CN 201210504505 A CN201210504505 A CN 201210504505A CN 103019707 A CN103019707 A CN 103019707A
- Authority
- CN
- China
- Prior art keywords
- stack
- return address
- function
- address value
- size
- 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.)
- Granted
Links
Images
Landscapes
- Executing Machine-Instructions (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明实施例提供一种调用栈的解析处理方法及装置,该方法包括:按照预设字节数进行逐层搜索,若通过判断获知当前位置的搜索值是一个有效的返回地址值,则获取所述有效的返回地址值以及当前位置的栈指针;获得所述返回地址值所在层的本层开栈大小以及在本层中的存储偏移;根据每一个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,将各个所述返回地址值进行串接,获得候选调用栈;根据预设的筛选规则,在所述至少一个候选调用栈中筛选出目标调用栈。本发明实施例通过获取多个有效的RA值,并判断获得的有效的RA以及其所属函数,再将这些RA串接得到至少一个候选调用栈,从中筛选出目标调用栈,可以得到优选的调用栈解析结果。
Description
技术领域
本发明实施例涉及调用栈解析技术,尤其涉及一种调用栈的解析处理方法及装置。
背景技术
通常在对软件调试时,需要查看当前函数的调用栈,也就是一个体现函数调用关系的函数调用链,比如,函数f1调用函数f2,函数f2调用函数f3,则f1→f2→f3就是一个调用栈。具体地,一个函数到另一个函数之间可能存在多种调用情况,例如,函数f1到函数f3的调用栈可以是f1→f2→f3,也可以是f1→f4→f5→f3,因此,当程序出现异常、检测到错误或被断点断住时,需要查看当前函数的当前调用栈。
现有技术中,查看当前函数的调用栈的常用方式有X86调用栈解析方式,这种方式中,由硬件约定扩展基指针寄存器(Extended Base Pointer,EBP)与返回地址(Return Address,RA)相邻存放,当前EBP指向的位置保存上一层的EBP信息,且当前EBP地址加4的位置保存上一层的RA,因此,如果得到当前EBP的值,便可查找到上一层的EBP,依此类推,最终获取所有RA,再从汇编指令中得到RA对应的函数信息,最后得到调用栈。
发明人在实现本发明实施例的过程中发现,采用现有技术中解析调用栈的方式,必须硬件或编译器支持,否则不可用;而且如果程序中的当前调用栈被破坏或者缺失寄存器现场,将无法得到调用栈。
发明内容
本发明实施例提供一种调用栈的解析处理方法及装置,用以解决当调用栈中缺失寄存器现场或被破坏时无法得到该调用栈的问题。
本发明实施例第一方面提供一种调用栈的解析处理方法,包括:
在将栈的起始地址按预设字节数对齐后,按照所述预设字节数进行逐层搜索,若通过判断获知当前位置的搜索值是一个有效的返回地址值,则获取所述有效的返回地址值以及当前位置的栈指针;
获取每一个有效的返回地址值的所属函数,扫描所述所属函数的汇编指令,获得所述返回地址值所在层的本层开栈大小以及在本层中的存储偏移,所述本层开栈大小为所述所属函数的入口到所述当前位置的开栈大小;
根据每一个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,将各个所述返回地址值进行串接,获得至少一个候选调用栈;
根据预设的筛选规则,在所述至少一个候选调用栈中筛选出目标调用栈。
结合第一方面的第一种实现方式中,判断当前位置的搜索值是否是一个有效的返回地址值的步骤包括:
对每一个预设字节数的栈值依次进行是否位于代码段、是否位于函数体、是否满足指令对齐要求、是否临近区域存在函数调用指令的判断,若均满足,则获知当前位置的搜索值是一个有效的返回地址值。
结合第一方面的第二种实现方式中,所述根据每一个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,将各个所述返回地址值进行串接包括:
若任意两个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,满足连接规则,则将两个有效的返回地址值进行串接;
所述连接规则包括但不限于:若SPi-OFFSETi+SIZEi=SPk-OFFSETk;或,SPi+OFFSETi+SIZEi=SPk,则RAk的所属函数为RAi的所属函数的父函数;
其中,任意两个有效的返回地址值分别记为RAi和RAk,且i<k;RAi和RAk的栈指针分别为SPi和SPk,存储偏移分别为OFFSETi和OFFSETk,对应的本层开栈大小为SIZEi和SIZEk。
结合第一方面或第一方面的第一种实现方式或第一方面的第二种实现方式的第三种实现方式中,所述预设的筛选规则包括:
排除孤立的有效的返回地址值;
最后一个有效的返回地址值的所属函数为相同的入口函数的多个候选调用栈中,排除包括结点数量少的候选调用栈;
排除最后一个有效的返回地址值的所属函数不为入口函数的候选调用栈。
本发明实施例第二方面提供一种调用栈的解析处理装置,包括:
第一获取模块,用于在将栈的起始地址按预设字节数对齐后,按照所述预设字节数进行逐层搜索,若通过判断获知当前位置的搜索值是一个有效的返回地址值,则获取所述有效的返回地址值以及当前位置的栈指针;
第二获取模块,用于获取每一个有效的返回地址值的所属函数,扫描所述所属函数的汇编指令,获得所述返回地址值所在层的本层开栈大小以及在本层中的存储偏移;所述本层开栈大小为所述所属函数的入口到所述当前位置的开栈大小;
串接模块,用于根据每一个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,将各个所述返回地址值进行串接,获得至少一个候选调用栈;
筛选模块,用于根据预设的筛选规则,在所述至少一个候选调用栈中筛选出目标调用栈。
结合第二方面的第一种实现方式中,所述第一获取模块判断当前位置的搜索值是否是一个有效的返回地址值具体包括:
对每一个预设字节数的栈值依次进行是否位于代码段、是否位于函数体、是否满足指令对齐要求、是否临近区域存在函数调用指令的判断,若均满足,则获知当前位置的搜索值是一个有效的返回地址值。
结合第二方面的第二种实现方式中,所述串接模块具体用于包括:
若任意两个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,满足连接规则,则将两个有效的返回地址值进行串接,获得至少一个候选调用栈;
所述连接规则包括但不限于:若SPi-OFFSETi+SIZEi=SPk-OFFSETk;或,SPi+OFFSETi+SIZEi=SPk,则RAk的所属函数为RAi的所属函数的父函数;
其中,任意两个有效的返回地址值分别记为RAi和RAk,且i<k;RAi和RAk的栈指针分别为SPi和SPk,存储偏移分别为OFFSETi和OFFSETk,对应的本层开栈大小为SIZEi和SIZEk。
结合第二方面或第二方面的第一种实现方式或第二方面的第二种实现方式的第三种实现方式中,所述预设的筛选规则包括:
排除孤立的有效的返回地址值;
最后一个有效的返回地址值的所属函数为相同的入口函数的多个候选调用栈中,排除包括结点数量少的候选调用栈;
排除最后一个有效的返回地址值的所属函数不为入口函数的候选调用栈。
本实施例中,通过在栈内逐层搜索,获取多个有效的RA值,进而通过判断获得的有效的RA以及其所属函数,并根据每一个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,将这些RA串接得到至少一个候选调用栈,再从中筛选出目标调用栈,以得到优选的调用栈解析结果。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明提供的调用栈的解析处理方法一实施例的流程图;
图2为本发明提供的调用栈的解析处理方法另一实施例的流程图;
图3为本发明提供的调用栈的解析处理方法另一实施例的场景示意图;
图4为本发明提供的调用栈的解析处理方法另一实施例的另一场景示意图;
图5为本发明提供的调用栈的解析处理方法另一实施例的结构示意图;
图6为本发明提供的调用栈的解析处理方法另一实施例的结构示意图;
图7为本发明提供给的调用栈的解析处理装置一实施例的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明提供的调用栈的解析处理方法一实施例的流程图,如图所示,该方法包括:
S101、在将栈的起始地址按预设字节数对齐后,按照该预设字节数进行逐层搜索,若通过判断获知当前位置的搜索值是一个有效的返回地址值,则获取该有效的返回地址(Return Address,简称RA)值以及当前位置的栈指针(Stack Pointer,简称SP);
具体地,以32位处理器为例,在32位处理器中,RA和SP都是以4字节存储在栈中,即这里预设字节数为4字节,因此将栈的起始地址按预设字节数对齐,即如果栈的起始地址不是4的倍数,则进行调整,从下一个4的倍数位置开始搜索。以扫描一块12字节大小的栈内存为例,假设该栈内存起始地址为0x00082001,栈由高地址向低地址增长,对该块栈内存从起始地址处开始依次编号为0~11,由于起始地址(对应编号0的位置),没有按4字节对齐,故从编号3对应的位置,对应地址0x00082004开始搜索,相应的,当前搜索值为栈内从当前搜索位置开始连续4字节的内容,即在该例中编号“3、4、5、6”位置中的内容,最终被搜索的值为编号“3、4、5、6”和编号“7、8、9、10”位置中的内容,另外,最后一个字节,即编号11位置,不够4字节,不参与搜索。
S102、获取每一个有效的RA值的所属函数,扫描该所属函数的汇编指令,获得上述RA所在层的本层开栈大小以及在本层中的存储偏移,其中,该本层开栈大小为上述所属函数的入口到上述当前位置的开栈大小;其中,当前位置为保存RA的位置。
需要说明的是,程序中每一个有效的RA只可能对应一个函数,即该RA值的所属函数。
S103、根据每一个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,将各个上述返回地址值进行串接,获得至少一个候选调用栈;这种重新串接的方式,无需严格按照原调用栈的串接方式,例如,当前函数f1调用函数f2,函数f2调用函数f3,但是f2异常或出现其他故障,依然可以获得f1→f3作为候选调用栈。
S104、根据预设的筛选规则,在上述至少一个候选调用栈中筛选出目标调用栈。
本实施例中,通过在栈内逐层搜索,获取多个有效的RA值,进而判断获得有效的RA以及其所属函数,并将这些RA串接得到至少一个候选调用栈,再从中筛选出目标调用栈,得到优选的调用栈解析结果。
图2为本发明提供的调用栈的解析处理方法另一实施例的流程图,如图2所示,具体实现过程中,上述判断当前位置的搜索值是否是一个有效的返回地址值的步骤包括:对每一个预设字节数的栈值依次进行是否位于代码段、是否位于函数体、是否满足指令对齐要求、是否临近区域存在函数调用指令的判断,若均满足,则获知当前位置的搜索值是一个有效的RA;其中预设字节数的栈值就是搜索值,即搜索值要符合预设的字节数,具体地,
S201、判断当前搜索值是否位于代码段,若位于代码段,则执行S202,否则执行S206;因为在程序中RA一定位于代码段,而不会是数据段或其它段中;该步骤也可以为可选步骤,因为执行了S202,可以判断出搜索值在函数体内,而一般函数体都是位于代码段的,所以该步骤可省略,当然如果执行该步骤,可以使判断性能更好。
S202、判断当前搜索值是否位于函数体内,也就是不包含函数开头的其它指令区域,若位于函数体内,则执行S203,否则执行S206。
S203、判断当前搜索值是否满足指令对齐要求,若满足,则执行S205,否则执行S206;例如,一些处理器的指令地址要求按4字节对齐。
S204、判断当前搜索值临近区域内是否存在函数调用指令,若存在,则实行S205,否则执行S206;因为RA的作用是为了让子函数返回到父函数的RA处继续执行,所以对于一个保存在栈中的RA,必然存在着父函数对子函数的调用。
S205、记录当前搜索值,即RA值以及当前位置的SP值。
S206、给当前搜索值加预设字节数,获得新的搜索值位置的SP值,进而重复执行步骤S201~S206,获取栈内所有的RA。
另外,上述根据每一个有效的RA值对应的栈地址、本层开栈大小和存储偏移,将各个上述RA值进行串接,举例说明具体实现过程:
所有搜索出的RA值会按照搜索顺序进行编号,将任意两个有效的RA记为RAi和RAk,且i<k,其中,RAi和RAk的栈指针分别为SPi和SPk,存储偏移分别为OFFSETi和OFFSETk,对应的本层开栈大小为SIZEi和SIZEk;
若任意两个有效的RA值对应的栈指针、本层开栈大小和存储偏移,满足连接规则,则将两个有效的RA值进行串接;
该连接规则包括但不限于:若SPi-OFFSETi+SIZEi=SPk-OFFSETk;或,SPi+OFFSETi+SIZEi=SPk,这两种连接规则分别体现了栈内的两种场景,这两种场景的差异在于存储偏移的方向不同,如果满足该连接规则,RAk的所属函数为RAi的所属函数的父函数,可以将RAk和RAi串接起来。
图3为本发明提供的调用栈的解析处理方法另一实施例的场景示意图,如图3所示,为符合SPi-OFFSETi+SIZEi=SPk-OFFSETk的场景,即上述连接规则中的第一种。
图4为本发明提供的调用栈的解析处理方法另一实施例的另一场景示意图,如图4所示,为符合SPi+OFFSETi+SIZEi=SPk的场景,即上述连接规则中的第二种。
进一步的,上述预设的筛选规则可以包括以下三种,但并不以此为限:
1、排除孤立的有效RA值,即没有其它RA值可以与该RA值串接,因而该RA的所属函数可能没有调用其它函数也没有被其它函数调用,该RA也可能只是程序运行时保存在栈中的过程值,而不属于当前调用栈;
2、最后一个有效的返回地址值的所属函数为相同的入口函数的多个候选调用栈中,排除包括结点数量少的候选调用栈;例如,存在最后一个有效的返回地址值的所属函数为相同的入口函数的调用栈A和调用栈B,其中调用栈A为f1→f4→f5→f3,而调用栈B为f2→f5→f3,则排除调用栈B;
3、排除最后一个有效的返回地址值的所属函数不为入口函数的候选调用栈,即如果调用栈A的最后一个有效的RA值所属函数为入口函数,而调用栈B的最后一个有效的RA值所属函数不是入口函数,那么排除调用栈B。
需要说明的是,以上几种筛选规则在实施过程中,并非强制实行,可以根据具体情况选择使用。
图5为本发明提供的调用栈的解析处理方法另一实施例的结构示意图,如图5所示,举例说明上述筛选规则2,即调用栈A为f1→f4→f5→f3,而调用栈B为f2→f5→f3,则排除调用栈B,保留调用栈A作进一步筛选。
图6为本发明提供的调用栈的解析处理方法另一实施例的结构示意图,如图6所示,举例说明上述筛选规则3,即调用栈A为f2→f1→f5,而调用栈B为f3→f1→f4,其中f5为入口函数,而f4不是入口函数,则排除调用栈B,保留调用栈A作进一步筛选。
本实施例中,通过在栈内逐层搜索,通过判断获得有效的RA以及其所属函数,并将这些RA按照一定连接规则串接,得到至少一个候选调用栈,再从中筛选出目标调用栈,即得到优选的调用栈解析结果;另外,本实施例中提供的方法,可以在调用栈被破坏或缺失寄存器现场时,依然可以解析得到一个优选的调用栈进行查看,且通过本实施例提供的串接方法还可以获得当前函数已调用子函数的历史调用函数,并且相对于现有技术,可靠性和准确性更高。
图7为本发明提供给的调用栈的解析处理装置一实施例的结构示意图,如图7所示,该装置包括:第一获取模块301、第二获取模块302、串接模块303和筛选模块304,其中:
第一获取模块301,用于在将栈的起始地址按预设字节数对齐后,按照所述预设字节数进行逐层搜索,若通过判断获知当前位置的搜索值是一个有效的返回地址值,则获取所述有效的返回地址值以及当前位置的栈指针;
第二获取模块302,用于获取每一个有效的返回地址值的所属函数,扫描所述所属函数的汇编指令,获得所述返回地址值所在层的本层开栈大小以及在本层中的存储偏移;所述本层开栈大小为所述所属函数的入口到所述当前位置的开栈大小;
串接模块303,用于根据每一个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,将各个所述返回地址值进行串接,获得至少一个候选调用栈;
筛选模块304,用于根据预设的筛选规则,在所述至少一个候选调用栈中筛选出目标调用栈。
本实施例中,通过在栈内逐层搜索,获取多个有效的RA值,通过判断获得有效的RA以及其所属函数,并将这些RA串接得到至少一个候选调用栈,再从中筛选出目标调用栈,即得到优选的调用栈解析结果。
在具体实现过程中,第一获取模块301判断当前位置的搜索值是否是一个有效的返回地址值具体包括:
对每一个预设字节数的栈值依次进行是否位于代码段、是否位于函数体、是否满足指令对齐要求、是否临近区域存在函数调用指令的判断,若均满足,则获知当前位置的搜索值是一个有效的返回地址值。
串接模块303具体用于包括:若任意两个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,满足连接规则,则将两个有效的返回地址值进行串接,获得至少一个候选调用栈;
所述连接规则包括但不限于:若SPi-OFFSETi+SIZEi=SPi-OFFSETk;或,SPi+OFFSETi+SIZEi=SPk,则RAk的所属函数为RAi的所属函数的父函数;
其中,任意两个有效的返回地址值分别记为RAi和RAk,且i<k;RAi和RAk的栈指针分别为SPi和SPk,存储偏移分别为OFFSETi和OFFSETk,对应的本层开栈大小为SIZEi和SIZEk。
需要说明的是,上述预设的筛选规则包括:
排除孤立的有效的返回地址值;
最后一个有效的返回地址值的所属函数为相同的入口函数的多个候选调用栈中,排除包括结点数量少的候选调用栈;
排除最后一个有效的返回地址值的所属函数不为入口函数的候选调用栈。
需要说明的是,以上几种筛选规则在实施过程中,并非强制实行,可以根据具体情况选择使用。
本实施例中,通过在栈内逐层搜索,通过判断获得的有效的RA以及其所属函数,并将这些RA按照一定连接规则串接,得到至少一个候选调用栈,再根据预设的筛选规则从中筛选出目标调用栈,就可以得到优选的调用栈解析结果;另外,本实施例中提供的方法,可以在调用栈被破坏或缺失寄存器现场时,依然可以解析得到一个优选的调用栈进行查看,且通过本实施例提供的串接方法还可以获得当前函数已调用子函数的历史调用函数,并且相对于现有技术,可靠性和准确性更高。
本发明实施例还提供一种调用栈的解析处理装置,该装置包括一处理器,所述处理器通过运行内部程序以执行以下操作,包括:在将栈的起始地址按预设字节数对齐后,按照所述预设字节数进行逐层搜索,若通过判断获知当前位置的搜索值是一个有效的返回地址值,则获取所述有效的返回地址值以及当前位置的栈指针;获取每一个有效的返回地址值的所属函数,扫描所述所属函数的汇编指令,获得所述返回地址值所在层的本层开栈大小以及在本层中的存储偏移;所述本层开栈大小为所述所属函数的入口到所述当前位置的开栈大小;根据每一个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,将各个所述返回地址值进行串接,获得至少一个候选调用栈;根据预设的筛选规则,在所述至少一个候选调用栈中筛选出目标调用栈。在本发明所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本发明各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
Claims (8)
1.一种调用栈的解析处理方法,其特征在于,包括:
在将栈的起始地址按预设字节数对齐后,按照所述预设字节数进行逐层搜索,若通过判断获知当前位置的搜索值是一个有效的返回地址值,则获取所述有效的返回地址值以及当前位置的栈指针;
获取每一个有效的返回地址值的所属函数,扫描所述所属函数的汇编指令,获得所述返回地址值所在层的本层开栈大小以及在本层中的存储偏移,所述本层开栈大小为所述所属函数的入口到所述当前位置的开栈大小;
根据每一个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,将各个所述返回地址值进行串接,获得至少一个候选调用栈;
根据预设的筛选规则,在所述至少一个候选调用栈中筛选出目标调用栈。
2.根据权利要求1所述的方法,其特征在于,判断当前位置的搜索值是否是一个有效的返回地址值的步骤包括:
对每一个预设字节数的栈值依次进行是否位于代码段、是否位于函数体、是否满足指令对齐要求、是否临近区域存在函数调用指令的判断,若均满足,则获知当前位置的搜索值是一个有效的返回地址值。
3.根据权利要求1所述的方法,其特征在于,所述根据每一个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,将各个所述返回地址值进行串接包括:
若任意两个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,满足连接规则,则将两个有效的返回地址值进行串接;
所述连接规则包括但不限于:若SPi-OFFSETi+SIZEi=SPk-OFFSETk;或,SPi+OFFSETi+SIZEi=SPk,则RAk的所属函数为RAi的所属函数的父函数;
其中,任意两个有效的返回地址值分别记为RAi和RAk,且i<k;RAi和RAk的栈指针分别为SPi和SPk,存储偏移分别为OFFSETi和OFFSETk,对应的本层开栈大小为SIZEi和SIZEk。
4.根据权利要求1或2或3所述的方法,其特征在于,所述预设的筛选规则包括:
排除孤立的有效的返回地址值;
最后一个有效的返回地址值的所属函数为相同的入口函数的多个候选调用栈中,排除包括结点数量少的候选调用栈;
排除最后一个有效的返回地址值的所属函数不为入口函数的候选调用栈。
5.一种调用栈的解析处理装置,其特征在于,包括:
第一获取模块,用于在将栈的起始地址按预设字节数对齐后,按照所述预设字节数进行逐层搜索,若通过判断获知当前位置的搜索值是一个有效的返回地址值,则获取所述有效的返回地址值以及当前位置的栈指针;
第二获取模块,用于获取每一个有效的返回地址值的所属函数,扫描所述所属函数的汇编指令,获得所述返回地址值所在层的本层开栈大小以及在本层中的存储偏移;所述本层开栈大小为所述所属函数的入口到所述当前位置的开栈大小;
串接模块,用于根据每一个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,将各个所述返回地址值进行串接,获得至少一个候选调用栈;
筛选模块,用于根据预设的筛选规则,在所述至少一个候选调用栈中筛选出目标调用栈。
6.根据权利要求5所述的装置,其特征在于,所述第一获取模块判断当前位置的搜索值是否是一个有效的返回地址值具体包括:
对每一个预设字节数的栈值依次进行是否位于代码段、是否位于函数体、是否满足指令对齐要求、是否临近区域存在函数调用指令的判断,若均满足,则获知当前位置的搜索值是一个有效的返回地址值。
7.根据权利要求5所述的装置,其特征在于,所述串接模块具体用于包括:
若任意两个有效的返回地址值对应的栈指针、本层开栈大小和存储偏移,满足连接规则,则将两个有效的返回地址值进行串接,获得至少一个候选调用栈;
所述连接规则包括但不限于:若SPi-OFFSETi+SIZEi=SPk-OFFSETk;或,SPi+OFFSETi+SIZEi=SPk,则RAk的所属函数为RAi的所属函数的父函数;
其中,任意两个有效的返回地址值分别记为RAi和RAk,且i<k;RAi和RAk的栈指针分别为SPi和SPk,存储偏移分别为OFFSETi和OFFSETk,对应的本层开栈大小为SIZEi和SIZEk。
8.根据权利要求5或6或7所述的装置,其特征在于,所述预设的筛选规则包括:
排除孤立的有效的返回地址值;
最后一个有效的返回地址值的所属函数为相同的入口函数的多个候选调用栈中,排除包括结点数量少的候选调用栈;
排除最后一个有效的返回地址值的所属函数不为入口函数的候选调用栈。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210504505.2A CN103019707B (zh) | 2012-11-30 | 2012-11-30 | 调用栈的解析处理方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210504505.2A CN103019707B (zh) | 2012-11-30 | 2012-11-30 | 调用栈的解析处理方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103019707A true CN103019707A (zh) | 2013-04-03 |
CN103019707B CN103019707B (zh) | 2016-01-27 |
Family
ID=47968346
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210504505.2A Expired - Fee Related CN103019707B (zh) | 2012-11-30 | 2012-11-30 | 调用栈的解析处理方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103019707B (zh) |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104035765A (zh) * | 2014-05-22 | 2014-09-10 | 烽火通信科技股份有限公司 | 一种嵌入式系统上下文的分析方法 |
CN104484179A (zh) * | 2014-12-23 | 2015-04-01 | 上海斐讯数据通信技术有限公司 | 一种栈回溯方法 |
CN107704383A (zh) * | 2017-09-12 | 2018-02-16 | 中国航空工业集团公司洛阳电光设备研究所 | 一种基于任务栈分析的动态测试函数覆盖率获取方法 |
CN108475233A (zh) * | 2016-01-19 | 2018-08-31 | 阿姆Ip有限公司 | 用于分配存储器的方法 |
CN110489165A (zh) * | 2019-08-02 | 2019-11-22 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
CN110737465A (zh) * | 2018-07-20 | 2020-01-31 | 武汉斗鱼网络科技有限公司 | 一种函数调用路径获取的方法和相关装置 |
CN110737488A (zh) * | 2019-09-24 | 2020-01-31 | 普联技术有限公司 | 基于MIPS平台打印嵌入式Linux应用程序backtrace的方法、装置及设备 |
CN111209042A (zh) * | 2020-01-06 | 2020-05-29 | 北京字节跳动网络技术有限公司 | 一种建立函数栈的方法、装置、介质和电子设备 |
CN112905381A (zh) * | 2021-03-22 | 2021-06-04 | 北京字节跳动网络技术有限公司 | 用于获取调用栈中栈帧信息的方法、装置、设备和介质 |
CN113238883A (zh) * | 2021-04-30 | 2021-08-10 | 烽火通信科技股份有限公司 | 一种堆栈回溯的方法及装置 |
WO2023016485A1 (zh) * | 2021-08-12 | 2023-02-16 | 华为技术有限公司 | 用于获取函数调用信息的方法、装置、电子设备和介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101261603A (zh) * | 2008-04-09 | 2008-09-10 | 中兴通讯股份有限公司 | 故障定位的方法和装置 |
US20100318852A1 (en) * | 2009-06-16 | 2010-12-16 | Microsoft Corporation | Visualization tool for system tracing infrastructure events |
US20120297370A1 (en) * | 2011-05-16 | 2012-11-22 | Texas Instruments Incorporated | Stack Analysis for Post Mortem Analysis |
-
2012
- 2012-11-30 CN CN201210504505.2A patent/CN103019707B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101261603A (zh) * | 2008-04-09 | 2008-09-10 | 中兴通讯股份有限公司 | 故障定位的方法和装置 |
US20100318852A1 (en) * | 2009-06-16 | 2010-12-16 | Microsoft Corporation | Visualization tool for system tracing infrastructure events |
US20120297370A1 (en) * | 2011-05-16 | 2012-11-22 | Texas Instruments Incorporated | Stack Analysis for Post Mortem Analysis |
Non-Patent Citations (1)
Title |
---|
李云: "规定的栈帧结构", 《HTTP://BOOK.51CTO.COM/ART/201111/304066.HTM》 * |
Cited By (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104035765B (zh) * | 2014-05-22 | 2017-03-15 | 烽火通信科技股份有限公司 | 一种嵌入式系统上下文的分析方法 |
CN104035765A (zh) * | 2014-05-22 | 2014-09-10 | 烽火通信科技股份有限公司 | 一种嵌入式系统上下文的分析方法 |
CN104484179A (zh) * | 2014-12-23 | 2015-04-01 | 上海斐讯数据通信技术有限公司 | 一种栈回溯方法 |
CN108475233A (zh) * | 2016-01-19 | 2018-08-31 | 阿姆Ip有限公司 | 用于分配存储器的方法 |
CN107704383A (zh) * | 2017-09-12 | 2018-02-16 | 中国航空工业集团公司洛阳电光设备研究所 | 一种基于任务栈分析的动态测试函数覆盖率获取方法 |
CN110737465A (zh) * | 2018-07-20 | 2020-01-31 | 武汉斗鱼网络科技有限公司 | 一种函数调用路径获取的方法和相关装置 |
CN110737465B (zh) * | 2018-07-20 | 2023-09-22 | 深圳市大梦龙途网络科技有限公司 | 一种函数调用路径获取的方法和相关装置 |
CN110489165B (zh) * | 2019-08-02 | 2021-10-15 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
CN110489165A (zh) * | 2019-08-02 | 2019-11-22 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
CN110737488A (zh) * | 2019-09-24 | 2020-01-31 | 普联技术有限公司 | 基于MIPS平台打印嵌入式Linux应用程序backtrace的方法、装置及设备 |
CN111209042A (zh) * | 2020-01-06 | 2020-05-29 | 北京字节跳动网络技术有限公司 | 一种建立函数栈的方法、装置、介质和电子设备 |
CN111209042B (zh) * | 2020-01-06 | 2022-08-26 | 北京字节跳动网络技术有限公司 | 一种建立函数栈的方法、装置、介质和电子设备 |
CN112905381B (zh) * | 2021-03-22 | 2022-12-06 | 北京字节跳动网络技术有限公司 | 用于获取调用栈中栈帧信息的方法、装置、设备和介质 |
CN112905381A (zh) * | 2021-03-22 | 2021-06-04 | 北京字节跳动网络技术有限公司 | 用于获取调用栈中栈帧信息的方法、装置、设备和介质 |
CN113238883A (zh) * | 2021-04-30 | 2021-08-10 | 烽火通信科技股份有限公司 | 一种堆栈回溯的方法及装置 |
WO2023016485A1 (zh) * | 2021-08-12 | 2023-02-16 | 华为技术有限公司 | 用于获取函数调用信息的方法、装置、电子设备和介质 |
Also Published As
Publication number | Publication date |
---|---|
CN103019707B (zh) | 2016-01-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103019707A (zh) | 调用栈的解析处理方法及装置 | |
CN102819497B (zh) | 一种内存分配方法、装置及系统 | |
CN110096227B (zh) | 数据存储方法、数据处理方法、装置、电子设备及计算机可读介质 | |
CN107450852B (zh) | 一种存储空间处理方法、装置和设备 | |
US7536432B2 (en) | Parallel merge/sort processing device, method, and program for sorting data strings | |
US9063655B2 (en) | Multi-level port expansion for port multipliers | |
CN105095287A (zh) | Lsm数据合并排序方法和装置 | |
CN108108127A (zh) | 一种文件读取方法及系统 | |
CN106201774B (zh) | 一种nand flash存储芯片数据存储结构分析方法 | |
CN104899016A (zh) | 调用堆栈关系获取方法及装置 | |
CN109739824A (zh) | 日志获取方法及设备 | |
CN107291392A (zh) | 一种固态硬盘及其读写方法 | |
CN106326014A (zh) | 一种资源访问方法及装置 | |
CN110504002B (zh) | 一种硬盘数据一致性测试方法与装置 | |
CN103902419A (zh) | 一种缓存测试方法及装置 | |
CN104298922A (zh) | 一种阻止漏洞利用的方法及装置 | |
CN105700917A (zh) | 一种dll与数据库同步的方法及装置 | |
CN105302679A (zh) | 一种智能终端存储稳定性的检测方法及系统 | |
CN103235745A (zh) | 一种地址冲突检测方法及装置 | |
CN105830067A (zh) | 一种文件信息处理方法、装置及文件处理设备、系统 | |
AU2021339989B2 (en) | Tri-color bitmap array for garbage collection | |
CN112083891B (zh) | 一种存储器中数据块的检测方法及相关设备 | |
CN114924923A (zh) | 一种硬盘写入点正确性验证方法、系统、设备及介质 | |
CN106293993A (zh) | 避免重复处理文件的方法及装置 | |
CN112199116A (zh) | 操作数栈寄存器识别方法、装置、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20160127 Termination date: 20181130 |
|
CF01 | Termination of patent right due to non-payment of annual fee |