Teknik detaylar
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
Bu belirtinin tek başına yürütülebilir dosyaların görüntü tabanları, Cygwin'in paylaşılan bellek bölümleri, çakışan DLL sürümleri vb.
Görünüşe göre orada sadece ~ 2.5 MB büyüklüğünde bir delik mevcut iken, Cygwin kodu bu sabit adres 0x68570000'de yığınına ~ 5 MB büyük bir bellek ayıramıyor. İlgili kod msysgit kaynağında görülebilir .
Adres alanının bu kısmı neden ücretsiz değil?
Bunun birçok nedeni olabilir. Benim durumumda, çakışan bir adrese yüklenen diğer bazı modüllerdi:
Son adres 0x68570000 + 5 MB = 0x68C50000 civarında olacaktır, ancak 0x68810000'den yüklenen ve ayırmayı engelleyen WOW64 ile ilişkili bu DLL'ler vardır.
Paylaşılan bir DLL olduğunda, genel olarak Windows bazı yer değiştirme işlemlerini kaydetmek için tüm işlemleri aynı sanal adrese yüklemeye çalışır. Bu sistem bileşenlerinin bu kez çakışan bir adrese bir şekilde yüklenmesi sadece kötü bir şans meselesi .
Git'inizde neden Cygwin var?
Git, bazı düşük seviyeli komutlardan ve birçok yardımcı programdan oluşan ve çoğunlukla Unix benzeri sistemlerde geliştirilen zengin bir pakettir. Büyük bir yeniden yazma olmadan onu oluşturabilmek ve çalıştırabilmek için en azından kısmi Unix benzeri bir ortama ihtiyacı var.
Bunu başarmak için, insanlar Minix ve MSYS'yi icat ettiler - Windows'da Unix benzeri bir şekilde programlar geliştirmek için minimal bir yapı araçları seti. MSYS ayrıca, msys-1.0.dll
çalışma zamanı sırasında iki platform arasındaki uyumluluk sorunlarından bazılarına yardımcı olan paylaşılan bir kütüphane içerir . Ve bunun birçok bölümü Cygwin'den alındı, çünkü birisi zaten aynı sorunları orada çözmek zorunda kaldı.
Yani Cygwin değil, burada garip davranan MinGW'nin çalışma zamanı DLL'si.
Cygwin'de, bu kod MSYS 1.0'da olandan beri çok değişti - bu dosyanın son teslim mesajı 2001'den olan "Import Cygwin 1.3.4" diyor!
Hem mevcut Cygwin hem de MSYS'nin yeni sürümü - MSYS2 - halihazırda farklı mantığa sahiptir, bu da umarım daha sağlamdır. Windows için Git'in yalnızca eski kırık MSYS sistemi kullanılarak inşa edilmiş olan eski sürümleri.
Temiz çözümler:
- Git for Windows 2'yi yükleyin - yeni, uygun şekilde bakımı yapılan MSYS2 ile üretilmiştir ve ayrıca birçok yeni özellik, birçok hata düzeltmesi, güvenlik iyileştirmesi vb. Mümkünse 64 bit sürümünün kullanılması önerilir . Ancak rebase geçici çözümü , 32 bit sistemler için perde arkasında otomatik olarak gerçekleştirilir, bu nedenle sorunun oluşma olasılığı da daha düşük olmalıdır.
- Adres alanını temizlemek için bilgisayarı yeniden başlatmak (bu modülleri farklı bir rastgele adrese yüklemek) işe yarayabilir, ancak gerçekten, başka bir şey yoksa güvenlik düzeltmelerini almak için Windows 2 için Git'e yükseltin.
Hacky çözümleri:
- Değişiklik
PATH
bazen işe yarayabilir, çünkü msys-1.0.dll
Git'in farklı sürümlerinde veya diğer MSYS tabanlı uygulamalarda farklı adresler olabilir, bu da belki farklı adres, bu yığının farklı boyutu vb.
- Yeniden dağıtım
msys-1.0.dll
zaman kaybı olabilir, çünkü 1) bir DLL olması, zaten yer değiştirme bilgileri ve 2) "Windows işletim sisteminin herhangi bir sürümünde bir (...) DLL dosyasının her zaman aynı adres alanına yükleneceğinin garantisi yoktur" neyse ( kaynak ). Bunun yardımcı olabilmesinin tek yolu, msys-1.0.dll
kendisi daha sonra kullanmaya çalıştığı çakışan adrese yüklenir. Görünüşe göre bazen durum böyle, çünkü Windows için Git 32 bit sistemlerde otomatik olarak yapıyorlar .
- Yukarıdaki bulgular göz önüne alındığında, ben ikili
msys-1.0.dll
ikili için farklı bir değer kullanmak için ikili yamalı _cygheap_start
ve bu sorunu hemen çözdü.