【发布时间】:2015-06-25 01:45:55
【问题描述】:
我正在尝试使用 Intel Pintool 来监控 x86-64 机器 (Mac Pro) 上的 CALL 和 RET 指令。我将IARG_INST_PTR(下面提到)传递给docount函数并使用指令指针通过检查操作码来推断指令(CALL是0xe8,RET是来自Intel x86-64 manual的0xc3。但是,似乎此检查并不完全准确,因为对于任何使用此逻辑检测的给定二进制文件,我注意到 RET 的数量比 CALL 的数量要多。
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_CONTEXT,
IARG_INST_PTR, IARG_END);
谁能指点一下我做错了什么?
我从/tools/ManualExamples/inscount0.cpp借来了模板。要找到它,请搜索文件名here。
【问题讨论】:
-
编译后的代码真的有可能比
call拥有更多的ret吗?如果 (a) 返回 1;否则,如果 (b) 返回 2;否则返回 3;内部函数可能会生成多个ret -
除非代码有问题,否则不应该有任何不匹配。这意味着我的 CALL/RET 检测逻辑一定是有缺陷的。我希望得到一些指示来纠正同样的问题。
-
@SeverinPappadeux - 多个返回语句不会导致单独的 RET 指令,而是会导致 JMP 指令到 RET,并在 RAX 寄存器中具有适当的返回值。
-
嗯,执行时间会更长,因为它是 JMP+RET 而不是 RET。但是代码大小会更大。我猜想在某些优化设置下,编译器可能更喜欢到处发出 RET 而不是 JMP+RET
-
@user1983710 我之前的例子是完全错误的。我对其进行了重新设计,CALL 和 RET 之间的差异很大,CALL 比 RET 多(在 Windows 上的简单控制台程序上测试,即
ipconfig.exe):CALL: 176298,RET: 170374。我仍在试图找出原因(尽管它可能与系统内部有关)。我会尝试构建一个 pintool 来记录可能不匹配的 CALL/RET 对。你有我的 +1!
标签: c++ x86 x86-64 instructions intel-pin