如何在intel pintool中的特定例程中迭代基本块?

时间:2015-11-01 14:48:41

标签: intel-pin

我试图在特定例程中迭代基本块,但我发现了一些问题:

VOID Routine(RTN rtn, VOID *v) 
{
  RTN_Open(rtn)
  for (BBL bbl = RTN_BblHead(rtn); BBL_Valid(bbl); bbl = BBL_Next(bbl))
    {  /* some code */ }
  RTN_Close(rtn);
}

错误:不推荐声明,

我如何修复该错误,或​​以其他方式执行此操作?

1 个答案:

答案 0 :(得分:2)

您有一个弃用声明警告,因为现在不推荐使用RTN_BblHead。请改用RTN_InsHead

来自include\pin\gen\image.ph

/* DO NOT EDIT */
/* RTN_BblHead is now deprecated. See RTN_InsHead.
 */
extern PIN_DEPRECATED_API BBL RTN_BblHead(RTN x);

文档中也提到了这一点:RTN_BblHead

您也可以将-Wno-deprecated-declarations传递给GCC以取消此警告。

修改

请记住,PIN首先是一个DBI(动态二进制检测)框架:它在检测执行的代码流时非常好,而在需要分解未执行的代码时则不太好。

常规仪器让Pintool检查并检测整个例程,当它包含在图像中时,首先加载'但正如文件所指出的那样:

  

Pintool可以按照例程的指示行事。这是不够的   可用于将指令分解为BBL的信息。

Pin通过静态发现找到RTN的指令,因此Pin无法保证它会在RTN中找到所有指令,这对于BBL来说更加困难。我的猜测是他们在某个时候尝试(因此过去有RTN_BblHead的可用性)来提供BBL的静态发现,但是发现率太低(或太容易出错)被认为是可接受的,因此该功能被弃用了。 / p>

简而言之,是的,您需要通过指令发现RTN指令(知道引脚可能会错过某些指令,因为这是静态完成的)。如果例程在某个时刻执行,则只能发现例程的BBL。