如何在进入例程时检测例程以填充引脚快速缓冲区条目

时间:2016-08-01 08:11:29

标签: intel-pin

我正在使用pin 3.0(build 76991)和visual studio 2012.我尝试了以下内容来检测例程条目以填充pin快速缓冲区中的条目

  1. 在图像检测期间使用RTN_InsertFillBuffer作为所需的例程,但编译器抛出了错误:RTN_InsertFillBuffer identifier not found.
  2. 通过比较图像检测回调中的名称找到例程。使用RTN_InsHead获取启动指令。然后在该指令上添加了INS_InsertFillBuffer。但我得到了segmentation faultPIN_DefineTraceBuffer文档说明在线程启动时隐式分配缓冲区。现在,由于引脚静态执行例行发现,并且在对图像进行检测时程序尚未启动,因此在图像检测期间可能不会分配缓冲区,因此调用INS_InsertFillBuffer可能会导致分段错误。我也尝试在图像检测中使用PIN_AllocateBuffer分配缓冲区,但它没有任何帮助。
  3. 通过常规检测而非图像检测尝试了第2步,但仍然存在相同的错误。
  4. 那么如何检测例程的开始以向引脚快速缓冲区添加条目?

    第一种方法的代码:

    仪表回调:

    VOID Image(IMG img, VOID *v)
    {
        for (SYM sym = IMG_RegsymHead(img); SYM_Valid(sym); sym = SYM_Next(sym)){
            string undFuncName = PIN_UndecorateSymbolName(SYM_Name(sym), UNDECORATION_NAME_ONLY);
        if(!undFuncName.compare("RtlUnwind")){
            RTN allocRtn = RTN_FindByAddress(IMG_LowAddress(img) + SYM_Value(sym));
            RTN_InsertFillBuffer(allocRtn,IPOINT_BEFORE, bufId,
                IARG_THREAD_ID, offsetof(BufferElement, tid),
                IARG_FUNCARG_ENTRYPOINT_VALUE, 0, offsetof(BufferElement, exceptionUnwindingHaltPoint),
                IARG_UINT32, SET_UNWIND_HALT, offsetof(BufferElement, entryType),
                IARG_END);
            }
          }
    }
    

    仪器:

    IMG_AddInstrumentFunction(Image,0);
    

    代码或第二种方法:

    仪表回调:

    VOID Image(IMG img, VOID *v)
    {
        for (SYM sym = IMG_RegsymHead(img); SYM_Valid(sym); sym = SYM_Next(sym)){
            string undFuncName = PIN_UndecorateSymbolName(SYM_Name(sym), UNDECORATION_NAME_ONLY);
        if(!undFuncName.compare("RtlUnwind")){
            RTN allocRtn = RTN_FindByAddress(IMG_LowAddress(img) + SYM_Value(sym));
            if (RTN_Valid(allocRtn)){
                RTN_Open(allocRtn);
                INS headIns = RTN_InsHeadOnly(allocRtn);
                if(INS_Valid(headIns)){
                    INS_InsertFillBuffer(headIns,IPOINT_BEFORE, bufId,
                                IARG_THREAD_ID, offsetof(BufferElement, tid),
                                IARG_FUNCARG_ENTRYPOINT_VALUE, 0, offsetof(BufferElement, exceptionUnwindingHaltPoint),
                                IARG_UINT32, 12, offsetof(BufferElement, entryType),
                                IARG_END);
                }
                RTN_Close(allocRtn);
            }             
        }
    }
    

    仪器:

    IMG_AddInstrumentFunction(Image,0);
    

    第三种方法的代码:

    仪表回调:

    VOID Routine(RTN rtn, VOID *v){
        if(RTN_Valid(rtn) && RTN_Name(rtn).compare("RtlUnwind")){
            RTN_Open(rtn);
            INS headIns = RTN_InsHeadOnly(rtn);
            if(INS_Valid(headIns)){
                INS_InsertFillBuffer(headIns,IPOINT_BEFORE, bufId,
                            IARG_THREAD_ID, offsetof(BufferElement, tid),
                            IARG_FUNCARG_ENTRYPOINT_VALUE, 0, offsetof(BufferElement, exceptionUnwindingHaltPoint),
                            IARG_UINT32, SET_UNWIND_HALT, offsetof(BufferElement, entryType),
                            IARG_END);
            }
            RTN_Close(rtn);
        }
    }
    

    仪器:

    RTN_AddInstrumentFunction(Routine,0);
    

0 个答案:

没有答案