我正在尝试使用Intel Pintool来监视x86-64机器(Mac Pro)上的CALL
和RET
指令。我将IARG_INST_PTR
(如下所述)传递给docount
函数,并使用指令指针通过检查操作码(Intel x86-64 manual中的CALL
为0xe8且RET
为0xc3)推断出指令,但是,似乎此检查并不完全准确对于使用此逻辑的任何给定二进制文件,我注意到RET
的数量比CALL
的数量更多。
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_CONTEXT,
IARG_INST_PTR, IARG_END);
有人可以给我一些关于我做错了什么的指教吗?
我已经从
/tools/ManualExamples/inscount0.cpp
借用了模板。要找到它,请搜索文件名here。 最佳答案
调用和ret指令之间并不总是匹配的,仅仅是因为函数可能会被异常,类似于goto的语句,longjumps,信号等中断。因此,如果您想重新调和调用和ret,则可能需要使用考虑所有这一切。
已经讨论了好几次了,尤其是here