定义
插桩是一种测试程序性能、检测错误、获取程序执行信息的技术。插桩技术最早由J.C. Huang提出[3]。在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针(probe),即添加一些代码,获得程序的控制流和数据流信息。例如通过自动工具或手动,在函数执行前后插入读取计时器的代码,获取函数执行时间。
分类
- 根据插桩对象不同,分为源代码插桩和二进制插桩。
- 根据粒度不同,分为指令级别插桩、函数级别插桩、基本块级别插桩、边界级别插桩。
- 根据分析方法不同,分为静态插桩和动态插桩。
用途
- 语句覆盖探针:在基本块的出入口分别植入探针,以确定此块在运行时是否被覆盖。
- 分支覆盖探针:同上。
- 条件覆盖探针:在if、switch、while等条件表达式后植入探针,进行变量跟踪取指,以确定其被覆盖情况。
动态二进制插桩
执行模式
大多数动态二进制插桩都有三种执行模式:
- JIT(Just-In-Time)模式:在新的内存区域中生成修改后的二进制文件执行部分的副本,然后执行。
- 解释模式:用户实现一张查找表,二进制文件的每条指令都都在查找表中映射后加以执行。
- 探测模式:使用新指令覆盖旧指令达到修改目的。
Pin框架分析
参考:Intel Pin架构