मैं एक प्रक्रिया पर एक हेइसेनबग को वालग्रीड करने की कोशिश कर रहा हूं जो 32 जीबी से अधिक RAM का उपयोग करता है और इस वाल्ग्रिंड सीमा को मारता है, क्या यह एक मनमाना है जिसे वाल्ग्रिंड को दोबारा जोड़कर बचाया जा सकता है या यह मुश्किल है?64 बिट आर्किटेक्चर पर 32 जीबी तक सीमित क्यों है?
उत्तर
सीमा मनमानी है और इसे वालग्रिंड को पुन: संकलित करके बदला जा सकता है।
वालग्रिंड 2-स्तरीय स्पैस सरणी का उपयोग करके स्मृति का ट्रैक रखता है। पते के 16 बिट्स को 65536-एंट्री टेबल में इंडेक्स करने के लिए उपयोग किया जाता है जिसमें एक दूसरे-स्तरीय मानचित्र पर पॉइंटर होता है, जो पता स्थान की एक श्रृंखला को ट्रैक करता है (आमतौर पर 32-बिट प्रक्रियाओं के लिए 2¹⁶ बाइट्स = 64 केबी, 2¹⁹ बाइट्स = 512 केबी 64-बिट प्रक्रियाएं)। तो इस 2-स्तरीय स्पैस सरणी द्वारा ट्रैक की जा सकने वाली स्मृति की कुल मात्रा 65536 × इस खंड आकार है। कोड को संशोधित करके, अधिकांश हिस्सों को ट्रैक करने के लिए अधिक स्मृति का उपयोग करने की लागत पर, इन हिस्सों का आकार 2 की बड़ी शक्ति में बढ़ाया जा सकता है।
this message valgrind उपयोगकर्ताओं की मेलिंग सूची पर, जूलियन Seward बताते हैं कि कैसे 128GB के लिए 32GB से सीमा बढ़ाने के लिए: 21
बदलने के लिए 19
से memcheck/mc_main.c
परिवर्तन N_PRIMARY_BITS
में
memcheck/mc_main.c
के अंत में दावा:
MAX_PRIMARY_ADDRESS
→ 4 * (मौजूदा मूल्य + 1) - 1MASK(1/2/4/8)
दावे के लिए- , अग्रणी 1 बिट्स के ब्लॉक में सबसे दायीं ओर दो '1' बिट शून्य पर सेट है, जैसे
MASK(8)
→0xFFFFFFE000000007ULL
मुझे लगता है कि
coregrind/m_aspacemgr/aspacemgr-linux.c
(Addr)0x800000000 - 1
(Addr)0x2000000000ULL - 1
करने से परिवर्तनaspacem_maxAddr
में।
अद्यतन: स्मृति की अधिकतम राशि है कि वेलग्रिंड उपयोग हाल के संस्करणों में बढ़ गया है सकते हैं:
- 32 जीबी पहले वेलग्रिंड को 3.9
- 64 जीबी में Valgrind 3.9 से 3.12
- Valgind में 128 जीबी 3.13
ग्रेट उत्तर, धन्यवाद – piotr