Я использую инструмент Intel Pin
для инструментирования многопоточного процесса и мониторинга доступа к общей памяти между потоками в Linux, я разрабатываю инструмент в Pin
для записи адреса общей памяти, код инструментирования в Pin выглядит следующим образом:
VOID Instruction(INS ins, VOID *v)
{
UINT32 memOperands = INS_MemoryOperandCount(ins);
// Iterate over each memory operand of the instruction.
for (UINT32 memOp = 0; memOp < memOperands; memOp++)
{
if (INS_MemoryOperandIsRead(ins, memOp))
{
INS_InsertPredicatedCall(
ins, IPOINT_BEFORE, (AFUNPTR)RecordMemRead,
IARG_INST_PTR,
IARG_MEMORYOP_EA, memOp,
IARG_END);
}
// Note that in some architectures a single memory operand can be
// both read and written (for instance incl (%eax) on IA-32)
// In that case we instrument it once for read and once for write.
if (INS_MemoryOperandIsWritten(ins, memOp))
{
INS_InsertPredicatedCall(
ins, IPOINT_BEFORE, (AFUNPTR)RecordMemWrite,
IARG_INST_PTR,
IARG_MEMORYOP_EA, memOp,
IARG_END);
}
}
}
функция RecordMemRead
и RecordMemWrite
используется для записи информации о потоке и адреса памяти при чтении или записи памяти, и я использую блокировку в этой функции.
Я хочу записать адрес памяти, разделяемый между потоками, такой как глобальные переменные или куча memory.
Но когда я использую простую многопоточную программу для тестирования своего инструмента. Тест выглядит следующим образом. В этой программе пользователь не определил ни общую переменную, ни общую память:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
void * fun1(void *arg)
{
}
int main(int argc,char* argv[])
{
pthread_t npid1;
pthread_create(&npid1,NULL,fun1,NULL);
pthread_join(npid1,NULL);
return 0;
}
и результат указывает на память, к которой осуществляется доступ с помощью многопоточности, и выводит отладочную информацию инструкции доступа к памяти в следующей строке:
read addr: b775252c
line:0 col: 0 file:
write addr: b775252c
line:0 col: 0 file:
write addr: b775252c
line:0 col: 0 file:
write addr: b775252c
line:0 col: 0 file:
write addr: b775252c
line:0 col: 0 file:
write addr: b775252c
line:0 col: 0 file:
write addr: b775252c
line:0 col: 0 file:
read addr: b556ad64
line:0 col: 0 file:
read addr: b556abc4
line:0 col: 0 file:
write addr: b556abc4
line:0 col: 0 file:
Результат указывает на то, что оба потока имеют некоторый доступ к памяти, а инструкция чтения/записи не имеет отладочной информации (у меня есть опция добавления -g в компиляции). Так что, возможно, к этой памяти обращается библиотека
Q1: что нить делать с этой памятью?
Q2: Если я просто хочу отслеживать память, определенную пользователем, а не определенную в библиотеке, как их отличить?
pthread_join()
- person marko   schedule 27.11.2015