函数调用路径编解码方法、装置及系统的制作方法_2

文档序号:9471142阅读:来源:国知局
达预定的重新编码时间点,且频繁执行的函数调用路径发生变化。
[0070]本发明实施例的第三方面的第四种实现方式中,结合第三方面的第三种可能的实现方式,所述重新编码执行单元,包括:
[0071]拓扑排序模块,用于计算不包含递归调用边的函数调用图中各个节点的拓扑排序;
[0072]编码模块,用于在生成编码信息时,根据所述拓扑排序对各个节点和函数调用边进行编码,为不同的函数调用路径设置不同的路径编码值;
[0073]第二编码信息标识模块,用于为所述编码信息添加对应的时间戳;
[0074]第二插桩模块,用于根据所述编码信息对所述程序进行插桩。
[0075]本发明实施例的第三方面的第五种实现方式中,结合第三方面的第四种可能的实现方式,所述编码模块包括:
[0076]路径编码值生成组件,用于当所述节点对应函数的调用指令为间接调用指令时,判断到当前跳转目标函数的函数调用边是否为新增函数调用边;对各个新增函数调用边进行编码,并为各个新增函数调用边分别设置不同的路径编码值。
[0077]本发明实施例的第三方面的第六种实现方式中,结合第三方面的第五种可能的实现方式,所述第一插桩模块和所述第二插桩模块,均包括:
[0078]哈希计算组件,用于当所述节点对应函数的调用指令为间接调用指令时,在插桩代码中计算当前跳转目标函数的跳转目标地址的哈希值;所述哈希值用于索引所述跳转目标函数的函数调用边的路径编码值。
[0079]本发明实施例的第三方面的第七种实现方式中,结合第三方面的第六种可能的实现方式,所述路径编码值生成组件,包括:
[0080]根据所述哈希值索引得到的索引结果,判断跳转目标函数的函数调用边是否为新增函数调用边。
[0081 ] 本发明实施例的第三方面的第八种实现方式中,结合第三方面的第四种可能的实现方式,所述重新编码执行单元,还包括:
[0082]调用次数模块,用于当所述节点对应函数的调用指令为递归调用指令时,在所述路径编码现场中记录递归调用的调用次数。
[0083]本发明实施例的第三方面的第九种实现方式中,结合第三方面的第八种可能的实现方式,所述调用次数模块包括:
[0084]计数器。
[0085]第四方面,本发明实施例还提供了一种函数调用路径编码的解码装置,包括:
[0086]编码结果获取单元,用于获取所述第三方面中函数调用路径编码装置进行编码过程中的编码结果;所述编码结果包括:生成所述编码结果时刻正在执行的函数、当前路径编码值和时间戳;所述编码结果还可以包括记录;
[0087]解码单元,用于将所述编码结果解码以获取程序的函数调用路径;所述解码包括子路径解析模块和路径构建模块;
[0088]所述子路径解析模块,用于根据所述时间戳索引得到解码所需的编码信息;以当前函数为起点,根据当前路径编码值解码得到函数调用子路径;用于当所述编码结果中包括记录时,根据所述记录中的各路径编码现场依次解码生成对应的函数调用子路径;
[0089]所述路径构建模块,用于将所述函数调用子路径依次组装,构建由主函数至当前函数的完整函数调用路径。
[0090]结合本发明实施例的第四方面,本发明实施例的第四方面的第一种实现方式中,所述子路径解析模块,包括:
[0091]修正组件,用于当所述记录中的现场路径编码值ID大于与所述记录对应的函数调用图中的最大编码值maxID时,修正所述函数调用子路径的路径编码值为:ID-maxID_l。
[0092]第五方面,本发明实施例还提供了一种函数调用路径编解码系统,包括:
[0093]如第三方面所述函数调用路径编码装置,以及,如第四方面所述函数调用路径编码的解码装置。
[0094]本发明有益效果包括:在本发明实施例中,通过在程序的执行过程中,实时动态构建程序的函数调用图的同时,还对动态构建的函数调用图进行相应的动态编码,在编码时,通过保存路径编码现场,并将函数调用图中新构建的函数调用边的编码值设置为,大于当前函数调用图中最大路径编码值的方式,来保存到达当前函数的路径中所有的新增函数调用边的路径信息,以及,避免新设置的编码值与原有编码值发生冲突,以使本申请中的动态编码后的函数调用路径编码可以被正确的解码。
【附图说明】
[0095]为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0096]图1为本发明实施例提供的函数调用路径编码方法的流程图;
[0097]图2为本发明实施例提供的函数调用路径编码方法的又一流程图;
[0098]图3为本发明实施例提供的函数调用图的结构示意图;
[0099]图4为本发明实施例提供的函数调用图的又一结构示意图;
[0100]图5为本发明实施例提供的函数调用路径编码方法的又一流程图;
[0101]图6为本发明实施例提供的函数调用路径编码的解码方法流程图;
[0102]图7为本发明实施例提供的函数调用路径编码的解码方法又一流程图;
[0103]图8为本发明实施例提供的函数调用路径编码装置的结构示意图;
[0104]图9为本发明实施例提供的函数调用路径编码装置的又一结构示意图;
[0105]图10为本发明实施例提供的函数调用路径编码的解码装置的结构示意图。
【具体实施方式】
[0106]本发明实施例提供了函数调用路径编码方法和装置,函数调用路径编码的解码方法和装置,以下结合说明书附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。并且在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
[0107]本发明实施例提供一种函数调用路径编码方法,如图1所示,为本申请中提供的函数调用路径编码方法的流程图,本申请具体可以包括:
[0108]步骤SlOl将程序的主函数构建为函数调用图的初始节点;
[0109]在本申请中,函数调用图是随着程序的执行而同步动态构建的,首先,随着程序的开始执行,可以将程序的主函数构建为构建函数调用图的初始节点。
[0110]参考图2,在程序执行的初始,只有主函数“main”,此时,将主函数构建为构建函数调用图的初始节点。然后,随着程序的继续执行,在函数调用图中会陆续构建程序中各个被调用函数间的函数调用边,到程序执行完毕,通过以函数调用图中的各个节点和节点间的函数调用边,来表征程序中所有函数及各函数间的调用关系的方式,构建程序完整的函数调用图。
[0111]步骤S102、执行程序过程中,判断当前跳转目标函数在函数调用图是否有对应的节点;
[0112]本申请中,函数调用图是随着程序的持续执行而动态构建的,具体的,每当程序中调用一个函数,首先判断该函数(即,当前跳转目标函数)是否在函数调用图中有对应的节点,从而可以判断该函数是否为首次运行。
[0113]步骤S103、如果否,在函数调用图中为当前跳转目标函数设置对应的节点后,构建调用函数到当前跳转目标函数的函数调用边;如果是,构建调用函数到当前跳转目标函数的函数调用边;
[0114]如果当前跳转目标函数在当前的函数调用图中没有对应的节点,那么表示该函数为首次调用,此时需要在函数调用图中首先为当前跳转目标函数设置对应的节点,然后再构建用于表示调用函数与当前跳转目标函数调用关系的函数调用边。如果当前跳转目标函数在当前的函数调用图中以有对应的节点,那么表示该函数为曾经被调用过,此时,只需要构建用于表示调用函数与当前跳转目标函数调用关系的函数调用边即可。
[0115]步骤S104、在构建调用函数到当前跳转目标函数的函数调用边后,对新构建的所述函数调用边进行编码。
[0116]在通过步骤S102至步骤S103构建了当前的函数调用图后,虽然此时的函数调用图还很可能没有全部构建完毕,但是此时,本发明实施例中,根据当前的函数调用图和新构建的函数调用边即可进行编码的更新,具体的步骤可以如图2所示,包括步骤:
[0117]步骤S201、将当前的路径编码现场保存至编码信息的记录中,路径编码现场包括现场路径编码值、调用点地址和目标地址;
[0118]为了使增加了新构建的函数调用边的函数调用图在编码后可以正确的解码,在本发明实施例中,在编码信息中设有了相应的记录,以保存当前的路径编码现场;具体的,记录中的路径编码现场可以包括现场路径编码值、调用点地址和目标地址。其中,现场路径编码值为未增加新的函数调用边时的路径编码编码值。
[0119]这样,在对获取通过本发明实施例中编码方式所生成的编码结果后,在解码时,可以根据记录中的各个编码现场来解析到达当前函数的函数跳转过程,进而可以得到相应的函数路径信息。
[0120]具体的,随着函数调用图的不断更新,新构建的函数调用边的数量也可能在增加,这样,可以通过将每次新增函数调用边时的编码现场依次保存在记录中的方式,将到达当前函数的路径中所有的新增函数调用边所对应的函数跳转过程(即,执行路径信息)保存下来。
[0121]在实际应用中,本发明实施例中的记录可以是辅助栈,这样,通过在新构建函数调用边的同时更新辅助栈的方式,保存到达当前函数的路径中所有的新增函数调用边的路径信息。
[0122]步骤S202、将新构建的函数调用边的当前路径编码值更新为当前函数调用图中最大路径编码值maxID+Ι ;
[0123]此外,本发明实施例中,为了避免在对到达当前跳转目标函数的函数调用路径进行编码时,其编码值会与已有的路径编码值发生冲突,本申请中,对到达当前跳转目标函数的函数调用路径进行编码时,会将其编码值(即,当前路径编码值)设置为当前函数调用图中最大路径编码值+1,从而避免由于编码
当前第2页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1