Rozszerzenia Git: błąd Win32 487: Nie można zarezerwować miejsca na stercie cygwina, błąd Win32 0

342

Rozszerzenia Git: do wczoraj wszystko działało dobrze.

Ale nagle pojawia się ten błąd, gdy próbuję pobrać niektóre repozytoria 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

Dzieje się tak dla wszystkich repozytoriów, które sklonowałem. Ale mój git bash działa dobrze. Nie mam pojęcia, co się dzieje. Masz pomysł, dlaczego tak się dzieje?

Uchia Itachi
źródło
5
Cygwin jest dziwny i wykorzystuje trwałe sekcje pamięci wspólnej. Czy próbowałeś ponownie uruchomić system?
Greg Hewgill,
@GregHewgill: Nie uruchomiłem się ponownie od kilku dni. Zrobi to od razu.
Uchia Itachi,
1
@GregHewgill: Udało się. Dzięki, może jeśli opublikujesz to jako odpowiedź, będzie to pomocne również dla innych.
Uchia Itachi,
Chciałem tylko powiedzieć, że ten błąd nie jest specyficzny dla git i w złe dni cygwin zawiesi się na dowolnym pliku wykonywalnym w ten sam sposób bez wyraźnego powodu.
meneldal
1
OP, powinieneś zmienić wybraną odpowiedź na odpowiedź @ Yirkha, ponieważ rozwiązuje ona pierwotną przyczynę problemu. Może uratować niektóre bezcelowe próby przyszłych czytelników (jak mi się przydarzyło).
ysap

Odpowiedzi:

230

Cygwin korzysta z trwałych sekcji pamięci dzielonej, które mogą czasami zostać uszkodzone. Objawem tego jest to, że niektóre programy Cygwin zaczynają zawodzić, ale inne aplikacje pozostają bez zmian. Ponieważ te sekcje pamięci współużytkowanej są trwałe, często konieczne jest ponowne uruchomienie systemu , aby je usunąć, zanim problem zostanie rozwiązany.

Greg Hewgill
źródło
Na wypadek, gdyby komukolwiek to pomogło, przesunąłem bit GitExtensions w mojej ŚCIEŻCE, aby był pierwszym elementem i wydaje się, że to rozwiązało problem. (Sam git / cmd umieściłem na 2. miejscu - nie jestem pewien, czy to było jego częścią). Nieco łatwiejsze niż restartowanie lub tasowanie .dll.
jinglesthula,
6
Czy nie ma pliku wykonywalnego, który można po prostu zakończyć, aby zwolnić pamięć? Pełne ponowne uruchomienie systemu wydaje się przesadne. Odpowiedź poniżej ( stackoverflow.com/a/31970708/88409 ) wyjaśnia, na czym polega problem, i nie ma nic wspólnego z uszkodzoną pamięcią.
Triynko
379

Miałem ten sam problem. Znalazłem rozwiązanie tutaj http://jakob.engbloms.se/archives/1403

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

Dla mnie rozwiązanie było nieco inne. To było

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

Przed zmianą bazy bibliotek DLL upewnij się, że nie jest on używany:

tasklist /m msys-1.0.dll

I wykonaj kopię zapasową:

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

Jeśli polecenie rebase nie powiedzie się z czymś takim jak:

ReBaseImage (msys-1.0.dll) nie powiódł się z ostatnim błędem = 6

Musisz wykonać następujące czynności w kolejności:

  1. Skopiuj dll do innego katalogu
  2. Ponownie uruchom kopię za pomocą powyższych poleceń
  3. Zastąp oryginalny plik dll kopią.

W przypadku jakichkolwiek problemów uruchom polecenia jako Administrator

