我如何遍历 intel pintool 中特定例程中的基本块?

How can i iterate over a basic blocks in a specific routine in intel pintool?

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

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);
}

错误:弃用声明,

我该如何修复该错误,或​​通过其他方式修复?

你有一个 deprecated-declarations 警告,因为 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 在首次加载包含它的图像时检查和检测整个例程',但正如文档所指出的那样:

A Pintool can walk the instructions of a routine. There is not enough information available to break the instructions into BBLs.

Pin是通过静态发现的方式找到一个RTN的指令,所以Pin不能保证一定能找到RTN中的所有指令,这对BBL来说就更难了。我的猜测是他们在某些时候尝试过(因此过去 RTN_BblHead 的可用性)提供 BBL 的静态发现,但发现率太低(或太容易出错)被认为是可以接受的,所以功能已弃用。

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