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

文档序号:9471142阅读:343来源:国知局
函数调用路径编解码方法、装置及系统的制作方法
【技术领域】
[0001]本发明涉及编程领域,尤其涉及函数调用路径编解码方法、装置及系统。
【背景技术】
[0002]程序员可以通过函数调用栈来获取函数调用路径信息;函数调用路径信息已被广泛应用在了很多领域,比如程序动态执行信息分析、程序调试和错误报告、软件测试、安全保证、事件记录等。
[0003]目前,获取函数调用路径信息的方法包括函数调用路径编码(Precisecallingcontext encoding, PCCE)方法,
[0004]PCCE方法的基本思想是,在函数调用图中,根据函数之间的调用关系将调用函数和被调用函数通过连线连接,并将用于表示调用函数和被调用函数之间的调用关系的连线称为函数调用边。
[0005]通过对设定的函数调用边预设编码值,以将函数调用图中不同的函数调用路径的计算为不同的路径编码值;具体的,函数调用路径由多个函数调用边构成,由于设定的函数调用边设有预设编码值,这样,在程序的执行过程中,插桩代码会根据程序的执行路径实时计算函数调用路径的路径编码值,通过所述多个函数调用边所对应的编码值的计算,从而使得每个函数调用路径可以对应不同的路径编码值。这样在运行时的函数调用路径编码和程序当前指令地址(<id,pc>)对应着唯一一条函数调用路径,进而可以在程序中的任一个函数中利用函数调用边的编码值来区分不同函数的调用路径。
[0006]发明人经过研究发现,采用现有技术中的函数调用路径编码方法时,如果需要在函数路径图中构建新的函数调用边,那么含有新的函数调用边的函数调用路径的路径编码就会与已有函数调用路径的路径编码发生冲突,从而导致收集到的函数调用路径的路径编码不能被正确的解码。

【发明内容】

