Rincian teknis
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
Gejala ini dengan sendirinya tidak ada hubungannya dengan basis gambar executable, rusak bagian memori bersama Cygwin, versi DLL yang saling bertentangan dll.
Itu kode Cygwin gagal mengalokasikan ~ 5 MB besar memori untuk tumpukan di alamat tetap ini 0x68570000, sementara hanya lubang ~ 2,5 MB besar tampaknya tersedia di sana. Kode yang relevan dapat dilihat di sumber msysgit .
Mengapa bagian ruang alamat itu tidak gratis?
Mungkin ada banyak alasan. Dalam kasus saya itu adalah beberapa modul lain dimuat di alamat yang saling bertentangan:
Alamat terakhir adalah sekitar 0x68570000 + 5 MB = 0x68C50000, tetapi ada DLL terkait WOW64 yang dimuat dari 0x68810000 ke atas, yang memblokir alokasi.
Setiap kali ada beberapa DLL bersama, Windows secara umum mencoba memuatnya di alamat virtual yang sama di semua proses untuk menyimpan beberapa pemrosesan relokasi. Ini hanya masalah nasib buruk bahwa komponen sistem ini entah bagaimana dimuat pada alamat yang saling bertentangan kali ini .
Mengapa ada Cygwin di Git Anda?
Karena Git adalah rangkaian kaya yang terdiri dari beberapa perintah tingkat rendah dan banyak utilitas bermanfaat, dan sebagian besar dikembangkan pada sistem mirip Unix. Untuk dapat membangun dan menjalankannya tanpa penulisan ulang besar-besaran, diperlukan setidaknya sebagian seperti lingkungan Unix.
Untuk mencapai itu, orang-orang telah menemukan MinGW dan MSYS - satu set minimal alat membangun untuk mengembangkan program pada Windows dengan cara seperti Unix. MSYS juga berisi pustaka bersama, ini msys-1.0.dll
, yang membantu dengan beberapa masalah kompatibilitas antara kedua platform selama runtime. Dan banyak bagian yang telah diambil dari Cygwin, karena seseorang sudah harus menyelesaikan masalah yang sama di sana.
Jadi bukan Cygwin, itu DLL runtime MinGW yang berperilaku aneh di sini.
Di Cygwin, kode ini sebenarnya telah banyak berubah sejak apa yang ada di MSYS 1.0 - pesan komit terakhir untuk file itu mengatakan "Impor Cygwin 1.3.4", yang berasal dari tahun 2001!
Baik Cygwin saat ini dan versi baru MSYS - MSYS2 - sudah memiliki logika yang berbeda, yang diharapkan lebih kuat. Ini hanya versi lama dari Git untuk Windows yang masih dibangun menggunakan sistem MSYS lama yang rusak.
Solusi bersih:
- Instal Git untuk Windows 2 - dibangun dengan MSYS2 yang baru dan dirawat dengan baik dan juga memiliki banyak fitur baru, banyak perbaikan bug, peningkatan keamanan, dan sebagainya. Jika memungkinkan, disarankan untuk menggunakan versi 64-bit . Tetapi solusi rebase dilakukan secara otomatis di belakang layar untuk sistem 32-bit, sehingga kemungkinan masalah yang terjadi di sana harus lebih rendah juga.
- Cukup me-restart komputer untuk membersihkan ruang alamat (memuat modul-modul ini pada alamat acak yang berbeda) mungkin berhasil, tetapi sungguh, tingkatkan saja ke Git untuk Windows 2 untuk mendapatkan perbaikan keamanan jika tidak ada yang lain.
Solusi peretasan:
- Mengganti
PATH
kadang-kadang bisa berfungsi karena mungkin ada versi berbeda msys-1.0.dll
di versi Git yang berbeda atau aplikasi berbasis MSYS lainnya, yang mungkin menggunakan alamat yang berbeda, ukuran tumpukan yang berbeda, dll.
- Rebasing
msys-1.0.dll
mungkin buang-buang waktu, karena 1) menjadi DLL, sudah memiliki informasi relokasi dan 2) "dalam versi Windows OS tidak ada jaminan bahwa (...) DLL akan selalu memuat pada ruang alamat yang sama" lagi pula ( sumber ). Satu-satunya cara ini dapat membantu adalah jika msys-1.0.dll
dirinya sendiri memuat pada alamat yang saling bertentangan yang kemudian ia coba gunakan. Kadang-kadang itulah yang terjadi, karena inilah yang dilakukan Git untuk Windows secara otomatis pada sistem 32-bit .
- Mempertimbangkan temuan di atas, saya semula biner menambal
msys-1.0.dll
biner untuk menggunakan nilai yang berbeda untuk _cygheap_start
dan yang segera menyelesaikan masalah.