调用链实时追踪方法、系统及相关设备转让专利

申请号 : CN202311455575.8

文献号 : CN117171058B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 苏杭王露朱强

申请人 : 睿思芯科(深圳)技术有限公司

摘要 :

本发明适用于软件状态监测与分析技术领域,尤其涉及一种调用链实时追踪方法、系统及相关设备,所述方法包括:在程序的函数入口进行标记,并通过标记获取程序在函数入口的程序跳转信息;通过缓存空间记录并获取程序运行时处于函数出口和函数内部的程序跳转信息;确定追踪目标现场,并根据所有的程序跳转信息构建程序调用树;对程序调用树使用预设内存优化算法进行优化,得到合并程序调用树;根据合并程序调用树对程序的调用链进行解析,得到追踪目标现场下的调用链结果;将调用链结果输出。本发明提出的程序实时追踪的方法降低了对程序正常运行的影响,有效解决多任务系统中的软件任务调度、硬件跳转等难以追踪的问题。

权利要求 :

1.一种调用链实时追踪方法,其特征在于,所述调用链实时追踪方法包括以下步骤:S1、在程序的函数入口标记追踪点,并通过所述追踪点获取所述程序在所述函数入口的程序跳转信息;所述程序跳转信息包括所述程序中各个函数的跳转前的起始地址、跳转后的目标地址、所述起始地址对应的第一栈顶地址、所述起始地址对应的第一上级栈顶地址、所述目标地址对应的第二栈顶地址、所述目标地址对应的第二上级栈顶地址;步骤S1包括以下子步骤:S11、进入程序调用追踪流程,判断当前所述程序是否属于调用目标,若是,执行步骤S12;若否,执行步骤S17;

S12、标记所述程序在所述追踪点的位置的调试状态;

S13、使所述程序运行至所述起始地址;

S14、在调试模式下获取所述目标地址;

S15、获取所述程序调度的在所述目标地址下的任务栈信息;

S16、将所述任务栈信息输出为所述程序跳转信息;

S17、退出所述程序调用追踪流程;

S2、通过缓存空间记录并获取所述程序运行时处于函数出口和函数内部的所述程序跳转信息;

S3、确定追踪目标现场,所述追踪目标现场为还原所述程序的函数执行环境,并根据所有的所述程序跳转信息构建程序调用树;步骤S3包括以下子步骤:S31、判断当前的所述程序调用树是否满足所述追踪目标现场,若否,执行步骤S32;若是,执行步骤S36;

S32、以所述程序跳转信息对应的所述程序的函数作为树节点,并以所述程序跳转信息和所述树节点的位置作为键值构建字典条目,所述字典条目为字典的子集;

S33、根据所述第一上级栈顶地址和所述第二上级栈顶地址确定所述程序中函数所属的所述任务栈信息,并对新的任务进行记录;

S34、根据所述第一上级栈顶地址和所述第二上级栈顶地址确定所述树节点的上级节点;

S35、在所述字典条目中进行索引,以将所述树节点作为所述上级节点的子节点,并将其插入所述上级节点的子节点序列,以更新所述程序调用树;之后,返回步骤S31;

S36、输出所述程序调用树;

S4、对所述程序调用树使用预设内存优化算法进行优化,得到合并程序调用树;

S5、根据所述合并程序调用树对所述程序的调用链进行解析,得到所述程序在所述追踪目标现场下的调用链结果;

S6、将所述调用链结果输出。

2.如权利要求1所述的调用链实时追踪方法,其特征在于,所述缓存空间包括多个缓存条,每一所述缓存条包括2组程序计数器数值和4组栈顶寄存器数值, 2组所述程序计数器数值分别为所述起始地址和所述目标地址, 4组所述栈顶寄存器数值分别为所述第一栈顶地址、所述第一上级栈顶地址、所述第二栈顶地址、所述第二上级栈顶地址。

3.如权利要求1所述的调用链实时追踪方法,其特征在于,所述程序调用树为N叉树。

4.如权利要求1所述的调用链实时追踪方法,其特征在于,对所述程序调用树使用预设内存优化算法进行优化,得到合并程序调用树的步骤,包括以下子步骤:S41、根据栈生存时间对所述字典进行优化,以对所述字典条目中包含相同所述键值的条目进行移除;

