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

文档序号:9471142阅读:来源:国知局
值冲突所导致的编码无法正确编码的问题。
[0124]步骤S203、为编码信息添加对应的时间戳;
[0125]接着,本发明实施例中,解码信息的数量有可能为多个,因此,为了在解码时能够获取到对应的编码信息,在本申请中,还为所有的解码信息添加了对应的时间戳。
[0126]步骤S204、根据编码信息对所述程序进行插桩;
[0127]在通过上述步骤生成了编码信息后,为了能够在程序的执行过程中可以准确的索引到该编码信息,为此,还需要根据编码信息对程序进行插桩。
[0128]具体的,本发明实施例中的编码过程可以参考图3和图4,其中,图3为当前函数调用图,图4为以图3中函数调用图为基础,新增函数调用边后的函数调用图。
[0129]图3中,函数调用图路径的总数量为5,该函数路径图中的最大编码值为4(即,编码值由O至4,共计5个编码值),此时,函数调用图中的执行路径和编码空间[0,maxID]之间建立一个一一对应关系,其中,当前的最大编码值maxID即为4。
[0130]在设置与编码信息对应的辅助栈ccStack时,路径编码现场为在进行编码时刻时函数调用图(即,图3)的现场状态,包括与路函数调用边对应的现场路径编码值O、函数调用边的调用点地址C和函数调用边的目标地址E。在以图3为基础,新构建的函数调用边C一E(虚线所表示)时(即,构建图4所对应的函数调用图时),辅助栈ccStack中的路径编码现场就可以更新为:〈0,C,E>
[0131]由于在本申请中,需要在函数调用图中构建新的函数调用边,为了避免编码值的冲突,所以在本申请中,将新构建的函数调用边的编码值的取值范围设置为大于函数路径图中的最大编码值,具体的,可以是当前函数调用图中最大路径编码值+1,比如,在图4中,通过新构建的函数调用边C一E的编码值即可设置为maxID+Ι = 4+1 = 5。
[0132]综上所述,在以图3为基础,构建新的函数调用边C一E(虚线所表示)生成图4中的函数调用图后,对应的编码信息为:{E,id = 5, ccStack =〈0,C,E>};其中当前路径编码值id = 5,辅助栈ccStack内的首个路径编码现场为〈0,C,E>。
[0133]经上述编码后,函数调用路径ACE具体的解码方式可以包括:
[0134]在图4所示出的函数调用图中,maxID为4,而当前路径编码值为5,所以先修正该编码值为5-(maxID+l) = O,并在辅助栈ccStack中取出保存的路径编码现场〈0,A, O,从而首先解码得到边CE。然后,当前函数变为C,路径编码值为0,根据PCCE中的解码方法解码得到函数子路径AC。最后,合并函数子路径得到完整函数调用路径ACE。
[0135]综上所述,在本申请中,通过在程序的执行过程中,实时动态构建程序的函数调用图的同时,还对动态构建的函数调用图进行相应的动态编码,在编码时,通过保存路径编码现场,并将函数调用图中新构建的函数调用边的编码值设置为,大于当前函数调用图中最大路径编码值的方式,来保存到达当前函数的路径中所有的新增函数调用边的路径信息,以及,避免新设置的编码值与原有编码值发生冲突,以使本申请中的动态编码后的函数调用路径编码可以被正确的解码。
[0136]进一步的,由于通过本申请中实时的动态编码方式,需要根据路径编码现场中的现场路径编码值、调用点地址和目标地址来获取到正确的路径,所以在解码过程中获取间接调用路径和递归调用路径的开销较大,这样,当新增加的函数调用边的数量过多时,解码的效率就会受到较大的影响,为此,在本申请中,还预设了重新编码触发条件,从而当解码的效率下降到一定程度时,将当前的函数路径图按照现有技术中的编码方式(即,PCCE编码)进行编码,从而使解码的效率能够维持在一个较高的水平。
[0137]在实际应用中,重新编码触发条件可以根据新增的函数调用边的数量值来设定,艮P,当新增的函数调用边到达预设门限时,对当前函数调用图以现有技术中的编码方式进行编码;或者,也可以预设预定的重新编码时间点,当到达重新编码时间点时,如果频繁执行的函数调用路径发生变化,那么此时就当前函数调用图以现有技术中的编码方式进行编码;由于通过重新解码后的函数调用图是以将当前函数调用图作为编码对象进行的静态编码,所以该部分的编码在解码时就不会因为获取间接调用路径和递归调用路径而带来的过大的开销。
[0138]具体的,本申请中的重新编码,如图5所示,可以包括:
[0139]S301、计算不包含递归调用边的函数调用图中各个节点的拓扑排序;
[0140]基于当前的函数调用图,在进行编码时,函数调用图中的节点既有可能是常规的的直接调用函数,也有可能是间接调用函数或递归调用函数;如果函数调用图中含有递归调用边,那么函数调用图中就含有调用环。因为不能确定调用环中各个节点的拓扑排序,所以导致无法对含有递归调用边的函数调用图进行编码。
[0141]基于上述递归函数调用边的特殊性,在本申请中,首先将不包含递归调用边的函数调用图中各个节点的拓扑排序,以便于对这些节点进行常规编码。
[0142]S302、在生成编码信息时,根据所述拓扑排序对各个节点和函数调用边进行编码,为不同的函数调用路径设置不同的路径编码值。
[0143]对于直接调用函数的编码和插桩,由于直接调用函数其调用指令只会对应函数调用图中的一条边(即,只有一个调用目标),因此在识别出其调用目标后,只需要在函数调用图中添加相应的函数调用边,然后对该函数调用边进行编码即可。
[0144]进一步的,在本申请中,当节点对应函数的调用指令为间接调用指令时,可以通过以下方式来进行编码:
[0145]判断到当前跳转目标函数的函数调用边是否为新增函数调用边;对各个新增函数调用边进行编码,并为各个新增函数调用边分别设置不同的路径编码值。
[0146]这是因为,当函数调用图中的节点为间接调用函数时,该函数有可能对应有多个调用目标,即,有可能对应有函数对应图中的多个函数调用边;因此,需要在编码时,分别检测这多个函数调用边是否为函数调用图中新增的函数调用边,并且将其中被确定新增函数调用边的函数调用边分别赋予不同的编码值,从而区分由这些新增的函数调用边所构成的不同的函数路径。
[0147]S303、为编码信息添加对应的时间戳;
[0148]在本发明实施例中,每次重新解码后,都会生成对应的解码信息,因此,解码信息的数量有可能为多个,为了在解码时能够获取到对应的编码信息,在本申请中,还为所有的解码信息添加了对应的时间戳,以标识各个编码信息。
[0149]S304、根据编码信息对程序进行插桩。
[0150]在通过上述重新编码生成了编码信息后,为了能够在程序的执行过程中可以准确的索引到该编码信息,为此,还需要根据编码信息对程序进行插桩。
[0151]优选的,在本申请中,对于由间接调用函数构建的新增函数调用边进行编码和插桩时,还可以通过在插桩代码中会根据间接调用函数的跳转目标地址计算对应的哈希值,然后根据该哈希值来索引该新增函数调用边的编码值的方式,来减少哈希冲突带来的性能开销。
[0152]具体的,当节点对应函数的调用指令为间接调用指令时,在插桩代码中计算当前跳转目标函数的跳转目标地址的哈希值;哈希值用于索引跳转目标函数的函数调用边的路径编码值。其中,分别判断到每个跳转目标函数的函数调用边是否为新增函数调用边可以包括:
[0153]根据哈希值索引得到的索引结果,判断跳转目标函数的函数调用边是否为新增函数调用边;如果根据哈希结果索引得到的项中的值是0,那么表明该跳转目标对应的函数调用边未被编码,应该调用运行时处理函数对其进行编码,即,当哈希值索引得到的索引结果的值为O时,确定跳转目标函数的函数调用边为新增函数调用边。
[0154]S305、所述重新编码,还包括,当节点对应函数的调用指令为递归调用指令时,在路径编码现场中记录递归调用的调用次数。
[0155]对于由递归函数而构建的新增函数调用边,在进行编码和插桩时,由于不能确定递归调用的递归次数,因此不能使用静态编码方法对其进行直接编码。对于递归调用,本发明实施例中使用大于当前最大编码值的编码值来对含有递归调用的函数路径进行编码。在对递归函数的函数调用边进行重编码之前,递归函数的函数调用边的编码和插桩方法与未编码边完全相同。
[0156]由于如果程序中递归调用频繁地执行,那么会使得路径编码现场中重复记录大量的调用点地址和目标地址,这样不但会带来大量的时间开销,而且会增加记录函数调用路径所需的空间开销。为此,在本申请中,根据运行时递归调用的规律,通过记录递归调用的调用次数的方式,来对路径编码现场进行简化,以减少插桩代码带来的访存操作。具体的,当节点对应函数的调用指令为递归调用指令时,可以在路径编码现场中记录递归调用的调用次数,具体的,可以是通过计数器,来记录发生递归调用的次数(即ccStack.top 0.count++)ο
[0157]在本申请的另一面,还提供了一种函数调用路径编码的解码方法,包括步骤:
[0158]针对图1至图5所对应的实施例中的函数调用路径编码方法,可以通过本实施例中的解码方法对其编码信息进行解码,如图6所示,具体可以包括:
[0159]S401、获取由图1至图5所对应的实施例中的函数调用路径编码方法的编码结果,编码结果包括:生成编码结果时刻正在执行的函数(即,当前函数)、当前路径编码值和时间戳;编码结果还可以包括记录;
[0160]如果编码结果是根据刚刚重新编码后的编码信息所获取的,那么,此时就不需要在设有记录来保存新增函数调用边所对应的函数跳转过程,所以编码结果中包括记录并不是必然的,即,编码结果中,有可能包括有记录,也有可能没有记录。
[0161]S402、将编码结果解码以获取程序的函数调用路径;
[0162]解码过程具体步骤可以如图7所示,包括:
[0163]S501、根据时间戳索引得到解码所需的编码
当前第3页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1