以前做过一段时间的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会去修改代码中相应的代码段(内存) 。这样函数每次调用就会沿袭这条路线调用下去。
至于还原函数调用路线,则是将修改之前的代码备份重新写回这个函数的第一条指令后即可