You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Intel PIN中INS_AddInstrumentFunction与INS_InsertCall的区别及调用时机

Intel PIN中INS_AddInstrumentFunction与INS_InsertCall的调用时机解析

INS_AddInstrumentFunction 回调的调用时机

这是PIN在静态插桩阶段触发的回调——也就是PIN加载目标程序、解析二进制指令流的过程中,会遍历每一条可执行指令(INS对象),对每条指令都会执行你传入的回调函数一次。这个阶段发生在目标程序开始运行之前,属于预处理环节,你通常在这里完成插桩的判断与配置(比如决定对哪些指令进行动态插桩)。

示例代码片段:

void InstrumentEachIns(INS ins, void* userData) {
    // 针对每条指令做判断,比如只对内存读写指令插桩
    if (INS_IsMemoryRead(ins) || INS_IsMemoryWrite(ins)) {
        INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)TrackMemoryAccess, IARG_END);
    }
}

// 在PIN的主函数中注册
int main(int argc, char* argv[]) {
    PIN_Init(argc, argv);
    INS_AddInstrumentFunction(InstrumentEachIns, 0);
    PIN_StartProgram();
    return 0;
}

上面的InstrumentEachIns函数会在静态分析阶段,每解析一条指令就执行一次。

INS_InsertCall 回调的调用时机

这个函数是用来向目标指令中插入动态运行时钩子,你传入的回调函数会在目标程序运行到指定指令的特定时机(通过IPOINT_*参数指定,比如IPOINT_BEFORE、IPOINT_AFTER)被触发。也就是说,每当目标程序执行到你插桩的那条指令时,PIN会先/后执行你设置的回调,再继续执行原指令逻辑。

比如上面示例中的TrackMemoryAccess函数,会在目标程序每次执行内存读写指令前被调用,每次指令执行都会触发一次。

核心区别总结

  • INS_AddInstrumentFunction的回调:程序运行前的静态分析阶段,每条指令仅执行一次,负责插桩的配置;
  • INS_InsertCall的回调:程序运行时,对应指令被执行到指定时机时触发,属于运行时的行为钩子。

内容的提问来源于stack exchange,提问作者QZero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:15:59