1// Simple test for PIN. 2// Prints the number of memory accesses. 3// Run: $PIN_ROOT/pin -t `pwd`/simple_pin_test.so -- your_program 4#include "pin.H" 5 6#include <map> 7 8// statistics 9static long long dynamic_memory_access_count; 10static int static_memory_access_count; 11 12//---------- Instrumentation functions --------- 13void InsertBeforeEvent_MemoryAccess(ADDRINT pc) { 14 dynamic_memory_access_count++; 15} 16 17//-------------- PIN callbacks --------------- 18void CallbackForTRACE(TRACE trace, void *v) { 19 for (BBL bbl = TRACE_BblHead(trace); BBL_Valid(bbl); bbl = BBL_Next(bbl)) { 20 for (INS ins = BBL_InsHead(bbl); INS_Valid(ins); ins = INS_Next(ins)) { 21 if (INS_IsStackRead(ins) || INS_IsStackWrite(ins)) 22 continue; 23 if (INS_IsMemoryRead(ins) || INS_IsMemoryWrite(ins)) { 24 static_memory_access_count++; 25 INS_InsertCall(ins, IPOINT_BEFORE, 26 (AFUNPTR)InsertBeforeEvent_MemoryAccess, 27 IARG_INST_PTR, IARG_END); 28 } 29 } 30 } 31} 32 33static void CallbackForFini(INT32 code, void *v) { 34 printf("accesses static : %d\n", static_memory_access_count); 35 printf("accesses dynamic : %lld\n", dynamic_memory_access_count); 36} 37 38//---------------- main --------------- 39int main(INT32 argc, CHAR **argv) { 40 PIN_Init(argc, argv); 41 PIN_InitSymbols(); 42 PIN_AddFiniFunction(CallbackForFini, 0); 43 TRACE_AddInstrumentFunction(CallbackForTRACE, 0); 44 PIN_StartProgram(); 45 printf("accesses static : %d\n", static_memory_access_count); 46 return 0; 47} 48