我試圖valgrind一個使用超過32 Gb的內存並觸及此valgrind限制的進程的heisenbug,這是一個可以通過重新編譯valgrind避免的任意一個,或者它是一個很難的嗎?爲什麼valgrind在64位架構上僅限於32 Gb?
9
A
回答
12
該限制是任意的,可以通過重新編譯valgrind來改變。
Valgrind使用2級稀疏數組跟蹤內存。地址的16位用於索引65536條目表,其中包含指向第二級映射的指針,該指針跟蹤地址空間的範圍(對於32位處理,通常2 16字節= 64KB,對於32字節= 512KB 64位進程)。所以這個2級稀疏數組可以跟蹤的內存總量是65536×這個塊大小。通過修改代碼,可以將這些塊的大小增加到2的較大冪,這是以使用更多內存來跟蹤大部分塊爲代價的。
在this message在Valgrind的用戶郵件列表,朱利安·蘇厄德介紹瞭如何增加從32GB到128GB的限制:從19
在
memcheck/mc_main.c
變化N_PRIMARY_BITS
到21
變化在
memcheck/mc_main.c
結束處的斷言相應地:
MAX_PRIMARY_ADDRESS
→4 *(現有值+1) - 1- 爲
MASK(1/2/4/8)
斷言,設置爲零的最右邊的2 '1' 位在前導1個比特的塊,例如MASK(8)
→0xFFFFFFE000000007ULL
我認爲在
coregrind/m_aspacemgr/aspacemgr-linux.c
變化aspacem_maxAddr
從(Addr)0x800000000 - 1
到(Addr)0x2000000000ULL - 1
。
更新: 該Valgrind的可以在最新版本的使用已經增加的存儲器的最大量:
- 32 GB之前Valgrind的3.9
- 64 GB在Valgrind 3.9至3.12
- 128 GB Valgrind 3.13
相關問題
- 1. 上32位和64位架構尋址
- 2. 在64位OSX上構建32位libcurl
- 3. 什麼類型的內存在32位Windows上有2 GB限制?
- 4. 爲32位和64位構建文件
- 5. 在64位CentOS上爲ARM構建32位二進制文件
- 6. Microsoft建議在64位計算機上安裝32位IIS 7 AppPools。爲什麼?
- 7. 爲什麼__sync_add_and_fetch適用於32位系統上的64位變量?
- 8. .NET在32位或64位系統上有什麼區別?
- 9. 在scons中檢測CPU架構(32位/ 64位)
- 10. 什麼是適合32位和64位「32位」的術語
- 11. 需要幫助在Windows上構建Skia(僅限32位)
- 12. 爲什麼依賴walker將32位dll顯示爲64位?
- 13. 從32位變爲64位
- 14. 在32位架構上安裝RethinkDB
- 15. 當32位Linux在64位英特爾架構上運行時,使用什麼類型的尋呼?
- 16. 用於32位python(3.6)的32位pyodbc適用於Microsoft的64位odbc驅動程序。爲什麼?
- 17. 爲什麼我的PowerShell主機在64位機器上以32位運行?
- 18. 爲什麼在64位FreeBSD v8.1上運行32位可以執行ELF錯誤?
- 19. 爲什麼32位驅動程序不能在64位上工作
- 20. 爲什麼在64位Ubuntu上不安裝32位.deb軟件包?
- 21. 在64位機器上限制芯片32位
- 22. VS上的UINT64左移(64> shift> 32)位僅移位32位
- 23. 在SharePoint 2007上的64位webpart 32位
- 24. 在64位Linux上編譯32位libGLEW.so
- 25. 在32位或64位matlab上運行?
- 26. 在64位DMD上編譯32位
- 27. 爲什麼64位MSBuild加載32位擴展?
- 28. 爲什麼32位和64位numpy/pandas之間有區別
- 29. 爲什麼使用IIS7.5的Microsoft.Web.Management.dll僅適用於64位進程?
- 30. 使用64位構建32位llvm-gcc
很好的答案,謝謝 – piotr 2011-12-28 10:54:11