Ekstensi Git: Kesalahan Win32 487: Tidak dapat memesan ruang untuk tumpukan cygwin, Kesalahan Win32 0

342

Git Extensions: Semuanya berfungsi dengan baik hingga kemarin.

Tapi tiba-tiba saya mendapatkan kesalahan ini ketika saya mencoba menarik beberapa repositori menggunakan git extensions

C:\Program Files\Git\bin\git.exe pull --progress "origin" 
Done
    0 [main] us 0 init_cheap: VirtualAlloc pointer is null, Win32 error 487
AllocationBase 0x0, BaseAddress 0x68560000, RegionSize 0x390000, State 0x10000
C:\Program Files\Git\bin\sh.exe: *** Couldn't reserve space for cygwin's heap, Win32 error 0

Ini terjadi untuk semua repositori yang telah saya kloning. Tapi, git bash saya berfungsi dengan baik. Saya tidak tahu apa yang sedang terjadi. Adakah yang tahu mengapa ini terjadi?

Uchia Itachi
sumber
5
Cygwin aneh dan menggunakan bagian memori bersama yang persisten. Sudahkah Anda mencoba me-reboot sistem Anda?
Greg Hewgill
@GregHewgill: Belum mem-boot ulang sejak beberapa hari. Akan segera melakukannya.
Uchia Itachi
1
@GregHewgill: Berhasil. Terima kasih, mungkin jika Anda mempostingnya sebagai jawaban, itu akan bermanfaat bagi orang lain juga.
Uchia Itachi
Hanya ingin mengatakan bahwa bug ini tidak spesifik untuk git dan pada hari-hari buruk cygwin akan crash pada executable apa pun dengan cara yang sama tanpa alasan yang jelas.
meneldal
1
OP, Anda harus mengubah jawaban yang dipilih ke jawaban @ Yirkha, untuk yang itu memecahkan akar masalah. Mungkin menghemat beberapa upaya sia-sia pada pembaca masa depan (seperti yang terjadi pada saya).
ysap

Jawaban:

230

Cygwin menggunakan bagian memori bersama yang persisten, yang kadang-kadang bisa rusak. Gejala ini adalah bahwa beberapa program Cygwin mulai gagal, tetapi aplikasi lain tidak terpengaruh. Karena bagian memori bersama ini persisten, sering kali sistem reboot diperlukan untuk menghapusnya sebelum masalah dapat diselesaikan.

Greg Hewgill
sumber
Jika itu membantu siapa pun, saya memindahkan bit GitExtensions di PATH saya menjadi item pertama dan tampaknya telah menyelesaikan masalah untuk saya. (Saya menempatkan git / cmd sendiri 2nd - tidak yakin apakah itu bagian dari itu). Sedikit lebih mudah daripada reboot atau .dll menyeret.
jinglesthula
6
Apakah tidak ada yang dapat dieksekusi yang hanya dapat dihentikan untuk membebaskan memori? Reboot sistem lengkap sepertinya berlebihan. Juga, jawaban di bawah ini ( stackoverflow.com/a/31970708/88409 ) menjelaskan apa masalahnya sebenarnya, dan itu tidak ada hubungannya dengan memori yang rusak.
Triynko
379

Saya memiliki masalah yang sama. Saya menemukan solusi di sini http://jakob.engbloms.se/archives/1403

c:\msysgit\bin>rebase.exe -b 0x50000000 msys-1.0.dll

Bagi saya solusinya sedikit berbeda. Dulu

C:\Program Files (x86)\Git\bin>rebase.exe -b 0x50000000 msys-1.0.dll

Sebelum Anda rebase dll, Anda harus memastikan itu tidak digunakan:

tasklist /m msys-1.0.dll

Dan buat cadangan:

copy msys-1.0.dll msys-1.0.dll.bak

Jika perintah rebase gagal dengan sesuatu seperti:

ReBaseImage (msys-1.0.dll) gagal dengan kesalahan terakhir = 6

