刚开始看的时候囫囵吞枣,其实好多都不懂呢,补充一下:
pin能检测的层次:instruction,bbl(basic block),trace,routine,image
instruction是最低层次的,instruction指的是汇编指令,如mov ,inc,loop,etc。
bbl指一个入口一个出口的语句
trace是一个入口多个出口的语句,如if
routine 相当于一个函数
image是exe,dll(windows下),之类的映像文件。
下面我们比较分析几个pintool文件
下面分别来自inscount0.cpp、inscount1.cpp、proccount.cpp的三个语句
INS_InsertCall(ins,IPOINT_BEFORE, (AFUNPTR)printip, IARG_INST_PTR, IARG_END);
BBL_InsertCall(bbl, IPOINT_BEFORE, (AFUNPTR)docount, IARG_UINT32, BBL_NumIns(bbl);
RTN_InsertCall(rtn,IPOINT_BEFORE, (AFUNPTR)docount,IARG_PTR, &(rc->_rtnCount), IARG_END);
通过对比我们发现,***_InsertCall()函数,表示在什么情况(针对不同的***由IPOINT_决定在***的前中后还是任意位置)下调用(AFUNPTR)函数进行相应的操作,如输出地址,计数等等。
.....