S42、根据栈生存时间对所述程序调用树进行优化,以对所述树节点中包含相同所述任务栈信息的节点进行合并;

S43、将完成所述字典条目合并和所述树节点合并的所述程序调用树输出,得到所述合并程序调用树。

5.一种调用链实时追踪系统,其特征在于,包括:

软件追踪模块,用于在程序的函数入口标记追踪点,并通过所述追踪点获取所述程序在所述函数入口的程序跳转信息;所述程序跳转信息包括所述程序中各个函数的跳转前的起始地址、跳转后的目标地址、所述起始地址对应的第一栈顶地址、所述起始地址对应的第一上级栈顶地址、所述目标地址对应的第二栈顶地址、所述目标地址对应的第二上级栈顶地址;所述软件追踪模块具体用于执行以下步骤:S11、进入程序调用追踪流程,判断当前所述程序是否属于调用目标,若是,执行步骤S12;若否,执行步骤S17;

S12、标记所述程序在所述追踪点的位置的调试状态;

S13、使所述程序运行至所述起始地址;

S14、在调试模式下获取所述目标地址;

S15、获取所述程序调度的在所述目标地址下的任务栈信息;

S16、将所述任务栈信息输出为所述程序跳转信息;

S17、退出所述程序调用追踪流程;

硬件追踪模块,用于通过缓存空间记录并获取所述程序运行时处于函数出口和函数内部的所述程序跳转信息;

调用树构建模块,用于确定追踪目标现场,所述追踪目标现场为还原所述程序的函数执行环境,并根据所有的所述程序跳转信息构建程序调用树;所述调用树构建模块具体用于执行以下步骤:S31、判断当前的所述程序调用树是否满足所述追踪目标现场,若否,执行步骤S32;若是,执行步骤S36;

S32、以所述程序跳转信息对应的所述程序的函数作为树节点,并以所述程序跳转信息和所述树节点的位置作为键值构建字典条目,所述字典条目为字典的子集;

S33、根据所述第一上级栈顶地址和所述第二上级栈顶地址确定所述程序中函数所属的所述任务栈信息,并对新的任务进行记录;

S34、根据所述第一上级栈顶地址和所述第二上级栈顶地址确定所述树节点的上级节点;

S35、在所述字典条目中进行索引,以将所述树节点作为所述上级节点的子节点,并将其插入所述上级节点的子节点序列,以更新所述程序调用树;之后,返回步骤S31;

S36、输出所述程序调用树;

调用树优化模块,用于对所述程序调用树使用预设内存优化算法进行优化,得到合并程序调用树;

调用追踪模块,用于根据所述合并程序调用树对所述程序的调用链进行解析,得到所述程序在所述追踪目标现场下的调用链结果;

输出模块,用于将所述调用链结果输出。

6.一种计算机设备,其特征在于,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的调用链实时追踪程序,所述处理器执行所述调用链实时追踪程序时实现如权利要求1‑4中任意一项所述的调用链实时追踪方法中的步骤。

7.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有调用链实时追踪程序,所述调用链实时追踪程序被处理器执行时实现如权利要求1‑4中任意一项所述的调用链实时追踪方法中的步骤。

说明书 :

调用链实时追踪方法、系统及相关设备

技术领域

[0001] 本发明适用于软件状态监测与分析技术领域,尤其涉及一种调用链实时追踪方法、系统及相关设备。

背景技术

