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

文档序号:9471142阅读:来源:国知局
信息;
[0164]由于时间戳与编码信息具有对应关系,所以,根据时间戳可以得到解码所需的编码息。
[0165]S502、以当前函数为起点,根据当前路径编码值解码得到函数调用子路径;当编码结果中包括记录时,根据记录中的各路径编码现场依次解码生成对应的函数调用子路径;
[0166]如果编码结果中不包括记录,则表示,该编码结果很可能是获取自重新编码后所生成的编码信息,由于重新编码的方式可以按照现有技术中的常规方式进行编码,所以,此时,按照编码方式对应的常规解码方式即可进行解码。
[0167]当编码结果中包括记录时,说明编码结果中包括了新增函数调用边所对应的函数跳转过程,此时,据记录中的各路径编码现场依次解码生成对应的函数调用子路径;具体的,路径编码现场中的每组现场路径编码值、调用点地址和目标地址,均能表示一个新构建函数调用边的函数调用子路径,在将所有的路径编码现场分别解析后,就可以得到每次新增函数调用边所对应的函数调用子路径。
[0168]S503、将函数调用子路径依次组装,构建由主函数至当前函数的完整函数调用路径。
[0169]在解析每个路径编码现场后,将每个函数调用子路径依次组合后,即可完成函数调用子路径的组装,进而构建出了由主函数至当前函数的完整函数调用路径。
[0170]进一步的,由于在通过本申请中实施例进行编码时,会使得编码信息中的路径编码值存在大于对应的函数调用图中最大编码值的情况,为此,在解码过程中需要对此进行修正;具体的可以是,在根据记录中的路径编码现场和与记录对应函数调用图生成函数调用子路径过程中,当所述记录中的现场路径编码值ID大于与记录对应的函数调用图中的最大编码值maxID时,修正函数调用子路径的路径编码值为:ID-maxID_l。
[0171]tWn,在以图3为基础,构建新的函数调用边C一E(虚线所表示)生成图4中的函数调用图后,对应的编码信息为:{E,id = 5, ccStack =〈0,C,E>};其中当前路径编码值id=5,辅助栈ccStack内的首个路径编码现场为〈0,C,E>。
[0172]经上述编码后,函数调用路径ACE具体的解码方式可以包括:
[0173]在图4所示出的函数调用图中,maxID为4,而当前路径编码值为5,所以先修正该编码值为5-(maxID+l) = O,并在辅助栈ccStack中取出保存的路径编码现场〈0,A, O,从而首先解码得到函数子路径CE。然后,当前函数变为C,路径编码值为0,根据PCCE中的解码方法解码得到函数子路径AC。最后,合并函数子路径得到完整函数调用路径ACE。
[0174]综上所述,本发明实施例中的函数调用路径编码的解码方法,可以与本申请中的函数调用路径编码方法适配使用,从而实现可以对函数调用图进行实时的动态编码的同时,避免了新设置的编码值与原有编码值发生冲突,以使本申请中的动态编码后的函数调用路径编码可以被正确的解码。
[0175]在本申请的另一面,还提供了一种函数调用路径编码装置,如图8所示,包括:
[0176]初始节点构建单元01,用于将程序的主函数构建为函数调用图的初始节点;
[0177]函数调用图构建单元02,用于执行程序过程中,在当前跳转目标函数在函数调用图没有对应的节点时,在函数调用图中为当前跳转目标函数设置对应的节点后,构建调用函数到当前跳转目标函数的函数调用边;在当前跳转目标函数在函数调用图有对应的节点时,构建调用函数到当前跳转目标函数的函数调用边;
[0178]编码单元03,用于对新构建的函数调用边进行编码;编码单元具体可以包括:记录模块31、路径编码值更新模块32、第一编码信息标识模块33和第一插桩模块34。
[0179]记录模块31,用于将当前的路径编码现场保存至编码信息的记录中,路径编码现场包括现场路径编码值、调用点地址和目标地址;路径编码值更新模块32,用于将新构建的函数调用边的当前路径编码值更新为当前函数调用图中最大路径编码值maxID+Ι ;第一编码信息标识模块33,用于为编码信息添加对应的时间戳;第一插桩模块34,用于根据编码信息对程序进行插桩。
[0180]为了使增加了新构建的函数调用边的函数调用图在编码后可以正确的解码,在本发明实施例中,通过记录模块31将当前的路径编码现场保存至编码信息的记录中,以保存当前的路径编码现场;具体的,记录中的路径编码现场可以包括现场路径编码值、调用点地址和目标地址。其中,现场路径编码值为未增加新的函数调用边时的路径编码编码值。
[0181]这样,在对获取通过本发明实施例中编码方式所生成的编码结果后,在解码时,可以根据记录中的各个编码现场来解析到达当前函数的函数跳转过程,进而可以得到相应的函数路径信息。
[0182]具体的,随着函数调用图的不断更新,新构建的函数调用边的数量也可能在增加,这样,可以通过记录模块31将每次新增函数调用边时的编码现场依次保存在记录中的方式,将到达当前函数的路径中所有的新增函数调用边所对应的函数跳转过程(即,执行路径信息)保存下来。
[0183]在实际应用中,本发明实施例中的记录可以是辅助栈,这样,通过在新构建函数调用边的同时更新辅助栈的方式,保存到达当前函数的路径中所有的新增函数调用边的路径信息。
[0184]此外,本发明实施例中,为了避免在对到达当前跳转目标函数的函数调用路径进行编码时,其编码值会与已有的路径编码值发生冲突,本申请中,路径编码值更新模块32在对到达当前跳转目标函数的函数调用路径进行编码时,会将其编码值(即,当前路径编码值)设置为当前函数调用图中最大路径编码值+1,从而避免由于编码值冲突所导致的编码无法正确编码的问题。
[0185]此外,由于解码信息的数量有可能为多个,因此,为了在解码时能够获取到对应的编码信息,在本申请中,通过第一编码信息标识模块33,还可以为所有的解码信息添加了对应的时间戳。
[0186]在生成了编码信息后,为了能够在程序的执行过程中可以准确的索引到该编码信息,为此,还需要通过第一插桩模块34,根据编码信息对程序进行插桩。
[0187]综上所述,在本申请中,通过在程序的执行过程中,实时动态构建程序的函数调用图的同时,还对动态构建的函数调用图进行相应的动态编码,在编码时,通过保存路径编码现场,并将函数调用图中新构建的函数调用边的编码值设置为,大于当前函数调用图中最大路径编码值的方式,来保存到达当前函数的路径中所有的新增函数调用边的路径信息,以及,避免新设置的编码值与原有编码值发生冲突,以使本申请中的动态编码后的函数调用路径编码可以被正确的解码。
[0188]进一步的,由于通过本申请中实时的动态编码方式,需要根据路径编码现场中的现场路径编码值、调用点地址和目标地址来获取到正确的路径,所以在解码过程中获取间接调用路径和递归调用路径的开销较大,这样,当新增加的函数调用边的数量过多时,解码的效率就会受到较大的影响,为此,在本申请中,还设有了重新编码执行单元,通过预设重新编码触发条件,从而当解码的效率下降到一定程度时,将当前的函数路径图按照现有技术中的编码方式(即,PCCE编码)进行编码,从而使解码的效率能够维持在一个较高的水平。
[0189]在实际应用中,重新编码触发条件可以根据新增的函数调用边的数量值来设定,艮P,当新增的函数调用边到达预设门限时,对当前函数调用图以现有技术中的编码方式进行编码;或者,也可以预设预定的重新编码时间点,当到达重新编码时间点时,如果频繁执行的函数调用路径发生变化,那么此时就当前函数调用图以现有技术中的编码方式进行编码;由于通过重新解码后的函数调用图是以将当前函数调用图作为编码对象进行的静态编码,所以该部分的编码在解码时就不会因为获取间接调用路径和递归调用路径而带来的过大的开销。
[0190]具体的,重新编码执行单元具体可以如图9所示,包括拓扑排序模块21、编码模块22、第二编码信息标识模块23和第二插桩模块24 ;
[0191]拓扑排序模块21用于计算不包含递归调用边的函数调用图中各个节点的拓扑排序;编码模块22用于在生成编码信息时,根据拓扑排序对各个节点和函数调用边进行编码,为不同的函数调用路径设置不同的路径编码值;第二编码信息标识模块23用于为编码信息添加对应的时间戳;第二插桩模块24用于根据编码信息对所述程序进行插桩。
[0192]基于当前的函数调用图,在进行编码时,函数调用图中的节点既有可能是常规的的直接调用函数,也有可能是间接调用函数或递归调用函数;如果函数调用图中含有递归调用边,那么函数调用图中就含有调用环。因为不能确定调用环中各个节点的拓扑排序,所以导致无法对含有递归调用边的函数调用图进行编码。
[0193]基于上述递归函数调用边的特殊性,在本申请中,拓扑排序模块21首先将不包含递归调用边的函数调用图中各个节点的拓扑排序,以便于对这些节点进行常规编码。
[0194]在通过编码模块22生成编码信息时,对于直接调用函数的编码和插桩,由于直接调用函数其调用指令只会对应函数调用图中的一条边(即,只有一个调用目标),因此在识别出其调用目标后,只需要在函数调用图中添加相应的函数调用边,然后对该函数调用边进行编码即可。
[0195]而当节点对应函数的调用指令为间接调用指令时,编码模块22可以通过以下方式来进行编码:
[0196]判断到当前跳转目标函数的函数调用边是否为新增函数调用边;对各个新增函数调用边进行编码,并为各个新增函数调用边分别设置不同的路径编码值。
[0197]这是因为,当函数调用图中的节点为间接调用函数时,该函数有可能对应有多个调用目标,即,有可能对应有函数对应图中的多个函数调用边;因此,需要在编码时,分别检测这多个函数调用边是否为函数调用图中新增的函数调用边,并且将其中被确定新增函数调用边的函数调用边分别赋予不同的编码值,从而区分由这些新增的函数调用边所构成的不同的函数路径。
[0198]在本发明实施例中,每次重新解码后,都会生成对应的解码信息,因此,解码信息
当前第4页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1