Как настроить процедуру для заполнения буфера быстрой записи буфера при входе в процедуру

Я использую контакт 3.0(сборка 76991) и Visual Studio 2012. Я попытался выполнить следующую процедуру, чтобы заполнить запись в буфере быстрого вывода.

  1. Использовал RTN_InsertFillBuffer для требуемой подпрограммы во время инструментирования изображения, но компилятор выдал ошибку: RTN_InsertFillBuffer identifier not found.
  2. Нашел подпрограмму путем сравнения имен в обратном вызове инструментария изображения. Используемый RTN_InsHead чтобы получить начальную инструкцию. Затем добавил INS_InsertFillBuffer по этой инструкции. Но я получил segmentation fault, PIN_DefineTraceBuffer Документация говорит, что буферы распределяются неявно при запуске потока. Теперь, когда pin выполняет рутинное обнаружение статически, а программа не запускается, когда изображения обрабатываются, поэтому буфер может не выделяться во время обработки изображений и, следовательно, при вызове INS_InsertFillBuffer может дать ошибку сегментации. Я также попытался выделить буфер с помощью PIN_AllocateBuffer в инструментах обработки изображений, но это не помогло.
  3. Пробовал шаг 2 с помощью обычной инструментальной оснастки вместо инструментальной обработки изображений, но та же ошибка сохранялась.

Итак, как я могу настроить начало процедуры, чтобы добавить запись в буфер быстрого булавки?


Код для 1-го метода:

Контрольно-измерительный прибор обратного вызова:

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

Код или 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));
        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);

Код для 3-го метода:

Инструментарий обратного вызова:

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 ответов

Другие вопросы по тегам