every instruction is executed VOID docount() { icount++; } // Pin calls this function every time a new instruction is encountered VOID Instruction(INS ins, VOID *v) { // Insert a call to docount before every instruction, no arguments are passed INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_END);} analysis Instrumentation VOID Fini(INT32 code, VOID *v){ OutFile.setf(ios::showbase); OutFile << "Count " << icount << endl; OutFile.close();} int main(int argc, char * argv[]) { if (PIN_Init(argc, argv)) return Usage(); OutFile.open(KnobOutputFile.Value().c_str()); INS_AddInstrumentFunction(Instruction, 0); PIN_AddFiniFunction(Fini, 0); PIN_StartProgram(); return 0; }
every block VOID docount(UINT32 c) { icount += c; } // Pin calls this function every time a new basic block is encountered VOID Trace(TRACE trace, VOID *v){ for (BBL bbl = TRACE_BblHead(trace); BBL_Valid(bbl); bbl = BBL_Next(bbl)){ // Insert a call to docount before every bbl, passing the number of instructions BBL_InsertCall(bbl, IPOINT_BEFORE, (AFUNPTR)docount, IARG_UINT32, BBL_NumIns(bbl), IARG_END);}} analysis Instrumentation VOID Fini(INT32 code, VOID *v){ OutFile.setf(ios::showbase); OutFile << "Count " << icount << endl; OutFile.close();} int main(int argc, char * argv[]){ if (PIN_Init(argc, argv)) return Usage(); OutFile.open(KnobOutputFile.Value().c_str()); TRACE_AddInstrumentFunction(Trace, 0); PIN_AddFiniFunction(Fini, 0); PIN_StartProgram(); return 0;}
dynamic instrumentation - CK Luk+ - [2] ATOM A System for Building Customized Program Analysis Tools - A Srivastava+ - [3] Valgrind: a framework for heavyweight dynamic binary instrumentation - N Nethercote+ - [4] Pin Tutorial (http://www.ic.unicamp.br/~rodolfo/Cursos/mo801/2s2015/04-PinTutorial.pdf) - [5] PinからPEMUへ(https://ntddk.github.io/2015/04/03/pin-to-pemu/)