Anda harus melakukan langkah-langkah berikut secara berurutan:

  1. Salin dll ke direktori lain
  2. Rebase salinan menggunakan perintah di atas
  3. Ganti dll asli dengan salinannya.

Jika ada masalah jalankan perintah sebagai Administrator

zainengineer
sumber
1
Dalam kasus saya, saya rebase.exe berada di dalam sub-direktori di bawah / mingw sehingga perintah akhirnya adalah: c: / msysgit / mingw / bin / rebase -b 0x50000000 msys-1.0.dll dan saya menjalankannya saat berada di c: / msysgit / direktori bin.
Robert Oschler
8
Saya git kesalahan ini ReBaseImage (msys-1.0.dll) gagal dengan kesalahan terakhir = 6
TheJKFever
17
@TheJKFever Anda perlu menjalankannya di command prompt sebagai Administrator, karena ia akan memodifikasi msys-1.0.dll. Buat cadangan dll terlebih dahulu, salin ke msys-1.0.dll.bak, lalu jalankan perintah sebagai Administrator. Ini berhasil untuk saya.
Nikolaos Georgiou
1
windows 8.1 memberi tahu saya bahwa saya tidak dapat menjalankan executable ini di pc ini ketika saya mencoba untuk melakukan rebase
Jules GM
2
Saya tidak punya rebase.exe di Win10 64 Bit Pro saya, tetapi memanggil berikut ini melakukan trik (VS2010): "C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64 \ editbin.exe "/ REBASE: BASE = 0x50000000 msys-1.0.dll
Paul Bußmann
136

tl; dr: Instal 64-bit Git untuk Windows 2 .


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:

Modul proses dalam Proses explorer

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 PATHkadang-kadang bisa berfungsi karena mungkin ada versi berbeda msys-1.0.dlldi versi Git yang berbeda atau aplikasi berbasis MSYS lainnya, yang mungkin menggunakan alamat yang berbeda, ukuran tumpukan yang berbeda, dll.
  • Rebasing msys-1.0.dllmungkin 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.dlldirinya 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.dllbiner untuk menggunakan nilai yang berbeda untuk _cygheap_startdan yang segera menyelesaikan masalah.
Yirkha
sumber
1
Terima kasih atas komentar Anda yang penasaran! Ternyata telah diperbaiki satu atau lain cara untuk beberapa waktu sekarang dan solusi yang tepat tampaknya menggunakan Git untuk Windows 2 yang dibangun pada MSYS2 (dan dengan demikian kode Cygwin yang lebih baru).
Yirkha
2
Terima kasih, senang tahu. Saya menggunakan versi yang dibundel dengan git-extensions, apa pun itu. Reboot memperbaikinya jadi saya akan mengabaikannya sampai pembaruan berakhir pada saya. :-)
Tim Abell
3
Sempurna, jawaban yang terdokumentasi dengan baik! Dan solusi permanen yang tepat untuk masalah alih-alih jawaban yang saat ini diterima.
Søren Boisen
2
Sedikit lebih detail tentang masalah ini - github.com/git-for-windows/git/wiki/32-bit-issues
Kunal
1
x64 Git untuk windows bekerja untuk saya dan lebih lunak. Terima kasih! Ini telah membuatku gila, terutama bekerja dengan cmder. Saya pada dasarnya menyalin folder x64 Git ke cmder/vendor/git-for-windowsdirektori & mengganti nama folder lama menjadi git-for-windows-x86. Jika Anda membuka cmder/vendor/git-for-windows, Anda akan melihat folder mingw32, yang merupakan petunjuk Anda menggunakan 32bit. Di x64 Git, Anda akan melihat folder mingw64.
cmeza
32

Sangat sederhana solusi rebase:

Buka folder tempat git diinstal, seperti:

C:\Program Files (x86)\Git\bin

