2016-09-05 90 views
1

我正在執行一些可執行文件及其相關共享庫的一些簡單的檢測任務,記錄主文件中的所有執行指令以及共享庫。針:指定一個指定的共享庫

然而,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

如果在64位內核下運行,IIRC 32位進程可以使用完整的4GiB虛擬地址空間。您可以使用具有32位用戶空間的64位內核。 (具體來說,如果用64位內核替換內核,Ubuntu的32位安裝應該仍然可以啓動,Ubuntu甚至可以打包一個,但我忘記了,32位已經過時了大約10年) –

回答

1

使用IMG_Name獲取文件名稱,因爲pin看到它並將其與感興趣的共享對象進行比較。 InstLib提供了這個插件實現,但它很容易做到你自己。