用Pin工具打印每条指令的程序和函数名

Printing program and function name of each instruction with Pin tool

我刚开始编写用于检测程序的 pin 工具。 目前,我有点坚持打印出程序名称(图像?我会说)和指令所属的功能。 比如我我有一个程序foo.cpp和函数名func()那个简单的加法和cout。 然后,当我使用图钉工具时,我想打印如下

0xAddress foo(或 lib64/ld-linux...等)func disassembled_instruction(例如移动等)

我能得到地址和反汇编指令,但不能得到程序和函数名。

谁能告诉我这是否可行以及如何实现?

谢谢!

您可以使用standard predefined macros打印程序和函数名称。

cout << __FILE__ << " " << __FUNCTION__ << endl;

程序名称

要获得主二进制文件的完整路径(因此程序名称),您必须使用 IMG_AddInstrumentFunction.

main() 中为 IMG(图像)设置检测例程

在分析回调(传递给 IMG_AddInstrumentFunction)中使用 IMG_IsMainExecutable 函数,它只是 returns 一个布尔值,指示当前加载的图像是否是主二进制文件(true) 与否。

如果是前一个函数(IMG_IsMainExecutable) returns true 你可以调用IMG_Name得到它的完整路径

有关完整示例,请参阅手册中的 Detecting the Loading and Unloading of Images (Image Instrumentation) 示例。

函数名称

在调用 PIN_StartProgram 之前,在主程序中使用 PIN_InitSymbols

您可以使用 RTN_AddInstrumentFunction 在例程级别进行检测(或从指令、BBL 或 TRACE 中获取例程)。

一旦你有了 RTN(例程),你可以用 RTN_Name 函数得到它的名字。

查看手册中的示例 Procedure Instruction Count (Routine Instrumentation),这应该能让您很好地了解如何使用这些功能。

注意:目标可执行文件必须具有符号信息(symbols):No symbols == no routine names.