zainengineer
źródło
1
W moim przypadku I rebase.exe był w podkatalogu w katalogu / mingw, więc polecenie zakończyło się następująco: c: / msysgit / mingw / bin / rebase -b 0x50000000 msys-1.0.dll i uruchomiłem go, gdy znajduje się w c: / msysgit / bin katalog.
Robert Oschler
8
Git ten błąd ReBaseImage (msys-1.0.dll) nie powiodło się z ostatnim błędem = 6
TheJKFever
17
@ TheJKFever musisz uruchomić go w wierszu polecenia jako Administrator, ponieważ ma zamiar zmodyfikować msys-1.0.dll. Najpierw wykonaj kopię zapasową biblioteki DLL, skopiuj ją do pliku msys-1.0.dll.bak, a następnie uruchom polecenie jako Administrator. To zadziałało dla mnie.
Nikolaos Georgiou,
1
Windows 8.1 mówi mi, że nie mogę uruchomić tego pliku wykonywalnego na tym komputerze, gdy próbuję dokonać zmiany bazy
Jules GM
2
Nie mam rebase.exe na moim Win10 64 Bit Pro, ale wywołanie następującego polecenia załatwiło sprawę (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: Zainstaluj 64-bitową wersję Git dla Windows 2 .


Szczegóły techniczne

      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

Ten objaw sam w sobie nie ma nic wspólnego z bazami obrazów plików wykonywalnych, uszkodzonymi sekcjami pamięci wspólnej Cygwin, sprzecznymi wersjami bibliotek DLL itp.

To kod Cygwina, który nie przydziela ok. 5 MB dużej pamięci dla swojego sterty pod tym stałym adresem 0x68570000, podczas gdy najwyraźniej dostępna była tam tylko dziura o wielkości ok. 2,5 MB. Odpowiedni kod można zobaczyć w źródle msysgit .


Dlaczego ta część przestrzeni adresowej nie jest wolna?

Może być wiele przyczyn. W moim przypadku były to inne moduły załadowane pod adres powodujący konflikt:

Moduły procesowe w Eksploratorze procesów

Ostatni adres powinien wynosić około 0x68570000 + 5 MB = 0x68C50000, ale niektóre biblioteki DLL związane z WOW64 są ładowane od 0x68810000 w górę, co blokuje przydział.

Ilekroć istnieje wspólna biblioteka DLL, Windows ogólnie próbuje załadować ją pod tym samym adresem wirtualnym we wszystkich procesach, aby zaoszczędzić trochę przetwarzania relokacji. To tylko kwestia pecha, że te elementy systemu, ale jakoś załadowanego w konflikcie adres ten czas .


Dlaczego w twoim Git jest Cygwin?

Ponieważ Git jest bogatym pakietem składającym się z kilku poleceń niskiego poziomu i wielu przydatnych narzędzi i głównie opracowanych na systemach uniksopodobnych. Aby móc go zbudować i uruchomić bez masywnego przepisywania, potrzebuje przynajmniej częściowego środowiska uniksowego.

Aby to osiągnąć, ludzie wymyślili MinGW i MSYS - minimalny zestaw narzędzi do budowania programów w systemie Windows w sposób podobny do Uniksa. MSYS zawiera również bibliotekę współdzieloną msys-1.0.dll, która pomaga w niektórych problemach ze zgodnością między dwiema platformami w czasie wykonywania. Wiele z nich zostało zaczerpniętych od Cygwina, ponieważ ktoś już musiał rozwiązać te same problemy.

Więc to nie Cygwin, to biblioteka uruchomieniowa MinGW, która zachowuje się tutaj dziwnie.

W Cygwin ten kod faktycznie się bardzo zmienił od czasu, co jest w MSYS 1.0 - ostatnia wiadomość zatwierdzenia dla tego pliku mówi „Importuj Cygwin 1.3.4”, która pochodzi z 2001 roku!

Zarówno obecny Cygwin, jak i nowa wersja MSYS - MSYS2 - mają już inną logikę, która, mam nadzieję, jest bardziej niezawodna. To tylko stare wersje Git dla Windows, które zostały zbudowane przy użyciu starego, zepsutego systemu MSYS.


Czyste rozwiązania:

  • Zainstaluj Git dla Windows 2 - jest on zbudowany z nowym, odpowiednio utrzymanym MSYS2, a także ma wiele nowych funkcji, wiele poprawek błędów, ulepszeń bezpieczeństwa i tak dalej. Jeśli to w ogóle możliwe, zaleca się również użycie wersji 64-bitowej . Ale obejście rebase jest wykonywane automatycznie w tle dla systemów 32-bitowych, więc szanse na wystąpienie problemu powinny być również niższe.
  • Ponowne uruchomienie komputera w celu wyczyszczenia przestrzeni adresowej (ładowanie tych modułów pod innym losowym adresem) może działać, ale tak naprawdę wystarczy uaktualnić do Git dla systemu Windows 2, aby uzyskać poprawki zabezpieczeń, jeśli nic więcej.

Hacky rozwiązania:

  • Zmiana PATHmoże czasami działać, ponieważ mogą istnieć różne wersje msys-1.0.dllróżnych wersji Git lub innych aplikacji opartych na MSYS, które mogą używać innego adresu, innego rozmiaru stosu itp.
  • Ponowne uruchomienie msys-1.0.dllmoże być stratą czasu, ponieważ 1) będąc biblioteką DLL, ma już informacje o relokacji i 2) „w żadnej wersji systemu operacyjnego Windows nie ma gwarancji, że (...) biblioteka DLL zawsze będzie ładować w tej samej przestrzeni adresowej” w każdym razie ( źródło ). Jedynym sposobem, w jaki może to pomóc, jest to, że msys-1.0.dllsam ładuje się pod adres powodujący konflikt, którego następnie próbuje użyć. Najwyraźniej czasami tak jest, ponieważ właśnie tak robią faceci Git dla Windows w systemach 32-bitowych .
  • Biorąc pod uwagę powyższe ustalenia, pierwotnie plik binarny załatałem msys-1.0.dllplik binarny, aby użyć innej wartości _cygheap_starti to natychmiast rozwiązało problem.
