/* * This file contains an ISA-portable PIN tool for tracing memory accesses. */ #include <stdio.h> #include "pin.H" FILE * trace; // Print a memory read record VOID RecordMemRead(VOID * ip, VOID * addr) { fprintf(trace, "%p: R %p\n", ip, addr); } // Print a memory write record VOID RecordMemWrite(VOID * ip, VOID * addr) { fprintf(trace, "%p: W %p\n", ip, addr); } // Is called for every instruction and instruments reads and writes VOID Instruction(INS ins, VOID *v) { // Instruments memory accesses using a predicated call, i.e. // the instrumentation is called iff the instruction will actually be executed. // // On the IA-32 and Intel(R) 64 architectures conditional moves and REP // prefixed instructions appear as predicated instructions in Pin. UINT32 memOperands = INS_MemoryOperandCount(ins); // Iterate over each memory operand of the instruction. for (UINT32 memOp = 0; memOp < memOperands; memOp++) { if (INS_MemoryOperandIsRead(ins, memOp)) { INS_InsertPredicatedCall( ins, IPOINT_BEFORE, (AFUNPTR)RecordMemRead, IARG_INST_PTR, IARG_MEMORYOP_EA, memOp, IARG_END); } // Note that in some architectures a single memory operand can be // both read and written (for instance incl (%eax) on IA-32) // In that case we instrument it once for read and once for write. if (INS_MemoryOperandIsWritten(ins, memOp)) { INS_InsertPredicatedCall( ins, IPOINT_BEFORE, (AFUNPTR)RecordMemWrite, IARG_INST_PTR, IARG_MEMORYOP_EA, memOp, IARG_END); } } } VOID Fini(INT32 code, VOID *v) { fprintf(trace, "#eof\n"); fclose(trace); } /* ===================================================================== */ /* Print Help Message */ /* ===================================================================== */ INT32 Usage() { PIN_ERROR("This Pintool prints a trace of memory addresses\n" + KNOB_BASE::StringKnobSummary() + "\n"); return -1; } /* ===================================================================== */ /* Main */ /* ===================================================================== */ int main(int argc, char *argv[]) { if (PIN_Init(argc, argv)) return Usage(); trace = fopen("pinatrace.out", "w"); INS_AddInstrumentFunction(Instruction, 0); PIN_AddFiniFunction(Fini, 0); // Never returns PIN_StartProgram(); return 0; }
여기서 달라진 것은 INS_InsertCall이 INS_InsertPredicatedCall로 바뀐 점! predicatedcall은 false일때는 call 안하고 true일 때만 call할 때 사용
INS_InsertPredicatedCall( ins, IPOINT_BEFORE, (AFUNPTR)RecordMemRead, IARG_INST_PTR, IARG_MEMORYOP_EA, memOp, IARG_END);
IARG_INST_PTR : Type: ADDRINT, The address of the instrumented instruction. This value does not change at IPOINT_AFTER.
IARG_MEMORYOP_EA: Type: ADDRINT, Effective address of a memoery op, only valid at IPOINT_BEFORE.
'pintool' 카테고리의 다른 글
More Efficient Instruction Counting (Trace Instrumentation) +질문 (0) | 2018.09.14 |
---|---|
Detecting the Loading and Unloading of Images (Image Instrumentation)+질문 (0) | 2018.09.14 |
Instruction Address Trace(Instruction Instrumentation) (0) | 2018.09.11 |
Simple Instruction Count(Instruction Instrument) (0) | 2018.09.11 |
핀툴 기초1 (0) | 2018.09.11 |