2016-09-05 14 views
1

Я выполняю простую задачу инструментария в исполняемом файле и связанных с ним общих библиотеках, записывая все выполненные инструкции в основном файле, а также совместно используемые библиотеки.Пин: инструмент для указанной общей библиотеки

Однако Pin всегда бросают

Pin is out of memory: MmapChecked 

В инструментовки. Поскольку я работаю над 32-разрядной системой, каждый раз, когда она достигает около 3 ГБ памяти, процесс аппаратного обеспечения сбой.

Я хотел бы работать над этой 32-разрядной системой, так как на этой платформе имеется довольно много общих библиотек. С другой стороны, потому что на самом деле меня интересует только одна общая библиотека, поэтому я собираюсь найти способ записи только выполненных инструкций в основной исполняемый файл, а также в эту специальную библиотеку.

Однако я понятия не имею, можно ли/как это сделать. Прямо сейчас, прежде чем инструментовки, моя установка:

PIN_LockClient(); 
IMG img = IMG_FindByAddress(INS_Address(ins)); 
PIN_UnlockClient(); 

// if (IMG_Valid(img) && IMG_IsMainExecutable(img)){ 
if (IMG_Valid(img)) {   <--------------------- this line 
    INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)insCallBack, 
        IARG_BOOL, 
        IARG_ADDRINT, INS_Address(ins), 
        IARG_PTR, new string(INS_Disassemble(ins)), 
        IARG_CONTEXT, 
        IARG_ADDRINT, INS_NextAddress(ins), 
        IARG_END); 

} 

Как вы можете видеть, я не проверял ли я инструментирование основного исполняемого файла или нет, что означает, что я должен быть в состоянии инструмента всех библиотек.

Моя тестовая платформа - 32-разрядная x86 Ubuntu 14.04. И целью тестирования является 32-битный двоичный код ELF.

Итак, мой вопрос: учитывая мою ситуацию, следует ли настраивать только инструмент моей заинтересованной библиотеки, чтобы преодолеть исключение памяти? Если да, то как я могу это сделать?

+0

32-разрядные процессы IIRC могут использовать полное виртуальное адресное пространство 4GiB при работе под 64-битным ядром. Вы можете использовать 64-битное ядро ​​с 32-разрядным пользовательским пространством. (В частности, 32-разрядная версия Ubuntu должна по-прежнему загружаться, если вы замените ядро ​​на 64-битное ядро. Ubuntu, вероятно, даже упаковывает один, но я забыл. 32-разрядный был устаревшим в течение ~ 10 лет) –

ответ

1

Используйте IMG_Name, чтобы получить имя файла, поскольку pin видит его и сравнивает его с объектом, представляющим интерес. InstLib обеспечивает внедрение этой функции, но ее легко сделать самостоятельно.

 Смежные вопросы

  • Нет связанных вопросов^_^