Yirkha
źródło
1
Dziękuję za ciekawy komentarz! Okazuje się, że zostało to naprawione w taki czy inny sposób już od dłuższego czasu i wydaje się, że właściwym rozwiązaniem jest użycie Git dla Windows 2 zbudowanego na MSYS2 (a tym samym nowszego kodu Cygwin).
Yirkha,
2
Dzięki, dobrze wiedzieć. Używam wersji dołączonej do rozszerzeń git, cokolwiek to jest. Ponowne uruchomienie naprawiło to, więc zignoruję to, dopóki aktualizacja nie dotrze do mnie. :-)
Tim Abell,
3
Idealna, dobrze udokumentowana odpowiedź! I właściwe trwałe rozwiązanie problemu zamiast obecnie akceptowanej odpowiedzi.
Søren Boisen,
2
Trochę więcej szczegółów na temat problemu - github.com/git-for-windows/git/wiki/32-bit-issues
Kunal
1
x64 Git dla Windows działał dla mnie i cmder. Dziękuję Ci! Doprowadzało mnie to do szaleństwa, szczególnie podczas pracy z cmder. Zasadniczo skopiowałem folder Git x64 do cmder/vendor/git-for-windowskatalogu i zmieniłem nazwę starego folderu na git-for-windows-x86. Jeśli otworzysz cmder/vendor/git-for-windows, zobaczysz folder mingw32, który jest wskazówką, że używasz 32-bitowego. W Git x64 zobaczysz folder mingw64.
cmeza,
32

Bardzo prosta wersja rozwiązania bazowego:

Przejdź do folderu, w którym zainstalowany jest git, takiego jak:

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

