รายละเอียดทางเทคนิค
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
อาการนี้ไม่ได้เกี่ยวข้องกับฐานรูปภาพของโปรแกรมปฏิบัติการส่วนหน่วยความจำที่ใช้ร่วมกันของ Cygwin ที่เสียหายรุ่น DLLs ที่ขัดแย้งกันเป็นต้น
มันเป็นรหัส Cygwin ที่ไม่สามารถจัดสรรหน่วยความจำขนาดใหญ่ ~ 5 MB สำหรับกองที่ที่อยู่คงที่นี้ 0x68570000 ในขณะที่มีเพียงหลุมขนาดใหญ่ 2.5 ล้านเท่านั้นที่เห็นได้ชัด รหัสที่เกี่ยวข้องสามารถเห็นได้ในแหล่ง msysgit
ทำไมพื้นที่ส่วนนั้นไม่ว่าง
อาจมีหลายเหตุผล ในกรณีของฉันมันเป็นโมดูลอื่น ๆ โหลดที่อยู่ที่ขัดแย้งกัน:
ที่อยู่สุดท้ายจะอยู่ประมาณ 0x68570000 + 5 MB = 0x68C50000 แต่มี DLLs ที่เกี่ยวข้องกับ WOW64 เหล่านี้โหลดจาก 0x68810000 ขึ้นไปซึ่งบล็อกการจัดสรร
เมื่อใดก็ตามที่มี DLL บางตัวที่ใช้ร่วมกัน Windows โดยทั่วไปจะพยายามโหลดที่อยู่เสมือนเดียวกันในทุกกระบวนการเพื่อบันทึกการประมวลผลการย้ายที่อยู่ใหม่ เป็นเรื่องของโชคร้ายที่องค์ประกอบของระบบเหล่านี้ได้รับการโหลดอย่างใดอย่างหนึ่งในที่อยู่ที่ขัดแย้งกันในครั้งนี้
ทำไม Cygwin ถึงมี Git ของคุณ?
เพราะ Git เป็นชุดสมบูรณ์ประกอบด้วยคำสั่งระดับต่ำและสาธารณูปโภคที่เป็นประโยชน์มากมายและส่วนใหญ่พัฒนาบนระบบที่คล้าย Unix เพื่อให้สามารถสร้างและรันได้โดยไม่ต้องเขียนซ้ำจำนวนมากมันต้องมีสภาพแวดล้อมคล้ายยูนิกซ์อย่างน้อยบางส่วน
เพื่อให้บรรลุผลนั้นผู้คนได้คิดค้น MinGW และ MSYS ซึ่งเป็นชุดเครื่องมือสร้างน้อยที่สุดเพื่อพัฒนาโปรแกรมบน Windows ในรูปแบบ Unix MSYS ยังมีไลบรารีที่แบ่งใช้msys-1.0.dll
ซึ่งจะช่วยแก้ไขปัญหาความเข้ากันได้ระหว่างแพลตฟอร์มทั้งสองระหว่างรันไทม์ และหลาย ๆ ส่วนของสิ่งนั้นถูกนำมาจาก Cygwin เพราะมีบางคนต้องแก้ไขปัญหาเดียวกันที่นั่น
ดังนั้นมันจึงไม่ใช่ Cygwin มันเป็น DLL รันไทม์ของ MinGW ซึ่งมีพฤติกรรมแปลก ๆ
ใน Cygwin รหัสนี้มีการเปลี่ยนแปลงอย่างมากเนื่องจากสิ่งที่อยู่ใน MSYS 1.0 - ข้อความการส่งข้อความสุดท้ายสำหรับไฟล์นั้นระบุว่า "Import Cygwin 1.3.4" ซึ่งมาจาก 2001!
ทั้งCygwin ปัจจุบันและMSYS เวอร์ชันใหม่ - MSYS2 มีตรรกะที่ต่างกันอยู่แล้วซึ่งหวังว่าจะมีประสิทธิภาพมากขึ้น เป็น Git for Windows รุ่นเก่าเท่านั้นที่ยังคงสร้างขึ้นโดยใช้ระบบ MSYS ที่ชำรุด
โซลูชั่นที่สะอาด:
- ติดตั้ง Git สำหรับ Windows 2 - มันถูกสร้างขึ้นด้วยMSYS2 ที่ได้รับการดูแลรักษาใหม่และยังมีคุณสมบัติใหม่มากมายการแก้ไขข้อบกพร่องมากมายการปรับปรุงความปลอดภัยและอื่น ๆ ถ้าเป็นไปได้ก็ยังแนะนำให้ใช้รุ่น 64 บิต แต่การแก้ปัญหาการรีบูตจะดำเนินการโดยอัตโนมัติหลังฉากสำหรับระบบ 32 บิตดังนั้นโอกาสของปัญหาที่เกิดขึ้นที่นั่นก็ควรจะต่ำลงเช่นกัน
- เพียงรีสตาร์ทคอมพิวเตอร์เพื่อล้างพื้นที่ที่อยู่ (โหลดโมดูลเหล่านี้ในที่อยู่แบบสุ่มอื่น) อาจใช้งานได้ แต่จริงๆแล้วเพียงอัปเกรดเป็น Git สำหรับ Windows 2 เพื่อรับการแก้ไขด้านความปลอดภัยหากไม่มีอะไรอื่น
โซลูชันแฮ็ค:
PATH
บางครั้งการเปลี่ยนแปลงสามารถทำงานได้เนื่องจากอาจมีรุ่นที่แตกต่างกันmsys-1.0.dll
ในรุ่นต่าง ๆ ของ Git หรือแอปพลิเคชันที่ใช้ MSYS ซึ่งอาจใช้ที่อยู่ที่แตกต่างกันขนาดแตกต่างกันของฮีปนี้เป็นต้น
- การรีบูต
msys-1.0.dll
อาจเสียเวลาเพราะ 1) เป็น DLL มันมีข้อมูลการย้ายและ 2) "ใน Windows OS ทุกรุ่นไม่มีการรับประกันว่า DLL (... ) จะโหลดในพื้นที่ที่อยู่เดียวกันเสมอ" อย่างไรก็ตาม ( แหล่งที่มา ) วิธีเดียวที่สามารถช่วยได้คือถ้าmsys-1.0.dll
ตัวเองโหลดที่ที่อยู่ที่ขัดแย้งกันจากนั้นพยายามใช้ เห็นได้ชัดว่าเป็นกรณีที่บางครั้งเช่นนี้คือสิ่งที่ Git สำหรับผู้ชายของ Windows กำลังทำโดยอัตโนมัติบนระบบ 32 บิต
- เมื่อพิจารณาถึงสิ่งที่พบข้างต้นฉันดั้งเดิมไบนารีแพทช์
msys-1.0.dll
ไบนารีเพื่อใช้ค่าที่แตกต่างกัน_cygheap_start
และที่แก้ไขปัญหาได้ทันที