[0002] 随着万物互联趋势的不断发展,物联网技术广泛的应用于人们的日常生活和社会公共服务,成千上万的嵌入式设备已被部署用于数据采集、监控和实时控制。而对于这些开发过程中面临的巨量的调试分析需求也更加迫切和密集,为此,业界提出诸多追踪方案,用于保存程序运行日志,通过分析问题现场的错误,以及梳理运行整体相关日志从而定位错误原因,并提出解决方案。
[0003] 常用的方案一般是在一些关键函数入口和出口添加追踪代码函数,或称为埋点,随着软件程序的运行,可以通过埋点获得关键函数的调用时机和相应状态,从而根据关键的一些系统信息或者部分的数据完成对问题的大概定位。然而,这种方案存在的问题是无法获得完整的调用链,还需要进一步定位才能获取问题现场,以及相关的问题原因位置;而如果在全部函数出入口添加代码,虽然可以获取完整调用链,但常常因为软件代码的复杂自身调用而引发更多额外或频繁的追踪调用,导致追踪代码影响了正常代码的运行,甚至可能破坏问题现场;对应的优化技术通过减少对信息的采集或通过硬件设备来获取信息的方式来追踪信息,以降低对源程序的影响,例如通过对所有方法或函数的入口和出口添加标识信息,并通过硬件模块保存时间信息和标识信息,主机或追踪系统通过直接访问寄存器方式获得这些信息,从而获得每个函数的开始执行和退出时间和相关参数信息,这种方案可以较小地影响源程序的正常运行。但是,这种方案一方面依靠时间信息来确定各个函数的调用时间,这种在多任务系统下可能无法区分公用函数在不同任务的各自执行时间,因为多任务系统可能会导致同一个公用函数被反复嵌套调用。单纯依靠简单的出入时间而不确定入口和出口是同一个任务下的匹配调用,甚至会引发错误的统计结果。
[0004] 此外,相关技术在面对多任务系统下的函数调用流恢复存在较多问题。首先,在函数被调用的出入口添加追踪点可以捕捉到该函数的调用开始和结束,但是对于大型的软件系统这会导致追踪点过多进而不可避免地较明显影响原有软件地正常运行;
[0005] 其次,多任务系统下的函数调用流包含了中断或异常导致任务切换,这种切换发生的地方可能在任意位置,通过预先在函数出入口添加代码的追踪方案无法完成对这种随机地址跳转目的地的追踪,导致出口和入口的匹配可能出现错误,进而引发函数调用的相关统计偏差;
[0006] 另外,在多任务系统中,想要复现或追踪某个问题现场,而当该问题涉及多任务模块的耦合关系时,单靠恢复当前任务下函数调用链往往难以准确定位问题原因,因此需要能够恢复多任务的完整调用链。而要想实时地、追踪多任务内部、之间地函数执行流,需要保存巨量地函数符号,相关追踪技术没有提出完整高效的解决方案。这些问题导致现有的集成开发环境的调试环境对于开发维护人员不够友好,使得维护人员在面对复杂问题的快速定位分析解决等方面效率低下。
[0007] 因此,亟需提出一种新的调用链追踪方法来解决上述问题。

发明内容

