2016-09-05 8 views
1

실행 파일 및 관련 공유 라이브러리에 대한 간단한 계측 작업을 수행하면서 공유 라이브러리는 물론 주 파일에 실행 된 모든 명령을 기록합니다.Pin : 지정된 공유 라이브러리를 계측하십시오.

그러나, Pin 항상 계측 동안

Pin is out of memory: MmapChecked 

을 던져. 32 비트 시스템에서 작업 할 때마다 3G 메모리 소비가 발생할 때마다 계측 프로세스가 중단됩니다.

이 플랫폼에는 꽤 많은 공유 라이브러리가 있으므로이 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

IIRC의 32 비트 프로세스는 64 비트 커널에서 실행되는 경우 전체 4GiB의 가상 주소 공간을 사용할 수 있습니다. 32 비트 사용자 공간이있는 64 비트 커널을 사용할 수 있습니다. (특히 커널을 64 비트 커널로 대체하면 우분투의 32 비트 설치가 계속 부팅됩니다. 우분투는 아마 하나까지 패키지하지만, 잊어 버릴 수 있습니다 ~ 32 비트는 약 10 년 동안 사용되지 않았습니다) –

답변

1

IMG_Name을 사용하여 핀이 파일 이름을 확인하고 관심있는 공유 객체와 비교합니다. InstLib은 이것의 드롭 인 구현을 제공하지만, 당신 스스로 쉽게 할 수 있습니다.