तकनीकी जानकारी
0 [main] us 0 init_cheap: VirtualAlloc pointer is null, Win32 error 487
AllocationBase 0x0, BaseAddress 0x68570000, RegionSize 0x2A0000, State 0x10000
PortableGit\bin\bash.exe: *** Couldn't reserve space for cygwin's heap, Win32 error 0
इस लक्षण का अपने आप में निष्पादकों की छवि के ठिकानों से कोई लेना-देना नहीं है, दूषित सिग्विन के साझा मेमोरी सेक्शन, डीएलएस के परस्पर विरोधी संस्करण आदि।
यह सिग्विन कोड इस निश्चित पते 0x68570000 पर अपने ढेर के लिए स्मृति का ~ 5 एमबी बड़ा हिस्सा आवंटित करने में विफल रहा है, जबकि केवल एक छेद ~ 2.5 एमबी बड़ा स्पष्ट रूप से वहां उपलब्ध था। संबंधित कोड msysgit स्रोत में देखा जा सकता है ।
पता स्थान का वह हिस्सा मुक्त क्यों नहीं है?
इसके कई कारण हो सकते हैं। मेरे मामले में यह एक परस्पर विरोधी पते पर लोड किए गए कुछ अन्य मॉड्यूल थे:
अंतिम पता लगभग 0x68570000 + 5 MB = 0x68C50000 होगा, लेकिन ये WOW64- संबंधित DLL 0x68810000 से ऊपर से लोड किए गए हैं, जो आवंटन को रोकते हैं।
जब भी कुछ साझा DLL होता है, तो विंडोज सामान्य रूप से कुछ स्थानांतरण प्रसंस्करण को बचाने के लिए सभी प्रक्रियाओं में एक ही आभासी पते पर लोड करने की कोशिश करता है। यह दुर्भाग्य की बात है कि इन सिस्टम घटकों को इस बार किसी परस्पर विरोधी पते पर लोड किया गया ।
आपके Git में Cygwin क्यों है?
क्योंकि Git एक अमीर सुइट है जिसमें कुछ निम्न स्तर के कमांड और बहुत सारी उपयोगी उपयोगिताएँ होती हैं, और ज्यादातर यूनिक्स जैसी प्रणालियों पर विकसित की जाती हैं। बड़े पैमाने पर पुनर्लेखन के बिना इसे बनाने और इसे चलाने में सक्षम होने के लिए, इसे कम से कम एक आंशिक यूनिक्स जैसा वातावरण चाहिए।
इसे पूरा करने के लिए, लोगों ने MinGW और MSYS का आविष्कार किया है - एक यूनिक्स जैसे फैशन में विंडोज पर प्रोग्राम विकसित करने के लिए बिल्ड टूल्स का एक न्यूनतम सेट। MSYS में एक साझा लाइब्रेरी भी शामिल है msys-1.0.dll
, जो रनटाइम के दौरान दो प्लेटफार्मों के बीच संगतता मुद्दों में से कुछ के साथ मदद करता है। और उस के कई हिस्सों को सिग्विन से लिया गया है, क्योंकि किसी को पहले से ही वहां की समस्याओं को हल करना था।
तो यह साइगविन नहीं है, यह मिनगॉ का रनटाइम डीएलएल है जो यहां अजीब व्यवहार कर रहा है।
साइग्विन में, यह कोड वास्तव में बहुत बदल गया है क्योंकि MSYS 1.0 में क्या है - उस फ़ाइल के लिए अंतिम प्रतिबद्ध संदेश "आयात Cygwin 1.3.4" कहता है, जो 2001 से है!
दोनों वर्तमान Cygwin और MSYS का नया संस्करण - MSYS2 - पहले से ही जगह में अलग तर्क है, जो उम्मीद है कि और अधिक मजबूत है। यह विंडोज के लिए Git के पुराने संस्करण हैं जो अभी भी पुराने टूटे MSYS सिस्टम का उपयोग करके बनाए गए हैं।
स्वच्छ समाधान:
- विंडोज 2 के लिए Git इंस्टॉल करें - यह नए, ठीक से बनाए रखा MSYS2 के साथ बनाया गया है और इसमें कई नए फीचर्स, बहुत सारे बग फिक्स, सुरक्षा सुधार आदि शामिल हैं। यदि संभव हो, तो 64-बिट संस्करण का उपयोग करने की भी सिफारिश की जाती है । लेकिन 32-बिट सिस्टम के लिए पर्दे के पीछे रिबेट वर्कअराउंड स्वचालित रूप से किया जाता है, इसलिए वहां होने वाली समस्या की संभावना भी कम होनी चाहिए।
- बस पता स्थान को साफ करने के लिए कंप्यूटर को पुनरारंभ करना (इन मॉड्यूल को एक अलग यादृच्छिक पते पर लोड करना) काम कर सकता है, लेकिन वास्तव में, सुरक्षा फ़िक्स पाने के लिए विंडोज 2 के लिए गिट में अपग्रेड करें यदि कुछ और नहीं।
हैकी समाधान:
- परिवर्तन
PATH
कभी-कभी काम कर सकता है क्योंकि msys-1.0.dll
Git या अन्य MSYS- आधारित अनुप्रयोगों के विभिन्न संस्करणों के अलग-अलग संस्करण हो सकते हैं , जो शायद अलग पते, इस ढेर के विभिन्न आकार आदि का उपयोग करते हैं।
- रिबासिंग
msys-1.0.dll
समय की बर्बादी हो सकती है, क्योंकि 1) एक डीएलएल होने के नाते, इसकी पहले से ही स्थानांतरण जानकारी है और 2) "विंडोज ओएस के किसी भी संस्करण में कोई गारंटी नहीं है कि (...) डीएलएल हमेशा एक ही पते के स्थान पर लोड होगा" वैसे भी ( स्रोत )। एकमात्र तरीका यह मदद कर सकता है यदि वह msys-1.0.dll
स्वयं उस परस्पर विरोधी पते पर लोड करता है जिसे वह उपयोग करने की कोशिश कर रहा है। जाहिरा तौर पर यह कभी-कभी ऐसा होता है, क्योंकि यह 32-बिट सिस्टम पर विंडोज लोगों के लिए Git स्वचालित रूप से कर रहा है ।
- उपरोक्त निष्कर्षों को ध्यान में रखते हुए, मैंने मूल रूप से
msys-1.0.dll
बाइनरी को एक अलग मूल्य का उपयोग करने के लिए बाइनरी पैच किया _cygheap_start
और इससे समस्या का तुरंत हल हो गया।