插桩技术

概要

 

插桩的概念:插桩就是在代码中插入一段我们自定义的代码。

 

插桩的目的:由于我们插入的代码会一起被编译到可执行文件中,所以可执行文件在运行过程中必然会执行我们插入的自定义代码,这样我们可以记录任何我们渴望知道的信息,例如函数的调用信息等。

 

插桩器的难点

1、 深入了解目标语言的语法,能够对其解析,进行语义理解;

2、 确定插入代码内容,位置;

 

近期我将要完成一款XX语言的插桩器,希望能够积累一些有价值的经验与大家一起分享。

 

 

插桩位置分析

插桩后,一般用户希望得到的结果有代码覆盖率、分支覆盖率、调用覆盖率。

那么至少哪些位置插入相关信息后,就能分析道上述三个信息?

代码覆盖率,顾名思义就是代码被执行的比例,那么这个该如何统计?最简单的方法运行一条代码,记录一条代码的信息,最后分析,看上去应该是这样,但实际上根本不可能,因为这样的消耗太厉害了,那该如何做呢?这要基于一个前提,代码是顺序执行的,目前所有代码应该都满足这样的前提,那么我们只需要在跳转的地方插入相关信息即可,这样最终可以通过分析跳转流程得到代码的执行过程,这样说来就需要在函数入口出插桩,分支跳转处插桩,函数返回处插桩,从理论分析上来说,应该函数返回处不需要插桩吧?这个应该可以分析到从函数哪里返回的,这个过程中分析难度大吗?对于异常处理也可以吗?需要大家自己分析下了。

分支覆盖率,顾名思义就是函数内分支覆盖的百分比,上边在进行代码覆盖率时已经在分支处插入了相关代码,这个部分应该没啥问题了。

函数调用覆盖率:这个具体详细定义我还需要再进行确认,但如果是针对整个系统中所有函数进行调用覆盖率的话,那么我们在函数入口处插入信息便可以统计到了,并且也可以得到函数的被调用路径信息,但如果还需要获取例如没有被调用路径信息,那么我们可能需要分析到函数的所有调用路径,这个应该通过代码分析做到,但对于函数指针等高级使用方法,现有工具可以做到完全分析出调用路径吗?如果有知道的朋友请留言告我,或发我QQ:908869620,先谢谢了。

 

下一个阶段就是具体这些位置插入什么样的信息问题了,需要再考虑下再写。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值