私はピン 3.0 (ビルド 76991) とビジュアル スタジオ 2012 を使用しています。ルーチン エントリをインストルメント化し、ピン ファスト バッファのエントリを埋めるために次のことを試しました。
- イメージの計測中に必要なルーチンにRTN_InsertFillBufferを使用 しましたが、コンパイラはエラーをスローしました:
RTN_InsertFillBuffer identifier not found.
- イメージ インストルメンテーション コールバックで名前を比較して、ルーチンを見つけました。
RTN_InsHead
開始命令を取得するために使用されます。次に、INS_InsertFillBuffer
その命令に追加しました。しかし、私はsegmentation fault
.PIN_DefineTraceBuffer
ドキュメントには、スレッドの開始時にバッファーが暗黙的に割り当てられると記載されています。pin は定期的な検出を静的に実行し、イメージがインストルメント化されているときにプログラムが開始されていないため、イメージのインストルメンテーション中にバッファが割り当てられず、 を呼び出すとINS_InsertFillBuffer
セグメンテーション エラーが発生する可能性があります。また、画像計測で PIN_AllocateBuffer を使用してバッファーを割り当てようとしましたが、役に立ちませんでした。 - イメージ インストルメンテーションの代わりにルーチン インストルメンテーションでステップ 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);
コードまたは 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);