[0007]本发明实施例提供了函数调用路径编解码方法、装置及系统,用以解决现有技术中存在的函数调用路径的路径编码不能被正确的解码的技术问题。
[0008]本发明实施例第一方面提供了一种函数调用路径编码方法,包括:
[0009]将程序的主函数构建为函数调用图的初始节点;
[0010]执行所述程序过程中,判断当前跳转目标函数在所述函数调用图是否有对应的节占.
[0011]如果否,在所述函数调用图中为所述当前跳转目标函数设置对应的节点后,构建调用函数到所述当前跳转目标函数的函数调用边;
[0012]如果是,构建调用函数到所述当前跳转目标函数的函数调用边;
[0013]对新构建的所述函数调用边进行编码,包括:
[0014]将当前的路径编码现场保存至编码信息的记录中,所述路径编码现场包括现场路径编码值、调用点地址和目标地址;
[0015]将所述新构建的函数调用边的当前路径编码值更新为当前函数调用图中最大路径编码值maxID+1 ;
[0016]为所述编码信息添加对应的时间戳;
[0017]根据所述编码信息对所述程序进行插桩。
[0018]结合本发明实施例的第一方面,本发明实施例的第一方面的第一种实现方式中,所述记录存储于辅助栈。
[0019]结合本发明实施例的第一方面,本发明实施例的第一方面的第二种实现方式中,所述判断当前跳转目标函数在所述函数调用图是否有对应的节点,包括:
[0020]将当前运行函数的所有函数调用指令替换为调用运行时处理函数的代码,并保存寄存器现场;
[0021]在所述运行时处理函数中,根据保存的寄存器上下文计算得到所述跳转目标函数的调用目标地址;
[0022]根据所述调用目标地址判断当前跳转目标函数在所述函数调用图是否有对应的节点。
[0023]在第一方面的第三种可能的实现方式中,结合第一方面的第二种可能的实现方式,还包括:
[0024]当所述函数调用图符合预设的重新编码触发条件时,将所述函数调用图按照PCCE方法进行重新编码。
[0025]在第一方面的第四种可能的实现方式中,结合第一方面的第三种可能的实现方式,所述重新编码触发条件,包括:
[0026]所述函数调用图中新增加的函数调用边的数量达到预定门限,或,
[0027]到达预定的重新编码时间点,且频繁执行的函数调用路径发生变化。
[0028]在第一方面的第五种可能的实现方式中,结合第一方面的第四种可能的实现方式,所述重新编码,包括:
[0029]计算不包含递归调用边的函数调用图中各个节点的拓扑排序;
[0030]在生成编码信息时,根据所述拓扑排序对各个节点和函数调用边进行编码,为不同的函数调用路径设置不同的路径编码值;
[0031]为所述编码信息添加对应的时间戳;
[0032]根据所述编码信息对所述程序进行插桩。
[0033]在第一方面的第六种可能的实现方式中,结合第一方面的第五种可能的实现方式,所述根据所述拓扑排序对各个节点和函数调用边进行编码,为不同的函数调用路径设置不同的路径编码值包括:
[0034]当所述节点对应函数的调用指令为间接调用指令时,判断到当前跳转目标函数的函数调用边是否为新增函数调用边;
[0035]对各个新增函数调用边进行编码,并为各个新增函数调用边分别设置不同的路径编码值。
[0036]在第一方面的第七种可能的实现方式中,结合第一方面的第五种可能的实现方式,所述插桩,包括:
[0037]当所述节点对应函数的调用指令为间接调用指令时,在插桩代码中计算当前跳转目标函数的跳转目标地址的哈希值;所述哈希值用于索引所述跳转目标函数的函数调用边的路径编码值。
[0038]在第一方面的第八种可能的实现方式中,结合第一方面的第七种可能的实现方式,所述判断到当前跳转目标函数的函数调用边是否为新增函数调用边,包括:
[0039]根据所述哈希值索引得到的索引结果,判断跳转目标函数的函数调用边是否为新增函数调用边。
[0040]在第一方面的第九种可能的实现方式中,结合第一方面的第八种可能的实现方式,所述根据所述哈希值索引得到的索引结果,判断跳转目标函数的函数调用边是否为新增函数调用边,包括:
[0041]当所述哈希值索引得到的索引结果的值为O时,确定所述跳转目标函数的函数调用边为新增函数调用边。
[0042]在第一方面的第十种可能的实现方式中,结合第一方面的第五种可能的实现方式,所述重新编码,还包括:
[0043]当所述节点对应函数的调用指令为递归调用指令时,在所述路径编码现场中记录递归调用的调用次数。
[0044]在第一方面的第i^一种可能的实现方式中,结合第一方面的第十种可能的实现方式,所述在路径编码现场中记录递归调用的调用次数,包括:
[0045]通过计数器记录所述调用次数。
[0046]第二方面,本发明实施例还提供了一种函数调用路径编码的解码方法,包括:
[0047]获取所述第一方面中函数调用路径编码方法进行编码过程中的编码结果;所述编码结果包括:生成所述编码结果时刻正在执行的函数、当前路径编码值和时间戳;所述编码结果还可以包括记录;
[0048]将所述编码结果解码以获取程序的函数调用路径;所述解码包括:
[0049]根据所述时间戳索引得到解码所需的编码信息;
[0050]以当前函数为起点,根据当前路径编码值解码得到函数调用子路径;
[0051]当所述编码结果中包括记录时,根据所述记录中的各编码现场依次解码生成对应的函数调用子路径;
[0052]将所述函数调用子路径依次组装,构建由主函数至当前函数的完整函数调用路径。
[0053]结合本发明实施例的第二方面,本发明实施例的第二方面的第一种实现方式中,所述根据所述记录中的各编码现场依次解码生成对应的函数调用子路径,包括:
[0054]当所述记录中的现场路径编码值ID大于与所述记录对应的函数调用图中的最大编码值maxID时,修正所述函数调用子路径的路径编码值为:ID-maxID_l。
[0055]第三方面,本发明实施例还提供了一种函数调用路径编码装置,包括:
[0056]初始节点构建单元,用于将程序的主函数构建为函数调用图的初始节点;
[0057]函数调用图构建单元,用于执行所述程序过程中,在当前跳转目标函数在所述函数调用图没有对应的节点时,在所述函数调用图中为所述当前跳转目标函数设置对应的节点后,构建调用函数到所述当前跳转目标函数的函数调用边;在当前跳转目标函数在所述函数调用图有对应的节点时,构建调用函数到所述当前跳转目标函数的函数调用边;
[0058]编码单元,用于对新构建的所述函数调用边进行编码;所述编码单元,包括:
[0059]记录模块,用于将当前的路径编码现场保存至编码信息的记录中,所述路径编码现场包括现场路径编码值、调用点地址和目标地址;
[0060]路径编码值更新模块,用于将所述新构建的函数调用边的当前路径编码值更新为当前函数调用图中最大路径编码值maxID+Ι ;
[0061]第一编码信息标识模块,用于为所述编码信息添加对应的时间戳;
[0062]第一插桩模块,用于根据所述编码信息对所述程序进行插桩。
[0063]结合本发明实施例的第三方面,本发明实施例的第三方面的第一种实现方式中,所述记录模块包括:
[0064]辅助栈。
[0065]本发明实施例的第三方面的第二种实现方式中,结合第三方面的第一种可能的实现方式,还包括:
[0066]重新编码执行单元,用于当所述函数调用图符合预设的重新编码触发条件时,将所述函数调用图按照PCCE方法进行重新编码。
[0067]本发明实施例的第三方面的第三种实现方式中,结合第三方面的第二种可能的实现方式,所述重新编码触发条件,包括:
[0068]所述函数调用图中新增加的函数调用边的数量达到预定门限,或,
[0069]到
当前第1页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1