c++ - 使用 Intel Pin 时跟踪不匹配的 CALL 和 RET 指令数

标签 c++ x86 x86-64 instructions intel-pin

我正在尝试使用 Intel Pintool 来监控 x86-64 机器 (Mac Pro) 上的 CALLRET 指令。我将 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 指令之间并不总是匹配,因为函数可能会被异常、类似 goto 的语句、longjumps、信号等打断……所以如果你想重新调和 calls 和 ret,你可能想要考虑所有这些。

这个已经讨论过好几次了,尤其是here

关于c++ - 使用 Intel Pin 时跟踪不匹配的 CALL 和 RET 指令数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29712225/

相关文章:

c - 超线程的最佳 gcc 优化开关

c++ - gcc 中的 "Assume"子句

assembly - x86组件: Why Do I Need Stack Frames?

arrays - 如何在 x86 程序集中正确索引数组

assembly - 手工组装 x86 调用指令

arrays - x86-64 汇编中的数组元素比较(AT&T 语法)

c++ - ADD、OR、XOR 来计算索引

c++ - 类型名称后的括号是否与 new 有所不同?

c++ - 逐渐减慢循环?

C++ - 递归函数中的字符串流