您当前位置: 首页 » unix编程环境学习 » 思考 » 插入api 用在代码单元测试

插入api 用在代码单元测试

2012-05-01 |

以前做过一段时间的LLT,对于LLT的实现感觉很奇怪。

LLT主要是用于函数单元级测试,以及多函数之间的debug。

在测试某个函数时,其实关心的只是函数本身流程和值计算是否正确。对于被函数如何调用其他函数,或者调用是否正确都不关心。因此需要对被测函数内部的函数调用情况作修改。

在windows上面,就用用到了hook中的一种。插入api,即替换函数的第一条汇编指令。

有如下代码

 void willtest()

{

….

function_a()  ;

….

}

其中willtest是被测函数,function_a的调用情况并不关心。

使用插入api就是将function_a的第一条汇编指令修改成一个jump指令,使得调用位置发生改变。这样就达到插入api的目的。利用windows上提供的这个特征来做代码测试,是一个很好的做法。

但唯一的缺陷就是,他不能用于多线程环境下的测试。因为修改function_a的汇编指令是动态的由操作系统完成,并不是在编译期生成的。因此很难保证,在修改之前无法保证会不会有线程已经在执行function_a这段代码。

具体修改方法,记得书中讲到过,当修改funciton_a时,windows会去修改代码中相应的代码段(内存) 。这样函数每次调用就会沿袭这条路线调用下去。

至于还原函数调用路线,则是将修改之前的代码备份重新写回这个函数的第一条指令后即可

分类:

unix编程环境学习, 思考

| 标签: