英特尔引脚:如何生成对象转储ish代码
Intel Pin: How to generate objectdump-ish code?
我正在试用intel pin工具。我有一个简单的Hello-world.c
(它只打印"你好世界")程序(比如a.out
)。如果我想从二进制文件生成程序集,我会执行objdump -D a.out
。
我想在其中插入一些说明。
是否可以在检测之前和之后使用pin工具获取objdump?
我创建了一个打印所有说明的工具。
#include <stdio.h>
#include "pin.H"
#include <cstdint>
FILE * trace;
KNOB<string> KnobOutputFile(KNOB_MODE_WRITEONCE, "pintool", "o", "pinatrace.out","A pin tool");
VOID Count(INS ins, void *v) {
fprintf(trace,"n%s",(INS_Disassemble(ins)).c_str());
}
VOID Fini(INT32 code, VOID *v)
{
printf("count = %ldn",(long)icount);
fprintf(trace, "#eofn");
fclose(trace);
}
/* ===================================================================== */
/* Print Help Message */
/* ===================================================================== */
INT32 Usage()
{
PIN_ERROR( "This Pintool prints a trace of memory addressesn"
+ KNOB_BASE::StringKnobSummary() + "n");
return -1;
}
/* ===================================================================== */
/* Main */
/* ===================================================================== */
int main(int argc, char *argv[])
{
if (PIN_Init(argc, argv)) return Usage();
trace = fopen("pinatrace.out", "w");
INS_AddInstrumentFunction(Count, 0);
PIN_AddFiniFunction(Fini, 0);
// Never returns
PIN_StartProgram();
return 0;
}
它打印汇编指令,但我不确定它是否包括插入指令。
这样做正确吗?你能帮帮我吗?
在插入之前和之后,是否可以使用pin工具获取objdump?
您需要一种方法来告诉PIN引擎您希望如何处理objdump的结果。例如,您可能希望通过脚本将两者链接起来。这完全取决于你想做什么。
这样做正确吗?
这取决于你到底想做什么,但我想不是。
PIN中的检测和分析之间有明显区别。一旦你理解了它,剩下的就(相对)容易了。
从概念上讲,PIN仪器由两个组件组成:
- 一种决定代码插入位置和内容的机制:插入
- 要在插入点执行的代码:分析
也就是说,还有一点更重要:
- 检测只运行一次:当第一次发现指令(或BBL或TRACE)时
- 每当执行指令(或BBL、TRACE)时,都会运行分析
所以当你有:
// set up the **instrumentation**
INS_AddInstrumentFunction(Func_Instrumentation, 0);
您正在设置检测(然后只调用一次)。如果每次执行指令(或BBL、TRACE)时都需要调用回调,则需要设置一个分析例程,例如:
// this is the **analysis** routine.
// This function is called before every instruction is executed
VOID docount() { icount++; }
// The is the **instrumentation routine**, called by INS_AddInstrumentFunction().
// Pin calls this function each time a **new** instruction is encountered
// Note that is won't be called for the same instruction after the first time.
VOID Func_Instrumentation(INS ins, VOID *v)
{
// Insert a call to docount before every instruction, no arguments are passed
INS_InsertCall(
ins, // a representation of the instruction
IPOINT_BEFORE, // where to insert, relative to the instruction
(AFUNPTR)docount, // the analysis routine
IARG_END); // no args to pass to the analysis routine
}
仔细检查可用的指令计数样本:
- 在
source/tools/ManualExamples/inscount0.cpp
中 - 在PIN手册中
相关文章:
- 分段故障(堆芯转储)矢量
- Cppcheck生成xml转储文件
- 如何找出GDB的SIGTRAP核心转储的根本原因
- C++映射分割错误(核心转储)
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 浮点异常(核心转储)#694457
- 分段错误(核心转储)但无法弄清楚
- 链接到libkcapi时没有核心转储
- 检测到堆栈粉碎:已终止 中止(核心已转储)
- 正在处理故障(堆芯转储)
- 分段错误(核心转储) - 使用 SavedModel 的 Tensorflow C++ API 进行推断
- 我不知道为什么这段代码会让核心被转储?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- C++指针无法在函数外部传递值和分段错误(核心转储)错误
- cygwin_exception::open_stackdumpfile:将堆栈跟踪转储到 class4.exe.sta
- C++快速将 int 数组内容转储到文本文件中
- 合并排序:分段错误核心转储
- 英特尔引脚:如何生成对象转储ish代码