| // 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; |
| } |