Megjegyezheti, hogy a printip
egy funkciómutató, ezt a Pin
belsőleg lustán hívja; ráadásul a ins
egy automatikus változó (a veremből kerül át az utasítás
ba). Következésképpen az &ins
átadása a printip
fájlba ( IARG_PTR
-on keresztül), majd annak használata szegmentálási hibákhoz vezet.
A Pin
deklarálja az INS
kódot az INDEX
osztálysablon specializálásával, mivel a következő nyilatkozatot a type_core.TLH
mezőben figyelheti meg: p>
/ *! @ingroup INS_BASIC_APIHandle az INS * / typedef osztályhoz INDEX<6> INS;
ahol az INDEX
osztálysablon konstruktorai és hozzárendelési operátorai egyaránt alapértelmezettek. Tehát, elvileg ^^, mindig kijelölhetünk egy állandó változót, hogy megossza egy INS
objektumot a műszerezés és az elemzés függvényei között, például:
statikus INS per_ins; ... VOID utasítás (INS ins, VOID * v) {per_ins = ins; ...} ... VOID printip (VOID * ip) {INS_Disassemble (per_ins);}
Ez a módszer nem működik, sajnos, ez egy példa a "jól beírt programokra" még mindig elromolhat "a C / C ++
^^ fájlban. Mivel a Pin
nem garantálja, hogy az INS
típusú objektum által elérett belső változók állandóak legyenek az elemzési időben , a Az elemzési függvény ben az INS_Disassemble (per_ins)
értelmetlen lehet.
Az Ön esetére előfordulhat, hogy nem kívánja felhívni a INS_Disassemble (ins) kód> minden egyes ins
végrehajtásakor. Nincs szükségünk erre, ha például a ins
egy hurokban van, akkor ezt a függvényt többször is meghívjuk (ugyanazokkal az ins
kódokkal), hogy ugyanazt az eredményt kapjuk.
Az utasítások összes statikus információját (pl. ebben az esetben a ins
szétszerelt formáját) instrumentation time ban kell megszerezni. Különösen az INS_Disassemble
-t kell csak egyszer hívni egyes műszeres funkcióknál. A kívánt effektus elérésének egyik módja:
static std :: unordered_map<ADDRINT, std :: string> str_of_ins_at; VOID utasítás (INS ins, VOID * v) {str_of_ins_at [INS_Address (ins) )] = INS_Disassemble (ins); ...} VOID printip (VOID * ip, ADDRINT addr) {std :: string ins_str = str_of_ins_at [addr]; ...}