1

我正在使用 pin 3.0(build 76991)和 Visual Studio 2012。我尝试了以下方法来检测例程条目以填充 pin 快速缓冲区中的条目

  1. 在图像检测期间将 RTN_InsertFillBuffer用于 所需的例程,但编译器抛出错误:RTN_InsertFillBuffer identifier not found.
  2. 通过比较图像检测回调中的名称找到了例程。用于RTN_InsHead获取启动指令。然后INS_InsertFillBuffer在该指令上添加了一个。但我得到了一个segmentation fault. PIN_DefineTraceBuffer文档说缓冲区是在线程启动时隐式分配的。现在,由于 pin 静态进行例程发现,并且在检测图像时程序尚未启动,因此在图像检测期间可能未分配缓冲区,因此调用INS_InsertFillBuffer可能会导致分段错误。我还尝试在图像检测中使用 PIN_AllocateBuffer 分配缓冲区,但这没有帮助。
  3. 通过常规检测而不是图像检测尝试了第 2 步,但同样的错误仍然存​​在。

那么如何检测例程的开始以向引脚快速缓冲区添加条目?


第一种方法的代码:

仪表回调:

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);
4

0 回答 0