Pin中有四个粒度级别:例程、指令和图像、跟踪。我可以指定一个限制/区域来开始和停止插入检测代码。可以通过类似指令(#start instrumentation,#end instrumentation)或类似的东西,
一个例子:
for( int i=0; i< x; i++)
{
#startInstrumentation
for( ....;.....;.....)
{
// some code
// function call, conditions , loops, ....
}
#endInstrumentation
}
有没有办法做到这一点?
您可以使用基于跟踪的检测来执行您想要的操作。在每个跟踪的开始,检查它的起始地址,如果它不在感兴趣的范围内,避免添加分析函数并立即从例程返回。
跟踪可能会从感兴趣区域的外部开始,但在其内部结束,或者相反。如果发生这种情况,您将需要对要检测的内容进行更细粒度的选择。在投入精力之前,我会检查这是否是一个真正的问题。
如果您对检测特定例程或图像感兴趣,请考虑使用套件中 InstLib 中的 filter.cpp。InstLibExamples 中提供了一个使用示例。
现在,至于如何定位这些感兴趣的区域,您有多种选择。如果您无法控制目标二进制文件,您可以在命令行参数中指定区域,作为感兴趣图像的一对偏移量。
如果您可以控制二进制,则可以插入两个符号,指定感兴趣区域的开始和结束,然后使用 SYM 接口迭代图像符号。