使用"英特尔引脚"时跟踪不匹配的CALL和RET指令数
Number of CALL and RET instructions tracking mismatch while using Intel Pin
我正在尝试使用Intel Pintool监视x86-64机器(Mac Pro)上的CALL
和RET
指令。我将IARG_INST_PTR
(如下所述)传递给docount
函数,并使用指令指针通过检查操作码(英特尔x86-64手册中的CALL
是0xe8,RET
是0xc3)来推断指令。然而,这种检查似乎并不完全准确,因为我注意到,对于任何装有此逻辑的给定二进制文件,RET
的数量都比CALL
多。
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_CONTEXT,
IARG_INST_PTR, IARG_END);
有人能告诉我我做错了什么吗?
我从/tools/ManualExamples/inscount0.cpp
那里借了这个模板。要找到它,请在此处搜索文件名。
调用和ret指令之间并不总是匹配的,因为函数可能会被异常、类似goto的语句、长跳转、信号等中断。因此,如果您想重新协调调用和ret,您可能需要考虑所有这些。
这已经讨论了好几次了,尤其是
有各种版本的CALL
具有不同的操作码,因此您不能只检查0xE8
。完整列表可在英特尔手册调用过程部分找到:
操作码指令说明E8 cwCALL rel16调用相对于下一条指令的近、相对、位移E8 cd调用相对下一条命令的近、相对于、位移在64位模式下扩展到64位的32位位移符号。FF/2CALL r/m16调用r/m16中给定的近距离、绝对间接地址。FF/2CALL r/m32调用r/m32中给定的远距离、绝对直接地址9A cpCALL ptr16:32调用操作数中给定的远绝对地址FF/3CALL m16:16调用m16:16中给定的远绝对间接地址。在32位模式下:如果选择器指向一个门,则RIP=从门获取的32位零扩展位移;其他的RIP=从远指针开始的零扩展16位偏移在说明书中引用FF/3调用m16:32在64位模式中:如果选择器指向一个门,则RIP=取自闸门的64位位移;其他的RIP=从远指针开始的零扩展32位偏移在说明书中引用REX。W FF/3调用m16:64在64位模式中:如果选择器指向一个门,则RIP=取自闸门的64位位移;其他的RIP=距远指针的64位偏移在说明书中引用
与RET
相同
Opcode*指令说明C3RET接近返回调用过程CBRET远返回调用过程C2 iwRET imm16接近返回调用过程并从堆栈中弹出imm16字节CA iwRET imm16远返回调用过程并从堆栈中弹出imm16字节
注意,上面包含相同操作码的行仅用于不同的模式(16/32/64位)
相关文章:
- "error: no matching function for call to"构造函数错误
- 调用专用模板时出错"no matching function for call to [...]"
- "no matching function for call to 'Vector::Vector'"错误
- 我在 ifstream input_file(文件名)行中收到错误"no matching function to call";
- 模板规范获取'Ambiguous call to overloaded function'
- 从 TVector2 类派生复杂类:"No matching function for call to Complex::Complex()"
- Incomings Call with Android Sip stack in Embarcadero C++ bui
- 学习 c++,编译错误"no matching function for call"
- 结构错误:"no matching function for call to "
- 创建函数变体向量时"No matching function for call"错误
- C++线程"Call to non-static member function without an object argument"
- 编译时二叉搜索树错误的反向迭代器表示"no matching function call for operator=()"
- 如果子类中没有构造函数方法,则错误"no matching function for call to 'LGame::LGame(String&)'"
- 提升多精度浮点数128:标准::exp错误:'no matching function for call'
- "error: no matching function for call to",我无法更改结构的定义
- 如何修复以下错误"no match for call to '(std::tr1::shared_ptr<_iobuf*>) (FILE*&)'"
- 'char (*RtlpNumberOf(T (&)[N]))[N]':无法从"char *"
- Arduino IDE 错误 - 无法找到数字文字运算符"运算符""f900ff"
- 替换派生对象向量中的对象"no matching function to call"
- ROS CPP 相当于 Python subprocess.call() 和 shell=True