[0008] 本发明提供一种调用链实时追踪方法、系统及相关设备,旨在解决现有技术的调用链追踪方案影响程序性能、难以定位调用链位置的问题。
[0009] 第一方面,本发明提供一种调用链实时追踪方法,所述调用链实时追踪方法包括以下步骤:
[0010] S1、在程序的函数入口进行标记,并通过所述标记获取所述程序在所述函数入口的程序跳转信息;
[0011] S2、通过缓存空间记录并获取所述程序运行时处于函数出口和函数内部的所述程序跳转信息;
[0012] S3、确定追踪目标现场,所述追踪目标现场为还原所述程序的函数执行环境,并根据所有的所述程序跳转信息构建程序调用树;
[0013] S4、对所述程序调用树使用预设内存优化算法进行优化,得到合并程序调用树;
[0014] S5、根据所述合并程序调用树对所述程序的调用链进行解析,得到所述程序在所述追踪目标现场下的调用链结果;
[0015] S6、将所述调用链结果输出。
[0016] 更进一步地,所述程序跳转信息包括所述程序中各个函数的跳转前的起始地址、跳转后的目标地址、所述起始地址对应的第一栈顶地址、所述起始地址对应的第一上级栈顶地址、所述目标地址对应的第二栈顶地址、所述目标地址对应的第二上级栈顶地址。
[0017] 更进一步地,所述缓存空间包括多个缓存条,每一所述缓存条包括2组程序计数器数值和4组栈顶寄存器数值, 2组所述程序计数器数值分别为所述起始地址和所述目标地址, 4组所述栈顶寄存器数值分别为所述第一栈顶地址、所述第一上级栈顶地址、所述第二栈顶地址、所述第二上级栈顶地址。
[0018] 更进一步地,在所述程序的函数入口进行标记,并通过所述标记获取所述程序在所述函数入口的所述程序跳转信息的步骤,包括以下子步骤:
[0019] S11、进入程序调用追踪流程,判断当前所述程序是否属于调用目标,若是,执行步骤S12;若否,执行步骤S17;
[0020] S12、标记所述程序在所述标记的位置的调试状态;
[0021] S13、使所述程序运行至所述起始地址;
[0022] S14、在调试模式下获取所述目标地址;
[0023] S15、获取所述程序调度的在所述目标地址下的任务栈信息;
[0024] S16、将所述任务栈信息输出为所述程序跳转信息;
[0025] S17、退出所述程序调用追踪流程。
[0026] 更进一步地,根据所有的所述程序跳转信息构建程序调用树的步骤,包括以下子步骤:
[0027] S31、判断当前的所述程序调用树是否满足所述追踪目标场景,若否,执行步骤S32;若是,执行步骤S3;
[0028] S32、以所述程序跳转信息对应的所述程序的函数作为树节点,并以所述程序跳转信息和所述树节点的位置作为键值构建字典条目,所述字典条目为字典的子集;
[0029] S33、根据所述第一上级栈顶地址和所述二上级栈顶地址确定所述程序中函数所属的所述任务栈信息,并对新的任务进行记录;
[0030] S34、根据所述第一上级栈顶地址和所述二上级栈顶地址确定所述树节点的上级节点;
[0031] S35、在所述字典条目中进行索引,以将所述树节点作为所述上级节点的子节点,并将其插入所述上级节点的子节点序列,以更新所述程序调用树;之后,返回步骤S31;
[0032] S36、输出所述程序调用树。
[0033] 更进一步地,所述程序调用树为N叉树。
[0034] 更进一步地,对所述程序调用树使用预设内存优化算法进行优化,得到合并程序调用树的步骤,包括以下子步骤:
[0035] S41、根据栈生存时间对所述字典进行优化,以对所述字典条目中包含相同所述键值的条目进行移除;
[0036] S42、根据栈生存时间对所述程序调用树进行优化,以对所述树节点中包含相同所述任务栈信息的节点进行合并;
[0037] S43、将完成所述字典条目合并和所述树节点合并的所述程序调用树输出,得到所述合并程序调用树。
[0038] 第二方面,本发明还提供一种调用链实时追踪系统,包括:
[0039] 软件追踪模块,用于在程序的函数入口进行标记,并通过所述标记获取所述程序在所述函数入口的程序跳转信息;
[0040] 硬件追踪模块,用于通过缓存空间记录并获取所述程序运行时处于函数出口和函数内部的所述程序跳转信息;
[0041] 调用树构建模块,用于确定追踪目标现场,所述追踪目标现场为还原所述程序的函数执行环境,并根据所有的所述程序跳转信息构建程序调用树;
[0042] 调用树优化模块,用于对所述程序调用树使用预设内存优化算法进行优化,得到合并程序调用树;
[0043] 调用追踪模块,用于根据所述合并程序调用树对所述程序的调用链进行解析,得到所述程序在所述追踪目标现场下的调用链结果;
[0044] 输出模块,用于将所述调用链结果输出。
[0045] 第三方面,本发明还提供一种计算机设备,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的调用链实时追踪程序,所述处理器执行所述调用链实时追踪程序时实现如上述实施例中任意一项所述的调用链实时追踪方法中的步骤。
[0046] 第四方面,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有调用链实时追踪程序,所述调用链实时追踪程序被处理器执行时实现如上述实施例中任意一项所述的调用链实时追踪方法中的步骤。
[0047] 本发明所达到的有益效果,在于提出了一种针对多任务系统下的程序实时追踪的方法,该方法不需要额外添加、修改程序源代码,避免低效的重编译,降低了对程序正常运行的影响,同时能够基于字典和树结构完整恢复多任务模块之间的函数调用流程,可以有效解决多任务系统中的软件任务调度、硬件跳转等难以追踪的问题;此外,该方法还设计了基于调用树的输出模块以提供显示页面功能,从而能够进一步提高调试人员的工作效率。

