// Simple test for PIN. // Prints the number of memory accesses. // Run: $PIN_ROOT/pin -t `pwd`/simple_pin_test.so -- your_program #include "pin.H" #include <map> // statistics static long long dynamic_memory_access_count; static int static_memory_access_count; //---------- Instrumentation functions --------- void InsertBeforeEvent_MemoryAccess(ADDRINT pc) { dynamic_memory_access_count++; } //-------------- PIN callbacks --------------- void CallbackForTRACE(TRACE trace, void *v) { for (BBL bbl = TRACE_BblHead(trace); BBL_Valid(bbl); bbl = BBL_Next(bbl)) { for (INS ins = BBL_InsHead(bbl); INS_Valid(ins); ins = INS_Next(ins)) { if (INS_IsStackRead(ins) || INS_IsStackWrite(ins)) continue; if (INS_IsMemoryRead(ins) || INS_IsMemoryWrite(ins)) { static_memory_access_count++; INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)InsertBeforeEvent_MemoryAccess, IARG_INST_PTR, IARG_END); } } } } static void CallbackForFini(INT32 code, void *v) { printf("accesses static : %d\n", static_memory_access_count); printf("accesses dynamic : %lld\n", dynamic_memory_access_count); } //---------------- main --------------- int main(INT32 argc, CHAR **argv) { PIN_Init(argc, argv); PIN_InitSymbols(); PIN_AddFiniFunction(CallbackForFini, 0); TRACE_AddInstrumentFunction(CallbackForTRACE, 0); PIN_StartProgram(); printf("accesses static : %d\n", static_memory_access_count); return 0; }