我如何遍历 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。
我尝试在特定例程中迭代一个基本块,但我发现了一些问题:
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。