使用Pin工具打印每个指令的程序和功能名称

时间:2019-02-03 02:31:37

标签: c++ c++11 intel-pin

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

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

我可以获取地址和反汇编的指令,但不能获取程序和函数的名称。

谁能给我建议这是否可能,如何?

谢谢!

2 个答案:

答案 0 :(得分:1)

程序名称

要获取主二进制文件的完整路径(因此为程序名),必须使用IMG_AddInstrumentFunctionmain()中为IMG(图像)设置检测例程。

在分析回调(传递给IMG_AddInstrumentFunction中)中使用IMG_IsMainExecutable函数,该函数仅返回一个布尔值,指示当前加载的图像是否是主二进制文件(true)。< / p>

如果前一个函数(IMG_IsMainExecutable)返回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)的手册,该示例应该为您如何使用这些功能提供一个良好的开端。

注意:目标可执行文件听起来很明显,但必须具有符号信息(符号):No symbols == no routine names

答案 1 :(得分:0)

可以使用standard predefined macros用于打印出的程序和函数名。

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