Dengan menahan shift dan mengklik kanan di folder, Anda seharusnya dapat membuka command prompt sebagai administrator dari sana (terima kasih kepada https://stackoverflow.com/users/355389/darren-lewis untuk komentar itu),

Lalu lari:

rebase.exe -b 0x50000000 msys-1.0.dll

Ini memperbaikinya bagi saya ketika pendekatan restart tidak berhasil.

Semoga ini bisa membantu.

Tisch
sumber
1
Bekerja untukku. Pastikan Anda menjalankan command prompt sebagai Administrator.
Darren Lewis
Ini juga berfungsi untuk saya, sebagai catatan, saya tidak tahu bagaimana Anda bisa menggeser klik kanan dan memuat cmd.exe sebagai admin, jadi saya meluncurkan cmd.exe klik kanan dari awal pilih mulai sebagai admin, kemudian cd ke direktori, kemudian jalankan perintah. Berhasil!
edencorbin
13

Saya telah melihat pesan kesalahan yang sama setelah memutakhirkan ke git1.8.5.2:

Cukup lakukan pencarian untuk semua yang ada msys-1.0.dlldi C:\drive Anda , dan buat yang digunakan oleh Git menjadi yang utama.

Misalnya, dalam kasus saya, saya hanya mengubah urutan:

C:\prgs\Gow\Gow-0.7.0\bin\msys-1.0.dll
C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\msys-1.0.dll

Dengan membuat jalan Git C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\menjadi yang utama di saya %PATH%, pesan kesalahannya menghilang.

Tidak perlu reboot atau bahkan mengubah sesi DOS.
Setelah %PATH%diperbarui dalam sesi DOS itu, perintah git hanya berfungsi.


Perhatikan bahwa carmbrester dan Sixto Saez keduanya melaporkan di bawah ini (dalam komentar) harus reboot untuk memperbaiki masalah.
Catatan: Pertama, hapus juga msys-1.0.dll, seperti yang ada di%LOCALAPPDATA%

VONC
sumber
1
Saya tidak memiliki msys-1.0.dll di tempat lain di jalur saya, tetapi sepertinya Anda benar pada sesuatu di sana - memindahkan bagian git dari jalur saya lebih tinggi dalam daftar memang memecahkan masalah bagi saya. Terima kasih untuk itu! - sangat lelah me-reboot untuk memperbaikinya.
carmbrester
1
File "msys-1.0.DLL" ekstra saya di C: \ Users \ your login \ AppData \ Local dari aplikasi lain. Menghapus aplikasi itu dan mem - boot ulang memperbaiki masalah untuk saya
Sixto Saez
@SixtoSaez Menarik. Saya telah mengedit jawaban untuk membuat langkah reboot lebih terlihat.
VonC
mungkin mereka yang juga membutuhkan reboot perlu hanya itu (masalah yang berbeda dari pemuatan DLL yang salah)
George Birbilis
7

Jika reboot tidak memperbaiki masalah (seperti yang disarankan oleh jawaban Greg Hegwill) maka periksa PATH Anda untuk instalasi yang bertentangan dari msys-1.0.dll (dan mungkin juga DLL terkait lainnya).

Dalam situasi khusus saya, instalasi MinGW untuk msys memiliki salinan DLL dalam bindirektori ( <MinGW_Install_Path>\msys\1.0\bin), dan terdaftar di PATH. cmdDirektori Git terdaftar di PATH, tetapi bintidak. (Versi msys-1.0.dll Git ada di bindirektori. Rupanya instalasi default MSys-Git tidak menambahkannya binke PATH.)

Perbaikan sementara adalah menambahkan bindirektori Git ke PATH sehingga muncul sebelum jalur MinGW. (Perbaikan yang lebih permanen kemungkinan akan melibatkan memilah konflik jalan antara msys MinGW dan Git dan / atau menghapus instalasi msys duplikat.)

RobertB
sumber
Reboot tidak memperbaikinya untuk saya! Benar-benar ada beberapa entri yang digandakan di jalur. Tks banyak.
Reginaldo Santos
2

Hanya ingin berbagi pengalaman saya di sini. Saya menemukan masalah yang sama saat mengkompilasi silang untuk platform MTK pada mesin Windows 64 bit. MinGW dan MSYS terlibat dalam proses pembangunan dan masalah ini muncul. Saya menyelesaikannya dengan mengubah msys-1.0.dllfile. Baik rebase.exereboot sistem tidak bekerja untuk saya.

Karena tidak ada rebase.exe yang diinstal di komputer saya. Saya menginstal cygwin64 dan menggunakan bagian rebase.exedalamnya:

C:\cygwin64\bin\rebase.exe -b 0x50000000 msys-1.0.dll

Meskipun rebasing terlihat berhasil, kesalahan tetap ada. Kemudian saya menjalankan rebaseperintah di dalam terminal Cygwin64 dan mendapat kesalahan:

$ rebase -b 0x50000000 msys-1.0.dll
rebase: Invalid Baseaddress 0x50000000, must be > 0x200000000

Saya kemudian mencoba alamat pasangan tetapi tidak ada yang berhasil. Jadi saya akhirnya mengubah msys-1.0.dllfile dan menyelesaikan masalah.

radiohead
sumber
1

Saya mengalami ini hari ini. Dipimpin oleh jawaban Greg Hewgill, saya melihat proses yang berjalan pada sistem saya untuk melihat apakah ada sesuatu yang "macet" atau jika pengguna lain masuk ke mesin melakukan sesuatu dengan git. Saya kemudian meluncurkan cygwin (diinstal secara terpisah) pada mesin khusus ini. Diluncurkan ok. Saya menutupnya dan kemudian mencoba Git Extensions lagi (saya mencoba operasi tarikan) dan berhasil. Tidak yakin apakah peluncuran cygwin membersihkan sesuatu yang dibagikan tetapi ini adalah pertama kalinya saya mengalami kesalahan ini dan ini sepertinya memperbaikinya untuk saya.

P_O
sumber
1

Saya memiliki masalah yang sama, setelah beberapa crash dan pembaruan Windows 8.0, pada msys git 1.9. Saya tidak menemukan msys / git di jalur saya, jadi saya hanya menambahkannya di pengaturan lingkungan windows-user local. Ini bekerja tanpa memulai ulang.

Pada dasarnya, mirip dengan RobertB, tapi saya tidak punya apa git / msys di jalan saya.

Btw:

  1. Saya mencoba menggunakan rebase -b blablabla msys.dll, tetapi mengalami kesalahan "ReBaseImage (msys-1.0.dll) gagal dengan kesalahan terakhir = 6"

  2. jika Anda memerlukan ini dengan cepat dan tidak memiliki waktu debugging, saya perhatikan "Git Bash.vbs" di direktori Git berhasil memulai bash shell.

Koshmaar
sumber
Situasi yang sama bagi saya. Rebasing sebagai admin gagal. Ditambahkan c:\Program Files (x86)\Git\binke jalur dan sekarang aku emas.
Jon Crowell
1

Kesalahan ini sangat jarang terjadi pada mesin Windows saya. Saya akhirnya me-reboot mesin, dan kesalahan hilang.

IgorGanapolsky
sumber
0

Saya telah mengalami masalah ini dengan LPCEXpresso building.jika Anda memiliki C: \ MinGW \ bin di PATH. entah bagaimana saya harus menghapusnya untuk menyingkirkan masalah ini karena beberapa MinGW lain juga suka

Prashanjit Ghosh
sumber
0

Untuk memperbaiki masalah ini, saya cukup biarkan Tortoise Git menginstal pembaruannya.

Jace Browning
sumber
0

c: \ msysgit \ bin> rebase.exe -b 0x50000000 msys-1.0.dll

sebahattin çatal
sumber
0

Menghapus versi lama% USERPROFILE% \ AppData \ Local \ SourceTree \ app-xxx bekerja untuk saya. Tidak yakin bagaimana itu terhubung ke perintah ...

barbalion
sumber