Как я могу перебирать базовые блоки в определенной процедуре в 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);
}

ошибка: устаревшие объявления,

Как я могу исправить эту ошибку или сделать это другим способом?


person Mos Moh    schedule 01.11.2015    source источник
comment
Вы уверены, что ваши сбои связаны с этим кодом? Вы пытались запустить инструмент только с этим кодом и по-прежнему видели это предупреждение?   -  person nitzanms    schedule 02.11.2015
comment
Да, пробовал, но без изменений.   -  person Mos Moh    schedule 02.11.2015


Ответы (1)


У вас есть предупреждение об устаревших объявлениях, потому что 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, но скорость обнаружения была слишком низкой (или слишком подверженной ошибкам), чтобы считаться приемлемой, поэтому функция стала устаревшей.

Короче говоря, да, вам нужно найти инструкции RTN по инструкциям (зная, что вывод может пропустить некоторые инструкции, поскольку это делается статически). Вы можете обнаружить только BBL подпрограммы, если подпрограмма выполняется в какой-то момент.

person Neitsa    schedule 02.11.2015
comment
Как я могу найти основные блоки из RTN_InsHead, вы имеете в виду, что я проверяю код операции каждой инструкции в этой процедуре, или есть другие способы сделать это? - person Mos Moh; 02.11.2015
comment
@MosMoh Добавлено пояснение, почему вы не можете пройти через BBL RTN. Вы должны пройти через INS. - person Neitsa; 03.11.2015