附图说明

[0048] 图1是本发明实施例提供的调用链实时追踪方法的步骤流程框图;
[0049] 图2是本发明实施例提供的程序调用树中树节点的合并过程示意图;
[0050] 图3是本发明实施例提供的调用链结果的可视化界面示意图;
[0051] 图4是本发明实施例提供的调用链实时追踪的结构示意图;
[0052] 图5是本发明实施例提供的计算机设备的结构示意图。

具体实施方式

[0053] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0054] 请参照图1,图1是本发明实施例提供的调用链实时追踪方法的步骤流程框图,本发明实施例中的所述调用链实时追踪方法的主要分析目标为嵌入式设备上的软件程序,定义为目标设备;所述调用链实时追踪方法可以基于另一台供开发、维护人员使用的服务器或个人电脑来运行或实现,该设备用于搭载集成开发环境或追踪系统软件,定义为主机设备。所述调用链实时追踪方法包括以下步骤:
[0055] S1、在程序的函数入口进行标记,并通过所述标记获取所述程序在所述函数入口的程序跳转信息。
[0056] 本发明实施例中,通过标记程序函数内部的入口指令、而不是在函数被调用的位置的指令,这样的设计一方面可以省略追踪过程中对源代码的解析流程,另一方面可以减少相关技术使用的内嵌于程序的埋点,以降低对源程序的正常运行的影响。本发明实施例中的标记指的是对该任务引发的模块、任务、进程跳转的指令进行针对性标记,从而实现程序的追踪。
[0057] 具体的,所述程序跳转信息包括所述程序中各个函数的跳转前的起始地址、跳转后的目标地址、所述起始地址对应的第一栈顶地址、所述起始地址对应的第一上级栈顶地址、所述目标地址对应的第二栈顶地址、所述目标地址对应的第二上级栈顶地址。
[0058] 本发明实施例中,在所述程序的函数入口进行标记,并通过所述标记获取所述程序在所述函数入口的所述程序跳转信息的步骤,包括以下子步骤:
[0059] S11、进入程序调用追踪流程,判断当前所述程序是否属于调用目标,若是,执行步骤S12;若否,执行步骤S17;
[0060] S12、标记所述程序在所述标记的位置的调试状态;
[0061] S13、使所述程序运行至所述起始地址;
[0062] S14、在调试模式下获取所述目标地址;
[0063] S15、获取所述程序调度的在所述目标地址下的任务栈信息;
[0064] S16、将所述任务栈信息输出为所述程序跳转信息;
[0065] S17、退出所述程序调用追踪流程。
[0066] S2、通过缓存空间记录并获取所述程序运行时处于函数出口和函数内部的所述程序跳转信息。
[0067] 所述缓存空间包括多个缓存条,每一所述缓存条包括2组程序计数器数值和4组栈顶寄存器数值, 2组所述程序计数器数值分别为所述起始地址和所述目标地址, 4组所述栈顶寄存器数值分别为所述第一栈顶地址、所述第一上级栈顶地址、所述第二栈顶地址、所述第二上级栈顶地址。所述缓存空间保存的程序运行期间的所述程序跳转信息用于提供给主机设备读取,从而实现恢复程序执行流等调试操作。缓存空间的大小需结合目标设备的配置而设计,可以是数条、数十条、或数百条,每个数值的宽度等于目标设备的通用寄存器的比特数。
[0068] 示例性的,所述缓存空间可以设计为环形缓存,从而提高读写效率,所述缓存空间与目标设备的内核处理器通过总线连接,数据由目标设备内核处理器传出,所述缓存空间可以设定为异步先进先出的缓存器,并通过格雷码进行时钟同步。
[0069] 本发明实施例基于步骤S1和步骤S2设计了一种基于软件和硬件实现的程序跳转信息获取方式,其各自侧重在函数不同位置的跳转信息获取,函数的入口处进行捕获不需要埋点设计,而函数内部和出口处的获取则会最大程度地捕获到程序的运行信息。这样设计的优点在于,能够结合硬件的回传性能和软件的兼容性实现程序跳转追踪,从而得到更加符合使用场景的数据。在实际实施过程中,可以根据实际需要对软件和硬件的程序跳转信息获取方式进行选择,如仅通过步骤S1的软件获取方式,或仅通过步骤S2的硬件获取方式。
[0070] S3、确定追踪目标现场,所述追踪目标现场为还原所述程序的函数执行环境,并根据所有的所述程序跳转信息构建程序调用树。
[0071] 所述程序调用树为N叉树,本发明实施例中的N叉树并不用于查找子节点,而仅用来记录每个任务模块的执行流,比如针对单独的一个N叉树,其根节点的子节点则定义为程序中不同函数执行的任务。
[0072] 根据所有的所述程序跳转信息构建程序调用树的步骤,包括以下子步骤:
[0073] S31、判断当前的所述程序调用树是否满足所述追踪目标场景,若否,执行步骤S32;若是,执行步骤S3;
[0074] S32、以所述程序跳转信息对应的所述程序的函数作为树节点,并以所述程序跳转信息和所述树节点的位置作为键值构建字典条目,所述字典条目为字典的子集;
[0075] S33、根据所述第一上级栈顶地址和所述二上级栈顶地址确定所述程序中函数所属的所述任务栈信息,并对新的任务进行记录;
[0076] S34、根据所述第一上级栈顶地址和所述二上级栈顶地址确定所述树节点的上级节点;
[0077] S35、在所述字典条目中进行索引,以将所述树节点作为所述上级节点的子节点,并将其插入所述上级节点的子节点序列,以更新所述程序调用树;之后,返回步骤S31;
[0078] S36、输出所述程序调用树。
[0079] 具体的,所述树节点的创建是根据时间或调用顺序而顺序创建的,而对于每个任务根节点的子节点,同样执行相同操作,则可以逐步构建出完整的调用树。N叉树的数据结构在实现时,可以是基于多维数组实现的、或更复杂的综合数据结构实现的。示例性的,对于任意函数栈帧的调用,通过在字典中创建一个条目表明当前执行了某个函数,同时以当前栈帧、程序计数器作为键,以该函数的其他相关信息、以及树中的位置作为值,构建键值对,以存储在字典集合中;类似的,根据上级栈帧、程序计数器作为父节点的键,通过在字典集合中搜索父节点的键,可以得到值,从而定位到父级节点所在位置,并将当前的树节点插入到父级节点的子节点序列中。
[0080] 本发明实施例中,字典底层使用哈希算法完成键到值的转换运算。
[0081] S4、对所述程序调用树使用预设内存优化算法进行优化,得到合并程序调用树。
[0082] 由于本发明实施例将所有出现的节点存储到字典集合中,如果调用链追踪的方法运行时间过长,或者针对程序代码中的循环调用等,会产生大量的重复节点,这些重复节点会导致大量的内存占用,并影响后续的查找效率。在多用户或多应用的场景下,如果存在长时间运行情况,对于调试效率可能会有负面影响。因此本发明实施例在步骤S4中进一步对字典的集合进行内存优化。
[0083] 本发明实施例中,对所述程序调用树使用预设内存优化算法进行优化,得到合并程序调用树的步骤,包括以下子步骤:
[0084] S41、根据栈生存时间对所述字典进行优化,以对所述字典条目中包含相同所述键值的条目进行移除;
[0085] S42、根据栈生存时间对所述程序调用树进行优化,以对所述树节点中包含相同所述任务栈信息的节点进行合并;
[0086] S43、将完成所述字典条目合并和所述树节点合并的所述程序调用树输出,得到所述合并程序调用树。
[0087] 上述步骤S41可以基于以下方式实现:
[0088] 根据父级栈确定所述任务,以得到所属栈空间;
[0089] 若当前的函数栈已被占用:
[0090] 根据函数栈获取字典中已存在的键;
[0091] 根据键获取调用树中已存在的节点;
[0092] 遍历所有子节点,以获取子节点的键值;
[0093] 根据遍历到的重复的键进行移除;
[0094] 生成新的键并存入字典中。
[0095] 类似的,将上述步骤中移除重复的键的步骤替换为合并重复的内容,即可实现所述程序调用树中树节点的合并,所述程序调用树中树节点的合并过程示意图如图2所示。
[0096] S5、根据所述合并程序调用树对所述程序的调用链进行解析,得到所述程序在所述追踪目标场景下的调用链结果。
[0097] 本发明实施例可以结合集成开发环境进行用户配置页面,在对调用链进行解析时,只需要根据既定的追踪目标,对追踪起点进行检查,当检查到运行点到达指定起始位置时,就可以开始记录并解析追踪信息。
[0098] 示例性的,设定追踪目标为多目标场景为先后触发任务A下事件A1、任务B下事件B1、任务C下事件C1后停止,通过在集成开发环境内标记这三个事件位置,当捕捉到触发当前事件C1,且其前置目标场景事件A1、B1也触发后,该目标现场为最终目标现场,从而停止追踪,将其输出为所述调用链结果。
[0099] S6、将所述调用链结果输出。
[0100] 优选的,本发明实施例中的所述调用链结果可以通过可视化界面输出,本发明实施例提供的一种调用链结果的可视化界面如图3所示,其中每个函数代表一个程序调用树上的树节点,这些节点可以动态折叠,也可以清晰的给出每个函数的执行的任务内的调用线路、以及任务间的调用全部线路。这样的设计对于快速分析任务间耦合关系具有很好的效果。
[0101] 本发明所达到的有益效果,在于提出了一种针对多任务系统下的程序实时追踪的方法,该方法不需要额外添加、修改程序源代码,避免低效的重编译,降低了对程序正常运行的影响,同时能够基于字典和树结构完整恢复多任务模块之间的函数调用流程,可以有效解决多任务系统中的软件任务调度、硬件跳转等难以追踪的问题;此外,该方法还设计了基于调用树的输出模块以提供显示页面功能,从而能够进一步提高调试人员的工作效率。
[0102] 本发明实施例还提供一种调用链实时追踪系统200,请参照图4,图4是本发明实施例提供的调用链实时追踪的结构示意图,其包括:
[0103] 软件追踪模块201,用于在程序的函数入口进行标记,并通过所述标记获取所述程序在所述函数入口的程序跳转信息;
[0104] 硬件追踪模块202,用于通过缓存空间记录并获取所述程序运行时处于函数出口和函数内部的所述程序跳转信息;
[0105] 调用树构建模块203,用于确定追踪目标现场,所述追踪目标现场为还原所述程序的函数执行环境,并根据所有的所述程序跳转信息构建程序调用树;
[0106] 调用树优化模块204,用于对所述程序调用树使用预设内存优化算法进行优化,得到合并程序调用树;
[0107] 调用追踪模块205,用于根据所述合并程序调用树对所述程序的调用链进行解析,得到所述程序在所述追踪目标现场下的调用链结果;
[0108] 输出模块206,用于将所述调用链结果输出。
[0109] 所述调用链实时追踪系统200能够实现如上述实施例中的调用链实时追踪方法中的步骤,且能实现同样的技术效果,参上述实施例中的描述,此处不再赘述。
[0110] 本发明实施例还提供一种计算机设备,请参照图5,图5是本发明实施例提供的计算机设备的结构示意图,所述计算机设备300包括:存储器302、处理器301及存储在所述存储器302上并可在所述处理器301上运行的调用链实时追踪程序。
[0111] 所述处理器301调用所述存储器302存储的调用链实时追踪程序,执行本发明实施例提供的调用链实时追踪方法中的步骤,请结合图1,具体包括以下步骤:
[0112] S1、在程序的函数入口进行标记,并通过所述标记获取所述程序在所述函数入口的程序跳转信息;
[0113] S2、通过缓存空间记录并获取所述程序运行时处于函数出口和函数内部的所述程序跳转信息;
[0114] S3、确定追踪目标现场,所述追踪目标现场为还原所述程序的函数执行环境,并根据所有的所述程序跳转信息构建程序调用树;
[0115] S4、对所述程序调用树使用预设内存优化算法进行优化,得到合并程序调用树;
[0116] S5、根据所述合并程序调用树对所述程序的调用链进行解析,得到所述程序在所述追踪目标现场下的调用链结果;
[0117] S6、将所述调用链结果输出。
[0118] 更进一步地,所述程序跳转信息包括所述程序中各个函数的跳转前的起始地址、跳转后的目标地址、所述起始地址对应的第一栈顶地址、所述起始地址对应的第一上级栈顶地址、所述目标地址对应的第二栈顶地址、所述目标地址对应的第二上级栈顶地址。
[0119] 更进一步地,所述缓存空间包括多个缓存条,每一所述缓存条包括2组程序计数器数值和4组栈顶寄存器数值, 2组所述程序计数器数值分别为所述起始地址和所述目标地址, 4组所述栈顶寄存器数值分别为所述第一栈顶地址、所述第一上级栈顶地址、所述第二栈顶地址、所述第二上级栈顶地址。
[0120] 更进一步地,在所述程序的函数入口进行标记,并通过所述标记获取所述程序在所述函数入口的所述程序跳转信息的步骤,包括以下子步骤:
[0121] S11、进入程序调用追踪流程,判断当前所述程序是否属于调用目标,若是,执行步骤S12;若否,执行步骤S17;
[0122] S12、标记所述程序在所述标记的位置的调试状态;
[0123] S13、使所述程序运行至所述起始地址;
[0124] S14、在调试模式下获取所述目标地址;
[0125] S15、获取所述程序调度的在所述目标地址下的任务栈信息;
[0126] S16、将所述任务栈信息输出为所述程序跳转信息;
[0127] S17、退出所述程序调用追踪流程。
[0128] 更进一步地,根据所有的所述程序跳转信息构建程序调用树的步骤,包括以下子步骤:
[0129] S31、判断当前的所述程序调用树是否满足所述追踪目标场景,若否,执行步骤S32;若是,执行步骤S3;
[0130] S32、以所述程序跳转信息对应的所述程序的函数作为树节点,并以所述程序跳转信息和所述树节点的位置作为键值构建字典条目,所述字典条目为字典的子集;
[0131] S33、根据所述第一上级栈顶地址和所述二上级栈顶地址确定所述程序中函数所属的所述任务栈信息,并对新的任务进行记录;
[0132] S34、根据所述第一上级栈顶地址和所述二上级栈顶地址确定所述树节点的上级节点;
[0133] S35、在所述字典条目中进行索引,以将所述树节点作为所述上级节点的子节点,并将其插入所述上级节点的子节点序列,以更新所述程序调用树;之后,返回步骤S31;
[0134] S36、输出所述程序调用树。
[0135] 更进一步地,所述程序调用树为N叉树。
[0136] 更进一步地,对所述程序调用树使用预设内存优化算法进行优化,得到合并程序调用树的步骤,包括以下子步骤:
[0137] S41、根据栈生存时间对所述字典进行优化,以对所述字典条目中包含相同所述键值的条目进行移除;
[0138] S42、根据栈生存时间对所述程序调用树进行优化,以对所述树节点中包含相同所述任务栈信息的节点进行合并;
[0139] S43、将完成所述字典条目合并和所述树节点合并的所述程序调用树输出,得到所述合并程序调用树。
[0140] 本发明实施例提供的计算机设备300能够实现如上述实施例中的调用链实时追踪方法中的步骤,且能实现同样的技术效果,参上述实施例中的描述,此处不再赘述。
[0141] 本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有调用链实时追踪程序,该调用链实时追踪程序被处理器执行时实现本发明实施例提供的调用链实时追踪方法中的各个过程及步骤,且能实现相同的技术效果,为避免重复,这里不再赘述。
[0142] 本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过调用链实时追踪程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read‑Only Memory,ROM)或随机存取存储器(Random Access Memory,简称RAM)等。
[0143] 需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
[0144] 通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
[0145] 上面结合附图对本发明的实施例进行了描述,所揭露的仅为本发明较佳实施例而已,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式用等同变化,均属于本发明的保护之内。