Я выполняю простую задачу инструментария в исполняемом файле и связанных с ним общих библиотеках, записывая все выполненные инструкции в основном файле, а также совместно используемые библиотеки.Пин: инструмент для указанной общей библиотеки
Однако 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.
Итак, мой вопрос: учитывая мою ситуацию, следует ли настраивать только инструмент моей заинтересованной библиотеки, чтобы преодолеть исключение памяти? Если да, то как я могу это сделать?
32-разрядные процессы IIRC могут использовать полное виртуальное адресное пространство 4GiB при работе под 64-битным ядром. Вы можете использовать 64-битное ядро с 32-разрядным пользовательским пространством. (В частности, 32-разрядная версия Ubuntu должна по-прежнему загружаться, если вы замените ядро на 64-битное ядро. Ubuntu, вероятно, даже упаковывает один, но я забыл. 32-разрядный был устаревшим в течение ~ 10 лет) –