Przytrzymując klawisz Shift i klikając prawym przyciskiem myszy folder, powinieneś być w stanie otworzyć wiersz polecenia jako administrator stamtąd (dzięki https://stackoverflow.com/users/355389/darren-lewis za ten komentarz),

Następnie uruchomić:

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

Naprawiłem to, gdy podejście restartu nie działało.

Mam nadzieję, że to pomoże.

Tisch
źródło
1
Pracował dla mnie. Upewnij się, że uruchomiłeś wiersz polecenia jako Administrator.
Darren Lewis
Działa to również dla mnie, jako notatka, nie wiem jak można przesunąć prawy przycisk myszy i załadować cmd.exe jako admin, więc uruchomiłem cmd.exe prawym przyciskiem myszy od początku wybierz start jako admin, a następnie cd do katalogu, następnie uruchom polecenie. Zadziałało!
edencorbin
13

Po aktualizacji do git1.8.5.2 zobaczyłem ten sam komunikat o błędzie:

Po prostu wyszukaj wszystko msys-1.0.dllna swoimC:\ dysku i spraw, aby ten używany przez Git był na pierwszym miejscu.

Na przykład w moim przypadku po prostu zmieniłem kolejność:

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

Sprawiając, że ścieżka Git C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\jest na pierwszym miejscu%PATH% , komunikat o błędzie zniknął.

Nie ma potrzeby ponownego uruchamiania ani nawet zmiany sesji DOS.
Po %PATH%zaktualizowaniu w tej sesji DOS polecenia git po prostu działają.


Pamiętaj, że zarówno Carmbrester, jak i Sixto Saez zgłaszają poniżej (w komentarzach) konieczność ponownego uruchomienia w celu rozwiązania problemu.
Uwaga: po pierwsze, również usuwając dowolny msys-1.0.dll, taki jak jeden w%LOCALAPPDATA%

VonC
źródło
1
Nigdzie indziej na mojej ścieżce nie ma pliku msys-1.0.dll, ale wygląda na to, że miałeś rację - przeniesienie części git mojej ścieżki wyżej na liście rozwiązało problem. Dziękuję za to! - jestem zmęczony ponownym uruchomieniem, aby naprawić.
Carmbrester
1
Moje „dodatkowe” pliki msys-1.0.DLL gdzie w C: \ Users \ twój login \ AppData \ Local z innej aplikacji. Usunięcie tej aplikacji i ponowne uruchomienie naprawiło dla mnie problem
Sixto Saez,
@SixtoSaez Ciekawe. Zredagowałem odpowiedź, aby zwiększyć widoczność kroku ponownego uruchomienia.
VonC
prawdopodobnie ci, którzy również potrzebowali ponownego uruchomienia, potrzebowali właśnie tego (inny problem niż nieprawidłowe ładowanie DLL)
George Birbilis,
7

Jeśli ponowne uruchomienie nie rozwiąże problemu (jak sugeruje odpowiedź Grega Hegwilla), sprawdź PATH pod kątem sprzecznych instalacji msys-1.0.dll (i ewentualnie innych powiązanych bibliotek DLL).

W mojej szczególnej sytuacji instalacja msys przez MinGW ma kopię tej biblioteki DLL w swoim binkatalogu ( <MinGW_Install_Path>\msys\1.0\bin) i została wymieniona w ŚCIEŻCE. cmdKatalog Gita był wymieniony w ŚCIEŻCE, ale binnie był. (Wersja Gys msys-1.0.dll znajduje się w binkatalogu. Najwyraźniej domyślna instalacja MSys-Git nie dodaje jej bindo PATH.)

Tymczasową poprawką było dodanie binkatalogu Gita do ŚCIEŻKI, aby pojawił się przed ścieżkami MinGW. (Trwała poprawka prawdopodobnie będzie polegać na rozwiązaniu konfliktów ścieżek między msys MinGW a Git i / lub usunięciem zduplikowanych instalacji msys.)

RobertB
źródło
Reboot nie naprawił tego dla mnie! Na ścieżce były naprawdę zduplikowane wpisy. Tks dużo.
Reginaldo Santos,
2

Chcę tylko podzielić się tutaj swoim doświadczeniem. Ten sam problem napotkałem podczas kompilacji krzyżowej dla platformy MTK na 64-bitowym komputerze z systemem Windows. MinGW i MSYS są zaangażowane w proces budowania i ten problem pojawił się. Rozwiązałem to, zmieniając msys-1.0.dllplik. Ani rebase.exeponowne uruchomienie systemu nie działało dla mnie.

Ponieważ na moim komputerze nie ma zainstalowanego programu rebase.exe. Zainstalowałem cygwin64 i wykorzystałem rebase.exewnętrze:

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

Mimo że ponowne bazowanie wydawało się udane, błąd pozostał. Następnie uruchomiłem rebasepolecenie w terminalu Cygwin64 i dostałem błąd:

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

Później spróbowałem kilka adresów, ale żaden z nich nie działał. Skończyło się na zmianie msys-1.0.dllpliku i to rozwiązało problem.

radiohead
źródło
1

Wpadłem na to dzisiaj. Kierowany odpowiedzią Grega Hewgilla, spojrzałem na uruchomione procesy w moim systemie, aby sprawdzić, czy coś się „utknęło” lub czy inni użytkownicy byli zalogowani na maszynie, robiąc cokolwiek z git. Następnie uruchomiłem cygwin (zainstalowany osobno) na tym konkretnym komputerze. Uruchomił się dobrze. Zamknąłem go, a następnie ponownie wypróbowałem rozszerzenia Git (próbowałem operacji ściągania) i zadziałało. Nie jestem pewien, czy uruchomienie cygwina wyczyściło coś, co zostało udostępnione, ale po raz pierwszy napotkałem ten błąd i wydawało mi się, że to naprawiło.

P_O
źródło
1

Miałem ten sam problem po awarii i aktualizacji systemu Windows 8.0 na msys git 1.9. Nie znalazłem żadnego msys / git na mojej ścieżce, więc właśnie dodałem go do ustawień envinroment lokalnych użytkowników Windows. Działa bez ponownego uruchamiania.

Zasadniczo, podobnie jak RobertB, ale nie miałem żadnych git / msys na mojej ścieżce.

Btw:

  1. Próbowałem użyć rebase -b blablabla msys.dll, ale miałem błąd „ReBaseImage (msys-1.0.dll) nie powiodło się z ostatnim błędem = 6”

  2. jeśli potrzebujesz tego szybko i nie masz czasu na debugowanie, zauważyłem, że „Git Bash.vbs” w katalogu Git pomyślnie uruchamia powłokę bash.

Kosmaar
źródło
Ta sama sytuacja dla mnie. Ponowne uruchomienie jako administrator nie powiodło się. Dodano c:\Program Files (x86)\Git\bindo ścieżki i teraz jestem złoty.
Jon Crowell
1

Ten błąd występuje bardzo rzadko na moim komputerze z systemem Windows. W końcu zrestartowałem komputer i błąd zniknął.

Igor Ganapolski
źródło
0

Napotkałem ten problem z budynkiem LPCEXpresso. Jeśli masz C: \ MinGW \ bin w ŚCIEŻCE. w jakiś sposób musiałem go usunąć, aby pozbyć się tego problemu, ponieważ niektóre inne oparte na MinGW również

Prashanjit Ghosh
źródło
0

Aby rozwiązać ten problem, po prostu pozwalam Tortoise Git zainstalować swoją aktualizację.

Jace Browning
źródło
0

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

sebahattin çatal
źródło
0

Usuwanie starej wersji% USERPROFILE% \ AppData \ Local \ SourceTree \ app-xxx działało dla mnie. Nie jestem pewien, jak to było połączone z git z wiersza poleceń ...

barbalion
źródło