CN105224305A - 函数调用路径编解码方法、装置及系统 - Google Patents
函数调用路径编解码方法、装置及系统 Download PDFInfo
- Publication number
- CN105224305A CN105224305A CN201410310847.XA CN201410310847A CN105224305A CN 105224305 A CN105224305 A CN 105224305A CN 201410310847 A CN201410310847 A CN 201410310847A CN 105224305 A CN105224305 A CN 105224305A
- Authority
- CN
- China
- Prior art keywords
- function
- function call
- call
- path
- path code
- 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
Landscapes
- Mobile Radio Communication Systems (AREA)
Abstract
一种函数调用路径编解码方法、装置及系统,其中所述方法包括,执行程序过程中,构建调用函数到当前跳转目标函数的函数调用边;对新构建的函数调用边进行编码,包括:将当前的路径编码现场保存至编码信息的记录中,路径编码现场包括现场路径编码值、调用点地址和目标地址;将新路径编码值更新为当前最大路径编码值+1;为编码信息添加对应的时间戳并对程序进行插桩。在本发明实施例中,实时动态构建程序的函数调用图的同时,还对动态构建的函数调用图进行相应的动态编码,由于保存了到达当前函数的路径中所有的新增函数调用边的路径信息和避免新设置的编码值与原有编码值发生冲突,所以使本申请中的动态编码后的函数调用路径编码可以被正确的解码。
Description
技术领域
本发明涉及编程领域,尤其涉及函数调用路径编解码方法、装置及系统。
背景技术
程序员可以通过函数调用栈来获取函数调用路径信息;函数调用路径信息已被广泛应用在了很多领域,比如程序动态执行信息分析、程序调试和错误报告、软件测试、安全保证、事件记录等。
目前,获取函数调用路径信息的方法包括函数调用路径编码(Precisecallingcontextencoding,PCCE)方法,
PCCE方法的基本思想是,在函数调用图中,根据函数之间的调用关系将调用函数和被调用函数通过连线连接,并将用于表示调用函数和被调用函数之间的调用关系的连线称为函数调用边。
通过对设定的函数调用边预设编码值,以将函数调用图中不同的函数调用路径的计算为不同的路径编码值;具体的,函数调用路径由多个函数调用边构成,由于设定的函数调用边设有预设编码值,这样,在程序的执行过程中,插桩代码会根据程序的执行路径实时计算函数调用路径的路径编码值,通过所述多个函数调用边所对应的编码值的计算,从而使得每个函数调用路径可以对应不同的路径编码值。这样在运行时的函数调用路径编码和程序当前指令地址(<id,pc>)对应着唯一一条函数调用路径,进而可以在程序中的任一个函数中利用函数调用边的编码值来区分不同函数的调用路径。
发明人经过研究发现,采用现有技术中的函数调用路径编码方法时,如果需要在函数路径图中构建新的函数调用边,那么含有新的函数调用边的函数调用路径的路径编码就会与已有函数调用路径的路径编码发生冲突,从而导致收集到的函数调用路径的路径编码不能被正确的解码。
发明内容
本发明实施例提供了函数调用路径编解码方法、装置及系统,用以解决现有技术中存在的函数调用路径的路径编码不能被正确的解码的技术问题。
本发明实施例第一方面提供了一种函数调用路径编码方法,包括:
将程序的主函数构建为函数调用图的初始节点;
执行所述程序过程中,判断当前跳转目标函数在所述函数调用图是否有对应的节点;
如果否,在所述函数调用图中为所述当前跳转目标函数设置对应的节点后,构建调用函数到所述当前跳转目标函数的函数调用边;
如果是,构建调用函数到所述当前跳转目标函数的函数调用边;
对新构建的所述函数调用边进行编码,包括:
将当前的路径编码现场保存至编码信息的记录中,所述路径编码现场包括现场路径编码值、调用点地址和目标地址;
将所述新构建的函数调用边的当前路径编码值更新为当前函数调用图中最大路径编码值maxID+1;
为所述编码信息添加对应的时间戳;
根据所述编码信息对所述程序进行插桩。
结合本发明实施例的第一方面,本发明实施例的第一方面的第一种实现方式中,所述记录存储于辅助栈。
结合本发明实施例的第一方面,本发明实施例的第一方面的第二种实现方式中,所述判断当前跳转目标函数在所述函数调用图是否有对应的节点,包括:
将当前运行函数的所有函数调用指令替换为调用运行时处理函数的代码,并保存寄存器现场;
在所述运行时处理函数中,根据保存的寄存器上下文计算得到所述跳转目标函数的调用目标地址;
根据所述调用目标地址判断当前跳转目标函数在所述函数调用图是否有对应的节点。
在第一方面的第三种可能的实现方式中,结合第一方面的第二种可能的实现方式,还包括:
当所述函数调用图符合预设的重新编码触发条件时,将所述函数调用图按照PCCE方法进行重新编码。
在第一方面的第四种可能的实现方式中,结合第一方面的第三种可能的实现方式,所述重新编码触发条件,包括:
所述函数调用图中新增加的函数调用边的数量达到预定门限,或,
到达预定的重新编码时间点,且频繁执行的函数调用路径发生变化。
在第一方面的第五种可能的实现方式中,结合第一方面的第四种可能的实现方式,所述重新编码,包括:
计算不包含递归调用边的函数调用图中各个节点的拓扑排序;
在生成编码信息时,根据所述拓扑排序对各个节点和函数调用边进行编码,为不同的函数调用路径设置不同的路径编码值;
为所述编码信息添加对应的时间戳;
根据所述编码信息对所述程序进行插桩。
在第一方面的第六种可能的实现方式中,结合第一方面的第五种可能的实现方式,所述根据所述拓扑排序对各个节点和函数调用边进行编码,为不同的函数调用路径设置不同的路径编码值包括:
当所述节点对应函数的调用指令为间接调用指令时,判断到当前跳转目标函数的函数调用边是否为新增函数调用边;
对各个新增函数调用边进行编码,并为各个新增函数调用边分别设置不同的路径编码值。
在第一方面的第七种可能的实现方式中,结合第一方面的第五种可能的实现方式,所述插桩,包括:
当所述节点对应函数的调用指令为间接调用指令时,在插桩代码中计算当前跳转目标函数的跳转目标地址的哈希值;所述哈希值用于索引所述跳转目标函数的函数调用边的路径编码值。
在第一方面的第八种可能的实现方式中,结合第一方面的第七种可能的实现方式,所述判断到当前跳转目标函数的函数调用边是否为新增函数调用边,包括:
根据所述哈希值索引得到的索引结果,判断跳转目标函数的函数调用边是否为新增函数调用边。
在第一方面的第九种可能的实现方式中,结合第一方面的第八种可能的实现方式,所述根据所述哈希值索引得到的索引结果,判断跳转目标函数的函数调用边是否为新增函数调用边,包括:
当所述哈希值索引得到的索引结果的值为0时,确定所述跳转目标函数的函数调用边为新增函数调用边。
在第一方面的第十种可能的实现方式中,结合第一方面的第五种可能的实现方式,所述重新编码,还包括:
当所述节点对应函数的调用指令为递归调用指令时,在所述路径编码现场中记录递归调用的调用次数。
在第一方面的第十一种可能的实现方式中,结合第一方面的第十种可能的实现方式,所述在路径编码现场中记录递归调用的调用次数,包括:
通过计数器记录所述调用次数。
第二方面,本发明实施例还提供了一种函数调用路径编码的解码方法,包括:
获取所述第一方面中函数调用路径编码方法进行编码过程中的编码结果;所述编码结果包括:生成所述编码结果时刻正在执行的函数、当前路径编码值和时间戳;所述编码结果还可以包括记录;
将所述编码结果解码以获取程序的函数调用路径;所述解码包括:
根据所述时间戳索引得到解码所需的编码信息;
以当前函数为起点,根据当前路径编码值解码得到函数调用子路径;
当所述编码结果中包括记录时,根据所述记录中的各编码现场依次解码生成对应的函数调用子路径;
将所述函数调用子路径依次组装,构建由主函数至当前函数的完整函数调用路径。
结合本发明实施例的第二方面,本发明实施例的第二方面的第一种实现方式中,所述根据所述记录中的各编码现场依次解码生成对应的函数调用子路径,包括:
当所述记录中的现场路径编码值ID大于与所述记录对应的函数调用图中的最大编码值maxID时,修正所述函数调用子路径的路径编码值为:ID-maxID-1。
第三方面,本发明实施例还提供了一种函数调用路径编码装置,包括:
初始节点构建单元,用于将程序的主函数构建为函数调用图的初始节点;
函数调用图构建单元,用于执行所述程序过程中,在当前跳转目标函数在所述函数调用图没有对应的节点时,在所述函数调用图中为所述当前跳转目标函数设置对应的节点后,构建调用函数到所述当前跳转目标函数的函数调用边;在当前跳转目标函数在所述函数调用图有对应的节点时,构建调用函数到所述当前跳转目标函数的函数调用边;
编码单元,用于对新构建的所述函数调用边进行编码;所述编码单元,包括:
记录模块,用于将当前的路径编码现场保存至编码信息的记录中,所述路径编码现场包括现场路径编码值、调用点地址和目标地址;
路径编码值更新模块,用于将所述新构建的函数调用边的当前路径编码值更新为当前函数调用图中最大路径编码值maxID+1;
第一编码信息标识模块,用于为所述编码信息添加对应的时间戳;
第一插桩模块,用于根据所述编码信息对所述程序进行插桩。
结合本发明实施例的第三方面,本发明实施例的第三方面的第一种实现方式中,所述记录模块包括:
辅助栈。
本发明实施例的第三方面的第二种实现方式中,结合第三方面的第一种可能的实现方式,还包括:
重新编码执行单元,用于当所述函数调用图符合预设的重新编码触发条件时,将所述函数调用图按照PCCE方法进行重新编码。
本发明实施例的第三方面的第三种实现方式中,结合第三方面的第二种可能的实现方式,所述重新编码触发条件,包括:
所述函数调用图中新增加的函数调用边的数量达到预定门限,或,
到达预定的重新编码时间点,且频繁执行的函数调用路径发生变化。
本发明实施例的第三方面的第四种实现方式中,结合第三方面的第三种可能的实现方式,所述重新编码执行单元,包括:
拓扑排序模块,用于计算不包含递归调用边的函数调用图中各个节点的拓扑排序;
编码模块,用于在生成编码信息时,根据所述拓扑排序对各个节点和函数调用边进行编码,为不同的函数调用路径设置不同的路径编码值;
第二编码信息标识模块,用于为所述编码信息添加对应的时间戳;
第二插桩模块,用于根据所述编码信息对所述程序进行插桩。
本发明实施例的第三方面的第五种实现方式中,结合第三方面的第四种可能的实现方式,所述编码模块包括:
路径编码值生成组件,用于当所述节点对应函数的调用指令为间接调用指令时,判断到当前跳转目标函数的函数调用边是否为新增函数调用边;对各个新增函数调用边进行编码,并为各个新增函数调用边分别设置不同的路径编码值。
本发明实施例的第三方面的第六种实现方式中,结合第三方面的第五种可能的实现方式,所述第一插桩模块和所述第二插桩模块,均包括:
哈希计算组件,用于当所述节点对应函数的调用指令为间接调用指令时,在插桩代码中计算当前跳转目标函数的跳转目标地址的哈希值;所述哈希值用于索引所述跳转目标函数的函数调用边的路径编码值。
本发明实施例的第三方面的第七种实现方式中,结合第三方面的第六种可能的实现方式,所述路径编码值生成组件,包括:
根据所述哈希值索引得到的索引结果,判断跳转目标函数的函数调用边是否为新增函数调用边。
本发明实施例的第三方面的第八种实现方式中,结合第三方面的第四种可能的实现方式,所述重新编码执行单元,还包括:
调用次数模块,用于当所述节点对应函数的调用指令为递归调用指令时,在所述路径编码现场中记录递归调用的调用次数。
本发明实施例的第三方面的第九种实现方式中,结合第三方面的第八种可能的实现方式,所述调用次数模块包括:
计数器。
第四方面,本发明实施例还提供了一种函数调用路径编码的解码装置,包括:
编码结果获取单元,用于获取所述第三方面中函数调用路径编码装置进行编码过程中的编码结果;所述编码结果包括:生成所述编码结果时刻正在执行的函数、当前路径编码值和时间戳;所述编码结果还可以包括记录;
解码单元,用于将所述编码结果解码以获取程序的函数调用路径;所述解码包括子路径解析模块和路径构建模块;
所述子路径解析模块,用于根据所述时间戳索引得到解码所需的编码信息;以当前函数为起点,根据当前路径编码值解码得到函数调用子路径;用于当所述编码结果中包括记录时,根据所述记录中的各路径编码现场依次解码生成对应的函数调用子路径;
所述路径构建模块,用于将所述函数调用子路径依次组装,构建由主函数至当前函数的完整函数调用路径。
结合本发明实施例的第四方面,本发明实施例的第四方面的第一种实现方式中,所述子路径解析模块,包括:
修正组件,用于当所述记录中的现场路径编码值ID大于与所述记录对应的函数调用图中的最大编码值maxID时,修正所述函数调用子路径的路径编码值为:ID-maxID-1。
第五方面,本发明实施例还提供了一种函数调用路径编解码系统,包括:
如第三方面所述函数调用路径编码装置,以及,如第四方面所述函数调用路径编码的解码装置。
本发明有益效果包括:在本发明实施例中,通过在程序的执行过程中,实时动态构建程序的函数调用图的同时,还对动态构建的函数调用图进行相应的动态编码,在编码时,通过保存路径编码现场,并将函数调用图中新构建的函数调用边的编码值设置为,大于当前函数调用图中最大路径编码值的方式,来保存到达当前函数的路径中所有的新增函数调用边的路径信息,以及,避免新设置的编码值与原有编码值发生冲突,以使本申请中的动态编码后的函数调用路径编码可以被正确的解码。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的函数调用路径编码方法的流程图;
图2为本发明实施例提供的函数调用路径编码方法的又一流程图;
图3为本发明实施例提供的函数调用图的结构示意图;
图4为本发明实施例提供的函数调用图的又一结构示意图;
图5为本发明实施例提供的函数调用路径编码方法的又一流程图;
图6为本发明实施例提供的函数调用路径编码的解码方法流程图;
图7为本发明实施例提供的函数调用路径编码的解码方法又一流程图;
图8为本发明实施例提供的函数调用路径编码装置的结构示意图;
图9为本发明实施例提供的函数调用路径编码装置的又一结构示意图;
图10为本发明实施例提供的函数调用路径编码的解码装置的结构示意图。
具体实施方式
本发明实施例提供了函数调用路径编码方法和装置,函数调用路径编码的解码方法和装置,以下结合说明书附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。并且在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
本发明实施例提供一种函数调用路径编码方法,如图1所示,为本申请中提供的函数调用路径编码方法的流程图,本申请具体可以包括:
步骤S101将程序的主函数构建为函数调用图的初始节点;
在本申请中,函数调用图是随着程序的执行而同步动态构建的,首先,随着程序的开始执行,可以将程序的主函数构建为构建函数调用图的初始节点。
参考图2,在程序执行的初始,只有主函数“main”,此时,将主函数构建为构建函数调用图的初始节点。然后,随着程序的继续执行,在函数调用图中会陆续构建程序中各个被调用函数间的函数调用边,到程序执行完毕,通过以函数调用图中的各个节点和节点间的函数调用边,来表征程序中所有函数及各函数间的调用关系的方式,构建程序完整的函数调用图。
步骤S102、执行程序过程中,判断当前跳转目标函数在函数调用图是否有对应的节点;
本申请中,函数调用图是随着程序的持续执行而动态构建的,具体的,每当程序中调用一个函数,首先判断该函数(即,当前跳转目标函数)是否在函数调用图中有对应的节点,从而可以判断该函数是否为首次运行。
步骤S103、如果否,在函数调用图中为当前跳转目标函数设置对应的节点后,构建调用函数到当前跳转目标函数的函数调用边;如果是,构建调用函数到当前跳转目标函数的函数调用边;
如果当前跳转目标函数在当前的函数调用图中没有对应的节点,那么表示该函数为首次调用,此时需要在函数调用图中首先为当前跳转目标函数设置对应的节点,然后再构建用于表示调用函数与当前跳转目标函数调用关系的函数调用边。如果当前跳转目标函数在当前的函数调用图中以有对应的节点,那么表示该函数为曾经被调用过,此时,只需要构建用于表示调用函数与当前跳转目标函数调用关系的函数调用边即可。
步骤S104、在构建调用函数到当前跳转目标函数的函数调用边后,对新构建的所述函数调用边进行编码。
在通过步骤S102至步骤S103构建了当前的函数调用图后,虽然此时的函数调用图还很可能没有全部构建完毕,但是此时,本发明实施例中,根据当前的函数调用图和新构建的函数调用边即可进行编码的更新,具体的步骤可以如图2所示,包括步骤:
步骤S201、将当前的路径编码现场保存至编码信息的记录中,路径编码现场包括现场路径编码值、调用点地址和目标地址;
为了使增加了新构建的函数调用边的函数调用图在编码后可以正确的解码,在本发明实施例中,在编码信息中设有了相应的记录,以保存当前的路径编码现场;具体的,记录中的路径编码现场可以包括现场路径编码值、调用点地址和目标地址。其中,现场路径编码值为未增加新的函数调用边时的路径编码编码值。
这样,在对获取通过本发明实施例中编码方式所生成的编码结果后,在解码时,可以根据记录中的各个编码现场来解析到达当前函数的函数跳转过程,进而可以得到相应的函数路径信息。
具体的,随着函数调用图的不断更新,新构建的函数调用边的数量也可能在增加,这样,可以通过将每次新增函数调用边时的编码现场依次保存在记录中的方式,将到达当前函数的路径中所有的新增函数调用边所对应的函数跳转过程(即,执行路径信息)保存下来。
在实际应用中,本发明实施例中的记录可以是辅助栈,这样,通过在新构建函数调用边的同时更新辅助栈的方式,保存到达当前函数的路径中所有的新增函数调用边的路径信息。
步骤S202、将新构建的函数调用边的当前路径编码值更新为当前函数调用图中最大路径编码值maxID+1;
此外,本发明实施例中,为了避免在对到达当前跳转目标函数的函数调用路径进行编码时,其编码值会与已有的路径编码值发生冲突,本申请中,对到达当前跳转目标函数的函数调用路径进行编码时,会将其编码值(即,当前路径编码值)设置为当前函数调用图中最大路径编码值+1,从而避免由于编码值冲突所导致的编码无法正确编码的问题。
步骤S203、为编码信息添加对应的时间戳;
接着,本发明实施例中,解码信息的数量有可能为多个,因此,为了在解码时能够获取到对应的编码信息,在本申请中,还为所有的解码信息添加了对应的时间戳。
步骤S204、根据编码信息对所述程序进行插桩;
在通过上述步骤生成了编码信息后,为了能够在程序的执行过程中可以准确的索引到该编码信息,为此,还需要根据编码信息对程序进行插桩。
具体的,本发明实施例中的编码过程可以参考图3和图4,其中,图3为当前函数调用图,图4为以图3中函数调用图为基础,新增函数调用边后的函数调用图。
图3中,函数调用图路径的总数量为5,该函数路径图中的最大编码值为4(即,编码值由0至4,共计5个编码值),此时,函数调用图中的执行路径和编码空间[0,maxID]之间建立一个一一对应关系,其中,当前的最大编码值maxID即为4。
在设置与编码信息对应的辅助栈ccStack时,路径编码现场为在进行编码时刻时函数调用图(即,图3)的现场状态,包括与路函数调用边对应的现场路径编码值0、函数调用边的调用点地址C和函数调用边的目标地址E。在以图3为基础,新构建的函数调用边C—E(虚线所表示)时(即,构建图4所对应的函数调用图时),辅助栈ccStack中的路径编码现场就可以更新为:<0,C,E>
由于在本申请中,需要在函数调用图中构建新的函数调用边,为了避免编码值的冲突,所以在本申请中,将新构建的函数调用边的编码值的取值范围设置为大于函数路径图中的最大编码值,具体的,可以是当前函数调用图中最大路径编码值+1,比如,在图4中,通过新构建的函数调用边C—E的编码值即可设置为maxID+1=4+1=5。
综上所述,在以图3为基础,构建新的函数调用边C—E(虚线所表示)生成图4中的函数调用图后,对应的编码信息为:{E,id=5,ccStack=<0,C,E>};其中当前路径编码值id=5,辅助栈ccStack内的首个路径编码现场为<0,C,E>。
经上述编码后,函数调用路径ACE具体的解码方式可以包括:
在图4所示出的函数调用图中,maxID为4,而当前路径编码值为5,所以先修正该编码值为5-(maxID+1)=0,并在辅助栈ccStack中取出保存的路径编码现场<0,A,C>,从而首先解码得到边CE。然后,当前函数变为C,路径编码值为0,根据PCCE中的解码方法解码得到函数子路径AC。最后,合并函数子路径得到完整函数调用路径ACE。
综上所述,在本申请中,通过在程序的执行过程中,实时动态构建程序的函数调用图的同时,还对动态构建的函数调用图进行相应的动态编码,在编码时,通过保存路径编码现场,并将函数调用图中新构建的函数调用边的编码值设置为,大于当前函数调用图中最大路径编码值的方式,来保存到达当前函数的路径中所有的新增函数调用边的路径信息,以及,避免新设置的编码值与原有编码值发生冲突,以使本申请中的动态编码后的函数调用路径编码可以被正确的解码。
进一步的,由于通过本申请中实时的动态编码方式,需要根据路径编码现场中的现场路径编码值、调用点地址和目标地址来获取到正确的路径,所以在解码过程中获取间接调用路径和递归调用路径的开销较大,这样,当新增加的函数调用边的数量过多时,解码的效率就会受到较大的影响,为此,在本申请中,还预设了重新编码触发条件,从而当解码的效率下降到一定程度时,将当前的函数路径图按照现有技术中的编码方式(即,PCCE编码)进行编码,从而使解码的效率能够维持在一个较高的水平。
在实际应用中,重新编码触发条件可以根据新增的函数调用边的数量值来设定,即,当新增的函数调用边到达预设门限时,对当前函数调用图以现有技术中的编码方式进行编码;或者,也可以预设预定的重新编码时间点,当到达重新编码时间点时,如果频繁执行的函数调用路径发生变化,那么此时就当前函数调用图以现有技术中的编码方式进行编码;由于通过重新解码后的函数调用图是以将当前函数调用图作为编码对象进行的静态编码,所以该部分的编码在解码时就不会因为获取间接调用路径和递归调用路径而带来的过大的开销。
具体的,本申请中的重新编码,如图5所示,可以包括:
S301、计算不包含递归调用边的函数调用图中各个节点的拓扑排序;
基于当前的函数调用图,在进行编码时,函数调用图中的节点既有可能是常规的的直接调用函数,也有可能是间接调用函数或递归调用函数;如果函数调用图中含有递归调用边,那么函数调用图中就含有调用环。因为不能确定调用环中各个节点的拓扑排序,所以导致无法对含有递归调用边的函数调用图进行编码。
基于上述递归函数调用边的特殊性,在本申请中,首先将不包含递归调用边的函数调用图中各个节点的拓扑排序,以便于对这些节点进行常规编码。
S302、在生成编码信息时,根据所述拓扑排序对各个节点和函数调用边进行编码,为不同的函数调用路径设置不同的路径编码值。
对于直接调用函数的编码和插桩,由于直接调用函数其调用指令只会对应函数调用图中的一条边(即,只有一个调用目标),因此在识别出其调用目标后,只需要在函数调用图中添加相应的函数调用边,然后对该函数调用边进行编码即可。
进一步的,在本申请中,当节点对应函数的调用指令为间接调用指令时,可以通过以下方式来进行编码:
判断到当前跳转目标函数的函数调用边是否为新增函数调用边;对各个新增函数调用边进行编码,并为各个新增函数调用边分别设置不同的路径编码值。
这是因为,当函数调用图中的节点为间接调用函数时,该函数有可能对应有多个调用目标,即,有可能对应有函数对应图中的多个函数调用边;因此,需要在编码时,分别检测这多个函数调用边是否为函数调用图中新增的函数调用边,并且将其中被确定新增函数调用边的函数调用边分别赋予不同的编码值,从而区分由这些新增的函数调用边所构成的不同的函数路径。
S303、为编码信息添加对应的时间戳;
在本发明实施例中,每次重新解码后,都会生成对应的解码信息,因此,解码信息的数量有可能为多个,为了在解码时能够获取到对应的编码信息,在本申请中,还为所有的解码信息添加了对应的时间戳,以标识各个编码信息。
S304、根据编码信息对程序进行插桩。
在通过上述重新编码生成了编码信息后,为了能够在程序的执行过程中可以准确的索引到该编码信息,为此,还需要根据编码信息对程序进行插桩。
优选的,在本申请中,对于由间接调用函数构建的新增函数调用边进行编码和插桩时,还可以通过在插桩代码中会根据间接调用函数的跳转目标地址计算对应的哈希值,然后根据该哈希值来索引该新增函数调用边的编码值的方式,来减少哈希冲突带来的性能开销。
具体的,当节点对应函数的调用指令为间接调用指令时,在插桩代码中计算当前跳转目标函数的跳转目标地址的哈希值;哈希值用于索引跳转目标函数的函数调用边的路径编码值。其中,分别判断到每个跳转目标函数的函数调用边是否为新增函数调用边可以包括:
根据哈希值索引得到的索引结果,判断跳转目标函数的函数调用边是否为新增函数调用边;如果根据哈希结果索引得到的项中的值是0,那么表明该跳转目标对应的函数调用边未被编码,应该调用运行时处理函数对其进行编码,即,当哈希值索引得到的索引结果的值为0时,确定跳转目标函数的函数调用边为新增函数调用边。
S305、所述重新编码,还包括,当节点对应函数的调用指令为递归调用指令时,在路径编码现场中记录递归调用的调用次数。
对于由递归函数而构建的新增函数调用边,在进行编码和插桩时,由于不能确定递归调用的递归次数,因此不能使用静态编码方法对其进行直接编码。对于递归调用,本发明实施例中使用大于当前最大编码值的编码值来对含有递归调用的函数路径进行编码。在对递归函数的函数调用边进行重编码之前,递归函数的函数调用边的编码和插桩方法与未编码边完全相同。
由于如果程序中递归调用频繁地执行,那么会使得路径编码现场中重复记录大量的调用点地址和目标地址,这样不但会带来大量的时间开销,而且会增加记录函数调用路径所需的空间开销。为此,在本申请中,根据运行时递归调用的规律,通过记录递归调用的调用次数的方式,来对路径编码现场进行简化,以减少插桩代码带来的访存操作。具体的,当节点对应函数的调用指令为递归调用指令时,可以在路径编码现场中记录递归调用的调用次数,具体的,可以是通过计数器,来记录发生递归调用的次数(即ccStack.top().count++)。
在本申请的另一面,还提供了一种函数调用路径编码的解码方法,包括步骤:
针对图1至图5所对应的实施例中的函数调用路径编码方法,可以通过本实施例中的解码方法对其编码信息进行解码,如图6所示,具体可以包括:
S401、获取由图1至图5所对应的实施例中的函数调用路径编码方法的编码结果,编码结果包括:生成编码结果时刻正在执行的函数(即,当前函数)、当前路径编码值和时间戳;编码结果还可以包括记录;
如果编码结果是根据刚刚重新编码后的编码信息所获取的,那么,此时就不需要在设有记录来保存新增函数调用边所对应的函数跳转过程,所以编码结果中包括记录并不是必然的,即,编码结果中,有可能包括有记录,也有可能没有记录。
S402、将编码结果解码以获取程序的函数调用路径;
解码过程具体步骤可以如图7所示,包括:
S501、根据时间戳索引得到解码所需的编码信息;
由于时间戳与编码信息具有对应关系,所以,根据时间戳可以得到解码所需的编码信息。
S502、以当前函数为起点,根据当前路径编码值解码得到函数调用子路径;当编码结果中包括记录时,根据记录中的各路径编码现场依次解码生成对应的函数调用子路径;
如果编码结果中不包括记录,则表示,该编码结果很可能是获取自重新编码后所生成的编码信息,由于重新编码的方式可以按照现有技术中的常规方式进行编码,所以,此时,按照编码方式对应的常规解码方式即可进行解码。
当编码结果中包括记录时,说明编码结果中包括了新增函数调用边所对应的函数跳转过程,此时,据记录中的各路径编码现场依次解码生成对应的函数调用子路径;具体的,路径编码现场中的每组现场路径编码值、调用点地址和目标地址,均能表示一个新构建函数调用边的函数调用子路径,在将所有的路径编码现场分别解析后,就可以得到每次新增函数调用边所对应的函数调用子路径。
S503、将函数调用子路径依次组装,构建由主函数至当前函数的完整函数调用路径。
在解析每个路径编码现场后,将每个函数调用子路径依次组合后,即可完成函数调用子路径的组装,进而构建出了由主函数至当前函数的完整函数调用路径。
进一步的,由于在通过本申请中实施例进行编码时,会使得编码信息中的路径编码值存在大于对应的函数调用图中最大编码值的情况,为此,在解码过程中需要对此进行修正;具体的可以是,在根据记录中的路径编码现场和与记录对应函数调用图生成函数调用子路径过程中,当所述记录中的现场路径编码值ID大于与记录对应的函数调用图中的最大编码值maxID时,修正函数调用子路径的路径编码值为:ID-maxID-1。
比如,在以图3为基础,构建新的函数调用边C—E(虚线所表示)生成图4中的函数调用图后,对应的编码信息为:{E,id=5,ccStack=<0,C,E>};其中当前路径编码值id=5,辅助栈ccStack内的首个路径编码现场为<0,C,E>。
经上述编码后,函数调用路径ACE具体的解码方式可以包括:
在图4所示出的函数调用图中,maxID为4,而当前路径编码值为5,所以先修正该编码值为5-(maxID+1)=0,并在辅助栈ccStack中取出保存的路径编码现场<0,A,C>,从而首先解码得到函数子路径CE。然后,当前函数变为C,路径编码值为0,根据PCCE中的解码方法解码得到函数子路径AC。最后,合并函数子路径得到完整函数调用路径ACE。
综上所述,本发明实施例中的函数调用路径编码的解码方法,可以与本申请中的函数调用路径编码方法适配使用,从而实现可以对函数调用图进行实时的动态编码的同时,避免了新设置的编码值与原有编码值发生冲突,以使本申请中的动态编码后的函数调用路径编码可以被正确的解码。
在本申请的另一面,还提供了一种函数调用路径编码装置,如图8所示,包括:
初始节点构建单元01,用于将程序的主函数构建为函数调用图的初始节点;
函数调用图构建单元02,用于执行程序过程中,在当前跳转目标函数在函数调用图没有对应的节点时,在函数调用图中为当前跳转目标函数设置对应的节点后,构建调用函数到当前跳转目标函数的函数调用边;在当前跳转目标函数在函数调用图有对应的节点时,构建调用函数到当前跳转目标函数的函数调用边;
编码单元03,用于对新构建的函数调用边进行编码;编码单元具体可以包括:记录模块31、路径编码值更新模块32、第一编码信息标识模块33和第一插桩模块34。
记录模块31,用于将当前的路径编码现场保存至编码信息的记录中,路径编码现场包括现场路径编码值、调用点地址和目标地址;路径编码值更新模块32,用于将新构建的函数调用边的当前路径编码值更新为当前函数调用图中最大路径编码值maxID+1;第一编码信息标识模块33,用于为编码信息添加对应的时间戳;第一插桩模块34,用于根据编码信息对程序进行插桩。
为了使增加了新构建的函数调用边的函数调用图在编码后可以正确的解码,在本发明实施例中,通过记录模块31将当前的路径编码现场保存至编码信息的记录中,以保存当前的路径编码现场;具体的,记录中的路径编码现场可以包括现场路径编码值、调用点地址和目标地址。其中,现场路径编码值为未增加新的函数调用边时的路径编码编码值。
这样,在对获取通过本发明实施例中编码方式所生成的编码结果后,在解码时,可以根据记录中的各个编码现场来解析到达当前函数的函数跳转过程,进而可以得到相应的函数路径信息。
具体的,随着函数调用图的不断更新,新构建的函数调用边的数量也可能在增加,这样,可以通过记录模块31将每次新增函数调用边时的编码现场依次保存在记录中的方式,将到达当前函数的路径中所有的新增函数调用边所对应的函数跳转过程(即,执行路径信息)保存下来。
在实际应用中,本发明实施例中的记录可以是辅助栈,这样,通过在新构建函数调用边的同时更新辅助栈的方式,保存到达当前函数的路径中所有的新增函数调用边的路径信息。
此外,本发明实施例中,为了避免在对到达当前跳转目标函数的函数调用路径进行编码时,其编码值会与已有的路径编码值发生冲突,本申请中,路径编码值更新模块32在对到达当前跳转目标函数的函数调用路径进行编码时,会将其编码值(即,当前路径编码值)设置为当前函数调用图中最大路径编码值+1,从而避免由于编码值冲突所导致的编码无法正确编码的问题。
此外,由于解码信息的数量有可能为多个,因此,为了在解码时能够获取到对应的编码信息,在本申请中,通过第一编码信息标识模块33,还可以为所有的解码信息添加了对应的时间戳。
在生成了编码信息后,为了能够在程序的执行过程中可以准确的索引到该编码信息,为此,还需要通过第一插桩模块34,根据编码信息对程序进行插桩。
综上所述,在本申请中,通过在程序的执行过程中,实时动态构建程序的函数调用图的同时,还对动态构建的函数调用图进行相应的动态编码,在编码时,通过保存路径编码现场,并将函数调用图中新构建的函数调用边的编码值设置为,大于当前函数调用图中最大路径编码值的方式,来保存到达当前函数的路径中所有的新增函数调用边的路径信息,以及,避免新设置的编码值与原有编码值发生冲突,以使本申请中的动态编码后的函数调用路径编码可以被正确的解码。
进一步的,由于通过本申请中实时的动态编码方式,需要根据路径编码现场中的现场路径编码值、调用点地址和目标地址来获取到正确的路径,所以在解码过程中获取间接调用路径和递归调用路径的开销较大,这样,当新增加的函数调用边的数量过多时,解码的效率就会受到较大的影响,为此,在本申请中,还设有了重新编码执行单元,通过预设重新编码触发条件,从而当解码的效率下降到一定程度时,将当前的函数路径图按照现有技术中的编码方式(即,PCCE编码)进行编码,从而使解码的效率能够维持在一个较高的水平。
在实际应用中,重新编码触发条件可以根据新增的函数调用边的数量值来设定,即,当新增的函数调用边到达预设门限时,对当前函数调用图以现有技术中的编码方式进行编码;或者,也可以预设预定的重新编码时间点,当到达重新编码时间点时,如果频繁执行的函数调用路径发生变化,那么此时就当前函数调用图以现有技术中的编码方式进行编码;由于通过重新解码后的函数调用图是以将当前函数调用图作为编码对象进行的静态编码,所以该部分的编码在解码时就不会因为获取间接调用路径和递归调用路径而带来的过大的开销。
具体的,重新编码执行单元具体可以如图9所示,包括拓扑排序模块21、编码模块22、第二编码信息标识模块23和第二插桩模块24;
拓扑排序模块21用于计算不包含递归调用边的函数调用图中各个节点的拓扑排序;编码模块22用于在生成编码信息时,根据拓扑排序对各个节点和函数调用边进行编码,为不同的函数调用路径设置不同的路径编码值;第二编码信息标识模块23用于为编码信息添加对应的时间戳;第二插桩模块24用于根据编码信息对所述程序进行插桩。
基于当前的函数调用图,在进行编码时,函数调用图中的节点既有可能是常规的的直接调用函数,也有可能是间接调用函数或递归调用函数;如果函数调用图中含有递归调用边,那么函数调用图中就含有调用环。因为不能确定调用环中各个节点的拓扑排序,所以导致无法对含有递归调用边的函数调用图进行编码。
基于上述递归函数调用边的特殊性,在本申请中,拓扑排序模块21首先将不包含递归调用边的函数调用图中各个节点的拓扑排序,以便于对这些节点进行常规编码。
在通过编码模块22生成编码信息时,对于直接调用函数的编码和插桩,由于直接调用函数其调用指令只会对应函数调用图中的一条边(即,只有一个调用目标),因此在识别出其调用目标后,只需要在函数调用图中添加相应的函数调用边,然后对该函数调用边进行编码即可。
而当节点对应函数的调用指令为间接调用指令时,编码模块22可以通过以下方式来进行编码:
判断到当前跳转目标函数的函数调用边是否为新增函数调用边;对各个新增函数调用边进行编码,并为各个新增函数调用边分别设置不同的路径编码值。
这是因为,当函数调用图中的节点为间接调用函数时,该函数有可能对应有多个调用目标,即,有可能对应有函数对应图中的多个函数调用边;因此,需要在编码时,分别检测这多个函数调用边是否为函数调用图中新增的函数调用边,并且将其中被确定新增函数调用边的函数调用边分别赋予不同的编码值,从而区分由这些新增的函数调用边所构成的不同的函数路径。
在本发明实施例中,每次重新解码后,都会生成对应的解码信息,因此,解码信息的数量有可能为多个,为了在解码时能够获取到对应的编码信息,在本申请中,还通过第二编码信息标识模块23,为所有的解码信息添加了对应的时间戳,以标识各个编码信息。
在通过上述重新编码生成了编码信息后,为了能够在程序的执行过程中可以准确的索引到该编码信息,为此,还需要通过第二插桩模块24根据编码信息对程序进行插桩。
进一步的,在本发明实施例中,第一插桩模块和第二插桩模块,均可以包括:哈希计算组件,用于当节点对应函数的调用指令为间接调用指令时,在插桩代码中计算当前跳转目标函数的跳转目标地址的哈希值;哈希值用于索引跳转目标函数的函数调用边的路径编码值。
在本申请中,对于由间接调用函数构建的新增函数调用边进行编码和插桩时,还可以通过在插桩代码中会根据间接调用函数的跳转目标地址计算对应的哈希值,然后根据该哈希值来索引该新增函数调用边的编码值的方式,来减少哈希冲突带来的性能开销。
具体的,当节点对应函数的调用指令为间接调用指令时,在插桩代码中计算当前跳转目标函数的跳转目标地址的哈希值;哈希值用于索引跳转目标函数的函数调用边的路径编码值。其中,分别判断到每个跳转目标函数的函数调用边是否为新增函数调用边可以包括:
根据哈希值索引得到的索引结果,判断跳转目标函数的函数调用边是否为新增函数调用边;如果根据哈希结果索引得到的项中的值是0,那么表明该跳转目标对应的函数调用边未被编码,应该调用运行时处理函数对其进行编码,即,当哈希值索引得到的索引结果的值为0时,确定跳转目标函数的函数调用边为新增函数调用边。
进一步的,本发明实施例中的重新编码执行单元,还可以包括调用次数模块,用于当节点对应函数的调用指令为递归调用指令时,在路径编码现场中记录递归调用的调用次数。
在本申请中,根据运行时递归调用的规律,通过记录递归调用的调用次数的方式,来对路径编码现场进行简化,以减少插桩代码带来的访存操作。具体的,当节点对应函数的调用指令为递归调用指令时,可以在路径编码现场中记录递归调用的调用次数,具体的,可以是通过计数器,来记录发生递归调用的次数(即ccStack.top().count++)。
在本申请的另一面,还提供了一种函数调用路径编码的解码装置,针对图8至图9所对应的实施例中的函数调用路径编码装置,可以通过本实施例中的解码方法对其编码信息进行解码,如图10所示,具体可以包括:编码结果获取单元41和解码单元42
编码结果获取单元,用于获取在如权利要求15至24中任一函数调用路径编码装置进行编码过程中的编码结果;所述编码结果包括:生成所述编码结果时刻正在执行的函数、当前路径编码值和时间戳;编码结果还可以包括记录;
解码单元42,用于将编码结果解码以获取程序的函数调用路径;解码包括子路径解析模块421和路径构建模块422;子路径解析模块421,用于根据时间戳索引得到解码所需的编码信息;以当前函数为起点,根据当前路径编码值解码得到函数调用子路径;用于当编码结果中包括记录时,根据记录中的各路径编码现场依次解码生成对应的函数调用子路径;路径构建模块422,用于将函数调用子路径依次组装,构建由主函数至当前函数的完整函数调用路径。
如果编码结果是根据刚刚重新编码后的编码信息所获取的,那么,此时就不需要在设有记录来保存新增函数调用边所对应的函数跳转过程,所以编码结果中包括记录并不是必然的,即,编码结果中,有可能包括有记录,也有可能没有记录。
所述解码单元42的工作原理包括:
通过子路径解析模块根据时间戳索引得到解码所需的编码信息;由于时间戳与编码信息具有对应关系,所以,根据时间戳可以得到解码所需的编码信息。以当前函数为起点,根据当前路径编码值解码得到函数调用子路径;当编码结果中包括记录时,根据记录中的各路径编码现场依次解码生成对应的函数调用子路径;
如果编码结果中不包括记录,则表示,该编码结果很可能是获取自重新编码后所生成的编码信息,由于重新编码的方式可以按照现有技术中的常规方式进行编码,所以,此时,按照编码方式对应的常规解码方式即可进行解码。
当编码结果中包括记录时,说明编码结果中包括了新增函数调用边所对应的函数跳转过程,此时,据记录中的各路径编码现场依次解码生成对应的函数调用子路径;具体的,路径编码现场中的每组现场路径编码值、调用点地址和目标地址,均能表示一个新构建函数调用边的函数调用子路径,在将所有的路径编码现场分别解析后,就可以得到每次新增函数调用边所对应的函数调用子路径。
通过路径构建模块将函数调用子路径依次组装,构建由主函数至当前函数的完整函数调用路径。
在解析每个路径编码现场后,将每个函数调用子路径依次组合后,即可完成函数调用子路径的组装,进而构建出了由主函数至当前函数的完整函数调用路径。
进一步的,由于在通过本申请中实施例进行编码时,会使得编码信息中的路径编码值存在大于对应的函数调用图中最大编码值的情况,为此,还可以在子路径解析模块中设有修正组件,从而在解码过程中需要对此进行修正;具体的可以是,在根据记录中的路径编码现场和与记录对应函数调用图生成函数调用子路径过程中,当所述记录中的现场路径编码值ID大于与记录对应的函数调用图中的最大编码值maxID时,通过修正组件修正函数调用子路径的路径编码值为:ID-maxID-1。
比如,在以图3为基础,构建新的函数调用边C—E(虚线所表示)生成图4中的函数调用图后,对应的编码信息为:{E,id=5,ccStack=<0,C,E>};其中当前路径编码值id=5,辅助栈ccStack内的首个路径编码现场为<0,C,E>。
经上述编码后,函数调用路径ACE具体的解码方式可以包括:
在图4所示出的函数调用图中,maxID为4,而当前路径编码值为5,所以先修正该编码值为5-(maxID+1)=0,并在辅助栈ccStack中取出保存的路径编码现场<0,A,C>,从而首先解码得到函数子路径CE。然后,当前函数变为C,路径编码值为0,根据PCCE中的解码方法解码得到函数子路径AC。最后,合并函数子路径得到完整函数调用路径ACE。
综上所述,本发明实施例中的函数调用路径编码的解码装置,可以与本申请中的函数调用路径编码装置适配使用,从而实现可以对函数调用图进行实时的动态编码的同时,避免了新设置的编码值与原有编码值发生冲突,以使本申请中的动态编码后的函数调用路径编码可以被正确的解码。
在本申请的另一方面,还提供了一种函数调用路径编解码系统,包括图8所对应实施例中的函数调用路径编码装置,和,图10所对应实施例中的函数调用路径编码的解码装置。
由于该函数调用路径编解码系统的工作原理以已经在图8所对应实施例中的函数调用路径编码装置,和,图10所对应实施例中的函数调用路径编码的解码装置中作了相应的阐述,其工作原理和达到的有益效果类似,所以在此就不再赘述。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,RandomAccessMemory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (27)
1.一种函数调用路径编码方法,其特征在于,包括:
将程序的主函数构建为函数调用图的初始节点;
执行所述程序过程中,判断当前跳转目标函数在所述函数调用图是否有对应的节点;
如果否,在所述函数调用图中为所述当前跳转目标函数设置对应的节点后,构建调用函数到所述当前跳转目标函数的函数调用边;
如果是,构建调用函数到所述当前跳转目标函数的函数调用边;
对新构建的所述函数调用边进行编码,包括:
将当前的路径编码现场保存至编码信息的记录中,所述路径编码现场包括现场路径编码值、调用点地址和目标地址;
将所述新构建的函数调用边的当前路径编码值更新为当前函数调用图中最大路径编码值maxID+1;
为所述编码信息添加对应的时间戳;
根据所述编码信息对所述程序进行插桩。
2.如权利要求1所述函数调用路径编码方法,其特征在于,所述记录存储于辅助栈中。
3.如权利要求1所述函数调用路径编码方法,其特征在于,所述判断当前跳转目标函数在所述函数调用图是否有对应的节点,包括:
将当前运行函数的所有函数调用指令替换为调用运行时处理函数的代码,并保存寄存器现场;
在所述运行时处理函数中,根据保存的寄存器上下文计算得到所述跳转目标函数的调用目标地址;
根据所述调用目标地址判断当前跳转目标函数在所述函数调用图是否有对应的节点。
4.如权利要求2所述函数调用路径编码方法,其特征在于,还包括:
当所述函数调用图符合预设的重新编码触发条件时,将所述函数调用图按照函数调用路径编码PCCE方法进行重新编码。
5.如权利要求4所述函数调用路径编码方法,其特征在于,所述重新编码触发条件,包括:
所述函数调用图中新增加的函数调用边的数量达到预定门限,或,
到达预定的重新编码时间点,且频繁执行的函数调用路径发生变化。
6.如权利要求5所述函数调用路径编码方法,其特征在于,所述重新编码,包括:
计算不包含递归调用边的函数调用图中各个节点的拓扑排序;
在生成编码信息时,根据所述拓扑排序对各个节点和函数调用边进行编码,为不同的函数调用路径设置不同的路径编码值;
为所述编码信息添加对应的时间戳;
根据所述编码信息对所述程序进行插桩。
7.如权利要求6所述函数调用路径编码方法,其特征在于,所述根据所述拓扑排序对各个节点和函数调用边进行编码,为不同的函数调用路径设置不同的路径编码值包括:
当所述节点对应函数的调用指令为间接调用指令时,判断到当前跳转目标函数的函数调用边是否为新增函数调用边;
对各个新增函数调用边进行编码,并为各个新增函数调用边分别设置不同的路径编码值。
8.如权利要求6所述函数调用路径编码方法,其特征在于,所述插桩,包括:
当所述节点对应函数的调用指令为间接调用指令时,在插桩代码中计算当前跳转目标函数的跳转目标地址的哈希值;所述哈希值用于索引所述跳转目标函数的函数调用边的路径编码值。
9.如权利要求8所述函数调用路径编码方法,其特征在于,所述判断到当前跳转目标函数的函数调用边是否为新增函数调用边,包括:
根据所述哈希值索引得到的索引结果,判断跳转目标函数的函数调用边是否为新增函数调用边。
10.如权利要求9所述函数调用路径编码方法,其特征在于,所述根据所述哈希值索引得到的索引结果,判断跳转目标函数的函数调用边是否为新增函数调用边,包括:
当所述哈希值索引得到的索引结果的值为0时,确定所述跳转目标函数的函数调用边为新增函数调用边。
11.如权利要求6所述函数调用路径编码方法,其特征在于,所述重新编码,还包括:
当所述节点对应函数的调用指令为递归调用指令时,在所述路径编码现场中记录递归调用的调用次数。
12.如权利要求11所述函数调用路径编码方法,其特征在于,所述在路径编码现场中记录递归调用的调用次数,包括:
通过计数器记录所述调用次数。
13.一种函数调用路径编码的解码方法,其特征在于,包括:
获取在如权利要求1至12中任一函数调用路径编码方法进行编码过程中的编码结果;所述编码结果包括:生成所述编码结果时刻正在执行的函数、当前路径编码值和时间戳;所述编码结果还可以包括记录;
将所述编码结果解码以获取程序的函数调用路径;所述解码包括:
根据所述时间戳索引得到解码所需的编码信息;
以当前函数为起点,根据当前路径编码值解码得到函数调用子路径;
当所述编码结果中包括记录时,根据所述记录中的各路径编码现场依次解码生成对应的函数调用子路径;
将所述函数调用子路径依次组装,构建由主函数至当前函数的完整函数调用路径。
14.如权利要求13所述函数调用路径编码的解码方法,其特征在于,所述根据所述记录中的各路径编码现场依次解码生成对应的函数调用子路径,包括:
当所述记录中的现场路径编码值ID大于与所述记录对应的函数调用图中的最大编码值maxID时,修正所述函数调用子路径的路径编码值为:ID-maxID-1。
15.一种函数调用路径编码装置,其特征在于,包括:
初始节点构建单元,用于将程序的主函数构建为函数调用图的初始节点;
函数调用图构建单元,用于执行所述程序过程中,在当前跳转目标函数在所述函数调用图没有对应的节点时,在所述函数调用图中为所述当前跳转目标函数设置对应的节点后,构建调用函数到所述当前跳转目标函数的函数调用边;在当前跳转目标函数在所述函数调用图有对应的节点时,构建调用函数到所述当前跳转目标函数的函数调用边;
编码单元,用于对新构建的所述函数调用边进行编码;所述编码单元,包括:
记录模块,用于将当前的路径编码现场保存至编码信息的记录中,所述路径编码现场包括现场路径编码值、调用点地址和目标地址;
路径编码值更新模块,用于将所述新构建的函数调用边的当前路径编码值更新为当前函数调用图中最大路径编码值maxID+1;
第一编码信息标识模块,用于为所述编码信息添加对应的时间戳;
第一插桩模块,用于根据所述编码信息对所述程序进行插桩。
16.如权利要求15所述函数调用路径编码装置,其特征在于,所述记录模块包括:
辅助栈。
17.如权利要求16所述函数调用路径编码装置,其特征在于,还包括:
重新编码执行单元,用于当所述函数调用图符合预设的重新编码触发条件时,将所述函数调用图按照PCCE方法进行重新编码。
18.如权利要求17所述函数调用路径编码装置,其特征在于,所述重新编码触发条件,包括:
所述函数调用图中新增加的函数调用边的数量达到预定门限,或,
到达预定的重新编码时间点,且频繁执行的函数调用路径发生变化。
19.如权利要求18所述函数调用路径编码装置,其特征在于,所述重新编码执行单元,包括:
拓扑排序模块,用于计算不包含递归调用边的函数调用图中各个节点的拓扑排序;
编码模块,用于在生成编码信息时,根据所述拓扑排序对各个节点和函数调用边进行编码,为不同的函数调用路径设置不同的路径编码值;
第二编码信息标识模块,用于为所述编码信息添加对应的时间戳;
第二插桩模块,用于根据所述编码信息对所述程序进行插桩。
20.如权利要求19所述函数调用路径编码装置,其特征在于,所述编码模块包括:
路径编码值生成组件,用于当所述节点对应函数的调用指令为间接调用指令时,判断到当前跳转目标函数的函数调用边是否为新增函数调用边;对各个新增函数调用边进行编码,并为各个新增函数调用边分别设置不同的路径编码值。
21.如权利要求20所述函数调用路径编码装置,其特征在于,所述第一插桩模块和所述第二插桩模块,均包括:
哈希计算组件,用于当所述节点对应函数的调用指令为间接调用指令时,在插桩代码中计算当前跳转目标函数的跳转目标地址的哈希值;所述哈希值用于索引所述跳转目标函数的函数调用边的路径编码值。
22.如权利要求21所述函数调用路径编码装置,其特征在于,所述路径编码值生成组件,包括:
根据所述哈希值索引得到的索引结果,判断跳转目标函数的函数调用边是否为新增函数调用边。
23.如权利要求19所述函数调用路径编码装置,其特征在于,所述重新编码执行单元,还包括:
调用次数模块,用于当所述节点对应函数的调用指令为递归调用指令时,在所述路径编码现场中记录递归调用的调用次数。
24.如权利要求23所述函数调用路径编码装置,其特征在于,所述调用次数模块包括:
计数器。
25.一种函数调用路径编码的解码装置,其特征在于,包括:
编码结果获取单元,用于获取在如权利要求15至24中任一函数调用路径编码装置进行编码过程中的编码结果;所述编码结果包括:生成所述编码结果时刻正在执行的函数、当前路径编码值和时间戳;所述编码结果还可以包括记录;
解码单元,用于将所述编码结果解码以获取程序的函数调用路径;所述解码包括子路径解析模块和路径构建模块;
所述子路径解析模块,用于根据所述时间戳索引得到解码所需的编码信息;以当前函数为起点,根据当前路径编码值解码得到函数调用子路径;用于当所述编码结果中包括记录时,根据所述记录中的各路径编码现场依次解码生成对应的函数调用子路径;
所述路径构建模块,用于将所述函数调用子路径依次组装,构建由主函数至当前函数的完整函数调用路径。
26.如权利要求25所述函数调用路径编码的解码装置,其特征在于,所述子路径解析模块,包括:
修正组件,用于当所述记录中的现场路径编码值ID大于与所述记录对应的函数调用图中的最大编码值maxID时,修正所述函数调用子路径的路径编码值为:ID-maxID-1。
27.一种函数调用路径编解码系统,其特征在于,包括:
如权利要求15至24中任一所述函数调用路径编码装置,以及,如权利要求25或26中所述函数调用路径编码的解码装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410310847.XA CN105224305B (zh) | 2014-07-01 | 2014-07-01 | 函数调用路径编解码方法、装置及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410310847.XA CN105224305B (zh) | 2014-07-01 | 2014-07-01 | 函数调用路径编解码方法、装置及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105224305A true CN105224305A (zh) | 2016-01-06 |
CN105224305B CN105224305B (zh) | 2018-09-28 |
Family
ID=54993303
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410310847.XA Expired - Fee Related CN105224305B (zh) | 2014-07-01 | 2014-07-01 | 函数调用路径编解码方法、装置及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105224305B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105867930A (zh) * | 2016-04-05 | 2016-08-17 | 华为技术有限公司 | 一种函数调用关系的显示方法、装置及终端 |
CN109324838A (zh) * | 2018-08-31 | 2019-02-12 | 深圳市元征科技股份有限公司 | 单片机程序的执行方法、执行装置及终端 |
WO2022178889A1 (zh) * | 2021-02-27 | 2022-09-01 | 华为技术有限公司 | 函数调用上下文的编码、解码方法及装置 |
US11537448B1 (en) * | 2021-12-14 | 2022-12-27 | Asapp, Inc. | Adapting application programming interfaces with schema mappings |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101963907A (zh) * | 2010-10-14 | 2011-02-02 | 中国科学技术大学苏州研究院 | 一种计算机程序热点的动态剖析机制 |
US20140075132A1 (en) * | 2012-09-13 | 2014-03-13 | International Business Machines Corporation | Method and apparatus for determining failure context in hardware transactional memories |
-
2014
- 2014-07-01 CN CN201410310847.XA patent/CN105224305B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101963907A (zh) * | 2010-10-14 | 2011-02-02 | 中国科学技术大学苏州研究院 | 一种计算机程序热点的动态剖析机制 |
US20140075132A1 (en) * | 2012-09-13 | 2014-03-13 | International Business Machines Corporation | Method and apparatus for determining failure context in hardware transactional memories |
Non-Patent Citations (2)
Title |
---|
WILLIAM N. SUMNER等: "Precise Calling Context Encoding", 《IEEE TRANSACTIONS ON SOFTWARE ENGINEERING》 * |
王璐璐等: "全路径剖析方法", 《软件学报》 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105867930A (zh) * | 2016-04-05 | 2016-08-17 | 华为技术有限公司 | 一种函数调用关系的显示方法、装置及终端 |
CN105867930B (zh) * | 2016-04-05 | 2019-03-19 | 华为技术有限公司 | 一种函数调用关系的显示方法、装置及终端 |
CN109324838A (zh) * | 2018-08-31 | 2019-02-12 | 深圳市元征科技股份有限公司 | 单片机程序的执行方法、执行装置及终端 |
CN109324838B (zh) * | 2018-08-31 | 2022-05-10 | 深圳市元征科技股份有限公司 | 单片机程序的执行方法、执行装置及终端 |
WO2022178889A1 (zh) * | 2021-02-27 | 2022-09-01 | 华为技术有限公司 | 函数调用上下文的编码、解码方法及装置 |
US11537448B1 (en) * | 2021-12-14 | 2022-12-27 | Asapp, Inc. | Adapting application programming interfaces with schema mappings |
Also Published As
Publication number | Publication date |
---|---|
CN105224305B (zh) | 2018-09-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10599820B2 (en) | Control flow flattening for code obfuscation where the next block calculation needs run-time information | |
US10733520B2 (en) | Making a prediction regarding development of a software product | |
US9645806B2 (en) | Method to convey an application's development environment characteristics to the hosting provider to facilitate selection of hosting environment or the selection of an optimized production operation of the application | |
CN105224305A (zh) | 函数调用路径编解码方法、装置及系统 | |
CN110689084B (zh) | 一种异常用户识别方法及装置 | |
CN108319858B (zh) | 针对不安全函数的数据依赖图构建方法及装置 | |
CN104376875A (zh) | 存储设备寿命预测、确定方法及装置 | |
CN106920024B (zh) | 一种业务流程管理方法、装置及设备 | |
CN108628732B (zh) | 一种应用界面控件遍历测试方法及装置 | |
US20160254827A1 (en) | Control device performing lifetime prediction by error correction function | |
CN103108020A (zh) | 服务协作设备、服务协作方法和计算机可读记录介质 | |
CN114841322A (zh) | 神经网络计算图的处理方法及处理装置 | |
CN109408682A (zh) | 一种正则表达式匹配的方法、系统及设备 | |
CN103744656A (zh) | 一种数据解析方法及装置 | |
KR20080032480A (ko) | 트리 구조에서의 노드 식별자 생성 방법 | |
CN104348905A (zh) | 一种离线推送消息的方法及装置 | |
CN102916967B (zh) | 协议解析的方法和装置 | |
CN108563774B (zh) | Gps数据处理方法及装置 | |
CN107357717B (zh) | 检测配置错误的方法、装置及设备 | |
CN104506636A (zh) | 一种数据同步方法及装置 | |
CN104536897A (zh) | 基于关键字的自动测试方法及系统 | |
CN104657216A (zh) | 一种资源池的资源分配方法及装置 | |
CN104424285A (zh) | 用于进行变更请求的影响分析的方法和装置 | |
CN107436728B (zh) | 规则分析结果存储方法、规则回溯方法及装置 | |
CN105025040A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20180928 Termination date: 20200701 |